为什么我的docker容器在Kubernetes中运行时会得到一个根组?
我正在确保所有容器都不是以root身份运行。不过,我在群组访问方面遇到了一些问题。在短版本中,当我构建一个容器并在本地运行它时,我会得到以下结果:为什么我的docker容器在Kubernetes中运行时会得到一个根组?,docker,kubernetes,Docker,Kubernetes,我正在确保所有容器都不是以root身份运行。不过,我在群组访问方面遇到了一些问题。在短版本中,当我构建一个容器并在本地运行它时,我会得到以下结果: docker run -it --entrypoint /bin/sh f83823c8ee6c ~ $ id uid=1000(metadata) gid=1000(metadata) kubectl -n kube-system get pods -l app=metadata | grep -v NAME | awk '{print $1 }
docker run -it --entrypoint /bin/sh f83823c8ee6c
~ $ id
uid=1000(metadata) gid=1000(metadata)
kubectl -n kube-system get pods -l app=metadata | grep -v NAME | awk '{print $1 }' | xargs -I {} kubectl -n kube-system exec {} -- id
uid=1000(metadata) gid=1000(metadata) groups=0(root),1000(metadata)
kubectl -n kube-system get deployment metadata -o=json | jq .spec.template.spec.securityContext
{
"fsGroup": 1000,
"runAsGroup": 1000,
"runAsNonRoot": true,
"runAsUser": 1000
}
但是,当我在kubernetes集群中运行相同的容器时,我得到以下结果:
docker run -it --entrypoint /bin/sh f83823c8ee6c
~ $ id
uid=1000(metadata) gid=1000(metadata)
kubectl -n kube-system get pods -l app=metadata | grep -v NAME | awk '{print $1 }' | xargs -I {} kubectl -n kube-system exec {} -- id
uid=1000(metadata) gid=1000(metadata) groups=0(root),1000(metadata)
kubectl -n kube-system get deployment metadata -o=json | jq .spec.template.spec.securityContext
{
"fsGroup": 1000,
"runAsGroup": 1000,
"runAsNonRoot": true,
"runAsUser": 1000
}
在集群中运行时,容器被分配了多个组,这一事实与我以及我试图解决的问题有关。在k8s集群中运行和直接使用docker运行时,我期望得到相同的输出
有关我们的部署和配置的一些额外背景信息。。。此容器生成时使用的Dockerfile:
# build stage
FROM golang:1.13-alpine AS build-env
RUN apk add --no-cache --update alpine-sdk curl
ENV REPO_PATH=**redacted**
COPY . $REPO_PATH
WORKDIR $REPO_PATH
RUN curl https://raw.githubusercontent.com/golang/dep/master/install.sh | sh
RUN make dep
RUN make build
# final stage
FROM alpine:3.7
WORKDIR /app
COPY --from=build-env **redacted**/bin/server /app/
RUN apk add --no-cache --update ca-certificates && \
addgroup -g 1000 metadata && \
adduser -D -g "metadata user" -H -h "/app" -G "metadata" -u 1000 metadata && \
chown -R metadata:metadata /app
USER 1000:1000
ENTRYPOINT /app/server
我们的kubernetes版本是1.15.6,我知道RunAsGroup需要一个功能门,我们的运行控制器选项(我们运行自己的集群,不使用云提供商管理的选项之一):
部署包含以下内容:
docker run -it --entrypoint /bin/sh f83823c8ee6c
~ $ id
uid=1000(metadata) gid=1000(metadata)
kubectl -n kube-system get pods -l app=metadata | grep -v NAME | awk '{print $1 }' | xargs -I {} kubectl -n kube-system exec {} -- id
uid=1000(metadata) gid=1000(metadata) groups=0(root),1000(metadata)
kubectl -n kube-system get deployment metadata -o=json | jq .spec.template.spec.securityContext
{
"fsGroup": 1000,
"runAsGroup": 1000,
"runAsNonRoot": true,
"runAsUser": 1000
}
您可以在SecurityContext部分下提供补充组
securityContext: {
"supplementalGroups": [1000]
}
非常感谢。我试着把这个列为一个空列表,但它没有做任何事情,我认为不需要营养小组。指定主GID可确保容器仅在预期组中运行。