Я проверяю, что все наши контейнеры не работают как 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
}