为什么我的docker容器在Kubernetes中运行时会得到一个根组?

为什么我的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 }

我正在确保所有容器都不是以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 }' | 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可确保容器仅在预期组中运行。