Изменение владельца файла по умолчанию и владельца группы файлов секретов kubernetes, смонтированных на проектируемых томах

Я новичок в K8S. У меня есть файл yaml, который генерирует секреты kubernetes, смонтированные на проецируемых томах. После выполнения я обнаружил, что секретные файлы (упакованные с секретами) показывают "root" как владельца файла и владельца группы. Я хочу изменить владельца файла и владельца группы на одного и того же конкретного пользователя (скажем, 450).

Я попытался использовать "chown" из контейнера init (пробовал, но не получилось), но я получил сообщение об ошибке "Файловая система только для чтения" и не смог изменить владельца файла и группы. Я не хочу использовать "fsGroup" под securitycontext. Я заметил, что опция "mode:" в "items" ведет себя непредсказуемым образом при использовании fsGroup.

Есть ли способ изменить владельца файла по умолчанию и владельца группы секретных файлов kubernetes, которые монтируются через проецируемые тома?

Я предоставляю пример кода ниже. Предположим, я хочу изменить владельца файла и группы файла "password" (в разделе "mysecret2") в следующем примере. как этого добиться?

apiVersion: v1
kind: Pod
metadata:
  name: volume-test
spec:
  containers:
  - name: container-test
    image: busybox
    volumeMounts:
    - name: all-in-one
      mountPath: "/projected-volume"
      readOnly: true
  volumes:
  - name: all-in-one
    projected:
      sources:
      - secret:
          name: mysecret
          items:
            - key: username
              path: username
      - secret:
          name: mysecret2
          items:
            - key: password
              path: password
              mode: 511

1 ответ

Насколько я знаю, нет способа изменить UID владельца для секретов.

Обходной путь - скопировать секрет в обычный файл, а затем изменить его владельца и режим, например:

apiVersion: v1
kind: Pod
metadata:
  name: volume-test
spec:
  containers:
  - name: container-test
    image: busybox
    command: |
      - "/bin/bash"
      - "-exc"
        cp /etc/secrets-mount/*_pgpass /etc/secrets
        chown my-user /etc/*_pgpass
        chmod 600 /etc/*_pgpass
        exec su-exec my-user /entrypoint.sh
    volumeMounts:
    - name: secrets
      mountPath: /etc/secrets-mount/

....

Как сказал Алексей, в настоящее время это невозможно, пока не будет завершена работа с github.com/kubernetes/kubernetes/issues/81089.

Его решение работает отлично, если у вас нет securityContraint.runAsNonRoot set, и в этом случае контейнер не будет иметь прав на секрет.

В моем случае мне пришлось сделать следующее:

apiVersion: apps/v1
kind: Deployment
spec:
  template:
    spec:
      ##########################################
      #         Volumes definitions
      volumes:
      - name: key-volume
        emptyDir:
          sizeLimit: "8k"
      - name: root-owned-key-volume
        secret:
          secretName: my-secret
          items:
            - key: a_key_file
              path: a_key_file
              mode: 0600
      ##########################################
      #         initContainers definitions
      initContainers:
        - name: set-key-ownership
          image: alpine:3.6
          command: ["sh", "-c", "cp /root-key/* /key && chown -R 33:33 /key"]
          volumeMounts:
          - mountPath: /key
            name: key-volume
          - mountPath: /root-key
            name: root-owned-key-volume
      ##########################################
      #         Containers definitions
      containers:
      - name: my-main-container
        (...)
        securityContext:
          runAsNonRoot: true
          runAsUser: 33
        (...)
        volumeMounts:
        - mountPath: /key
          name: key-volume

В основном, зная, что невозможно изменить владельца секретного файла, initContainer скопирует его в другую временную папку и изменит владельца этого нового файла.

Грубо, но, по крайней мере, работает.

Другие вопросы по тегам