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, и требует разрешения на запись на подключенном томе.

Ответ 4

Это стало одной из проблем для развертываний/наборов состояний Kubernetes, когда вам нужно запускать процесс внутри контейнера от имени пользователя без полномочий root. Но когда вы монтируете том в модуль, он всегда монтируется с разрешения root: root. Таким образом, пользователь без полномочий root должен иметь доступ к папке, в которую он хочет читать и записывать данные.

Пожалуйста, следуйте приведенным ниже инструкциям для того же самого.

  1. Создайте группу пользователей и назначьте groudID в Dockerfile.
  2. Создайте пользователя с идентификатором пользователя и добавьте его в группу в Dockerfile.
  3. рекурсивно меняйте владельца для папок, которые пользовательский процесс хочет читать/записывать.
  4. Добавьте следующие строки в развертывание /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