Заставить git работать в контейнере kubernetes при использовании RunAsUser

#kubernetes #security-context

#kubernetes #безопасность-контекст

Вопрос:

Я хотел бы работать git как часть initContainer модуля Kubernetes. Я бы также хотел, чтобы контейнеры запускались от имени произвольного пользователя, не являющегося пользователем root. Есть ли какой-нибудь способ добиться этого?

Проблема в том, что если я включу что-то подобное в описание модуля:

 securityContext:
  runAsUser: 1234
  

Тогда git произойдет сбой, подобный этому:

 No user exists for uid 1234
fatal: Could not read from remote repository.
  

Ошибка возникает из ssh . Очевидный обходной путь — клонировать через https:// URL, а не использовать ssh , но я полагаюсь на ключ развертывания для доступа только для чтения к удаленному репозиторию.

Я не могу вставить пользователя в изображение, потому что я не знаю, каким будет идентификатор пользователя до времени выполнения.

Я не могу добавить пользователя /etc/passwd во время выполнения, потому что контейнер запущен как некорневой пользователь.

Как другие люди справляются с такой ситуацией?

На случай, если кто-то спросит:

 $ kubectl version
Server Version: version.Info{Major:"1", Minor:"18", GitVersion:"v1.18.9 k3s1", GitCommit:"630bebf94b9dce6b8cd3d402644ed023b3af8f90", GitTreeState:"clean", BuildDate:"2020-09-17T19:05:07Z", GoVersion:"go1.13.15", Compiler:"gc", Platform:"linux/amd64"}
  

Ответ №1:

Вы можете использовать SecurityContext на уровне контейнера вместо уровня pod.

 apiVersion: v1
kind: Pod
metadata:
  name: security-context-demo
spec:
  securityContext:
    runAsUser: 1000
  initContainers:
  - name: sec-ctx-in-init
    image: busybox
    securityContext:
      runAsUser: 2000
    command: ['sh', '-c', 'id']
  containers:
  - name: sec-ctx-in-container
    image: gcr.io/google-samples/node-hello:1.0
    securityContext:
      runAsUser: 3000
      allowPrivilegeEscalation: false
  

После создания модуля (я использую katacoda) вы можете запустить:

 master $ kubectl logs security-context-demo -c sec-ctx-in-init
uid=2000 gid=0(root)
master $ kubectl exec -it security-context-demo -c sec-ctx-in-container -- id
uid=3000 gid=0(root) groups=0(root)
  

Обратите внимание: если вы фактически обмениваетесь файлами между container и initcontainer, вам необходимо указать то же fsGroup самое на уровне модуля securitycontext.