Kubernetes: как установить группы пользователей и учетные записи пользователей VolumeMount
Я запускаю кластер Kubernetes на AWS, используя kops. Я подключил том EBS к контейнеру, и он виден из моего приложения, но он читается только потому, что мое приложение не запускается с правами root. Как смонтировать PersistentVolumeClaim
как пользователь, отличный от root? VolumeMount
, похоже, не имеет никаких параметров для управления правами пользователя, группы или файлов установленного пути.
Вот мой файл yaml развертывания:
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: notebook-1
spec:
replicas: 1
template:
metadata:
labels:
app: notebook-1
spec:
volumes:
- name: notebook-1
persistentVolumeClaim:
claimName: notebook-1
containers:
- name: notebook-1
image: jupyter/base-notebook
ports:
- containerPort: 8888
volumeMounts:
- mountPath: "/home/jovyan/work"
name: notebook-1
Ответы
Ответ 1
Контекст безопасности Pod поддерживает настройку fsGroup
, которая позволяет вам установить идентификатор группы, которой принадлежит том, и, следовательно, кто может писать в него. Пример в документации:
apiVersion: v1
kind: Pod
metadata:
name: hello-world
spec:
containers:
# specification of the pod containers
# ...
securityContext:
fsGroup: 1234
Подробнее об этом здесь here
Ответ 2
В итоге я получил initContainer
с тем же значением volumeMount, что и основным контейнером, для установки в моем случае надлежащих разрешений для пользовательского изображения Grafana.
initContainers:
- name: take-data-dir-ownership
image: alpine:3.6
# Give 'grafana' user (id 472) permissions a mounted volume
# https://github.com/grafana/grafana-docker/blob/master/Dockerfile
command:
- chown
- -R
- 472:472
- /var/lib/grafana
volumeMounts:
- name: data
mountPath: /var/lib/grafana
Это необходимо, когда основной образ в модуле работает от имени пользователя, отличного от пользователя root, и требует разрешения на запись на подключенном томе.
Ответ 3
Для k8s версии 1. 10+, fsGroup
был заменен на runAsGroup
.
Реализация может быть отслежена здесь: https://github.com/kubernetes/features/issues/213
Ответ 4
Это стало одной из проблем для развертываний/наборов состояний Kubernetes, когда вам нужно запускать процесс внутри контейнера от имени пользователя без полномочий root. Но когда вы монтируете том в модуль, он всегда монтируется с разрешения root: root. Таким образом, пользователь без полномочий root должен иметь доступ к папке, в которую он хочет читать и записывать данные.
Пожалуйста, следуйте приведенным ниже инструкциям для того же самого.
- Создайте группу пользователей и назначьте groudID в Dockerfile.
- Создайте пользователя с идентификатором пользователя и добавьте его в группу в Dockerfile.
- рекурсивно меняйте владельца для папок, которые пользовательский процесс хочет читать/записывать.
Добавьте следующие строки в развертывание /Statefulset в контексте спецификации модуля.
spec:
securityContext:
runAsUser: 1099
runAsGroup: 1099
fsGroup: 1099
RunAsUser
указывает, что для любых контейнеров в модуле все процессы выполняются с идентификатором пользователя 1099
RunAsGroup
задает идентификатор первичной группы 1099 для всех процессов в любых контейнерах модуля. (Если это поле опущено, то идентификатор первичной группы контейнеров будет корневым (0), любые созданные файлы также будут принадлежать пользователю 1099 и группе 1099 когда указана runAsGroup)
fsGroup
указывает, что владелец любого подключенного тома будет владельцем GroupId 1099, и любые файлы, созданные в нем, будут иметь разрешение nonrootgroup:nonrootgroup
.
Ответ 5
Чтобы изменить разрешение файловой системы, запустите initcontainer
до фактического запуска контейнера
вот пример для упругого поискового модуля
initContainers:
- command:
- sh
- -c
- chown -R 1000:1000 /usr/share/elasticsearch/data
- sysctl -w vm.max_map_count=262144
- chgrp 1000 /usr/share/elasticsearch/data
image: busybox:1.29.2
imagePullPolicy: IfNotPresent
name: set-dir-owner
resources: {}
securityContext:
privileged: true
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts: #Volume mount path
- mountPath: /usr/share/elasticsearch/data
name: elasticsearch-data
Чтобы изменить группу пользователей в контейнере
spec:
containers:
securityContext:
privileged: true
runAsUser: 1000