Не удается записать файл. Том смонтирован как root

#kubernetes #kubernetes-pvc

#kubernetes #kubernetes-pvc

Вопрос:

Я запускаю модуль (используется пользователем, не являющимся Root), которому необходимо записать данные на том. Том поступает из PVC.

Определение pod простое

 kind: Pod
apiVersion: v1
metadata:
  name: task-pv-pod
spec:
  volumes:
    - name: task-pv-storage
      persistentVolumeClaim:
       claimName: test-pvc
  containers:
    - name: task-pv-container
      image: jnlp/jenkins-slave:latest
      command: ["/bin/bash"]
      args: ["-c", "sleep 500"]
      ports:
        - containerPort: 80
          name: "http-server"
      volumeMounts:
        - mountPath: "/usr/share/nginx/html"
          name: task-pv-storage
  

Когда я exec вхожу в модуль и пытаюсь записать в /usr/share/nginx/html

Я получаю

 jenkins@task-pv-pod:/usr/share/nginx/html$ touch test
touch: cannot touch ‘test’: Permission denied
  

Смотрим на разрешения каталога

 jenkins@task-pv-pod:~$ ls -ld /usr/share/nginx/html
drwxr-xr-x 3 root root 4096 Mar 29 15:52 /usr/share/nginx/html
  

Понятно, что ТОЛЬКО пользователь root может записывать в /usr/share/nginx/html но это не то, что я хочу.

Есть ли способ изменить разрешения для смонтированных томов?

Ответ №1:

Вы можете рассмотреть возможность использования initContainer для монтирования вашего тома и изменения разрешений. initContainer будет запущен до запуска основного контейнера (ов). Обычным шаблоном для такого использования является наличие образа busybox (~ 22 МБ) для монтирования тома и запуска chown или chmod в каталоге. При запуске основного контейнера вашего модуля тома будут иметь правильные права владения / доступа.

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

Надеюсь, это поможет!

Ответ №2:

Контекст безопасности определяет настройки привилегий и контроля доступа для модуля или контейнера. Просто попробуйте SecurityContext:

 kind: Pod
apiVersion: v1
metadata:
  name: task-pv-pod
spec:
  securityContext:
    fsGroup: $jenkins_uid
  volumes:
    - name: task-pv-storage
      persistentVolumeClaim:
       claimName: test-pvc
...
  

Комментарии:

1. Просто используйте то же самое fsGroup для securityContext под spec и securityContext под вашим контейнером. Тогда у вас должен быть доступ на запись.