#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.