Почему мой контейнер docker получает группу root при работе в Kubernetes? - PullRequest
0 голосов
/ 16 февраля 2020

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

1 Ответ

0 голосов
/ 16 февраля 2020

Вы можете предоставить дополнительные группы в разделе securityContexts.

 securityContext: {
    "supplementalGroups": [1000]
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...