docker - 为什么我的 docker 容器在 Kubernetes 中运行时会获得根组?
问题描述
我正在确保我们所有的容器都没有以 root 身份运行。我在使用群组访问时遇到了一些麻烦。简短的版本,当我构建一个容器并在本地运行它时,我得到以下信息:
docker run -it --entrypoint /bin/sh f83823c8ee6c
~ $ id
uid=1000(metadata) gid=1000(metadata)
但是,当我在我们的 kubernetes 集群中运行同一个容器时,我得到以下信息:
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)
在集群中运行时容器被分配多个组的事实与我和我想要解决的问题有关。在 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 需要一个功能门,我们正在运行的控制器选项(我们推出自己的集群,不使用云提供商管理的选项之一):
kubectl -n kube-system get pods -l=k8s-app=kube-controller-manager | tail -1 | awk ' { print $1 }' | xargs -I {} kubectl -n kube-system get pod {} -o=json | jq '.spec.containers[].command'
[
"/hyperkube",
"kube-controller-manager",
"--log-dir=/var/log/kube-controller",
"--logtostderr=false",
"--cluster-cidr=172.16.0.0/16",
"--allocate-node-cidrs=false",
"--authentication-kubeconfig=/srv/kubernetes/controller/kubeconfig",
"--authorization-kubeconfig=/srv/kubernetes/controller/kubeconfig",
"--cloud-provider=aws",
"--feature-gates=CustomResourceSubresources=true",
"--feature-gates=ExpandInUsePersistentVolumes=true",
"--feature-gates=ExpandPersistentVolumes=true",
"--feature-gates=TaintNodesByCondition=true",
"--feature-gates=TTLAfterFinished=true",
"--feature-gates=RunAsGroup=true",
"--kubeconfig=/srv/kubernetes/controller/kubeconfig",
"--root-ca-file=/srv/kubernetes/ca.crt",
"--service-account-private-key-file=/srv/kubernetes/signing.key",
"--use-service-account-credentials=true"
]
部署包含以下内容:
kubectl -n kube-system get deployment metadata -o=json | jq .spec.template.spec.securityContext
{
"fsGroup": 1000,
"runAsGroup": 1000,
"runAsNonRoot": true,
"runAsUser": 1000
}
解决方案
您可以在 securityContexts 部分下提供补充组。
securityContext: {
"supplementalGroups": [1000]
}
推荐阅读
- flutter - 错误:“RequestCallBack”类型不是“FirebaseUser”类型的子类型
- javascript - 根据时间值重新排列数组
- mysql - 如何从 Node 容器访问外部数据库?
- azure-table-storage - 无法在 Azure 存储资源管理器中加载存储表
- html - 如何使用 Git Bash 命令提示符打开 Sublime 文本
- c++ - 在 C++ 中使用模板类型名调用函数的段错误
- pandas - 大熊猫中每个时隙的填充值增加
- c# - System.ArgumentException: '找不到所需的 ID 识别功能。参数名称:文化'
- health-monitoring - 仪表板 F5 数据下载
- java - 为什么 CollapsingToolbarLayout 中工具栏标题的字体和颜色没有变化?