Як змонтувати гучність за допомогою конкретного UID у Kubernetes Pod?


14

Отже, я намагаюся запустити Nexus на основі цього зображення в Kubernetes, але це не вдається:

mkdir: cannot create directory '../sonatype-work/nexus3/log': Permission denied
mkdir: cannot create directory '../sonatype-work/nexus3/tmp': Permission denied
Java HotSpot(TM) 64-Bit Server VM warning: Cannot open file ../sonatype-work/nexus3/log/jvm.log due to No such file or directory

З документації сказано, що процес запускається з UID 200, і об'єм повинен бути встановлений з такими дозволами:

A persistent directory, /nexus-data, is used for configuration,
logs, and storage. This directory needs to be writable by the Nexus
process, which runs as UID 200.

Я намагався шукати документацію, щоб знайти спосіб встановити гучність з цими дозволами, однак я не міг знайти жодного способу це зробити.

Хтось знає, чи можете ви вказати в конфігурації для ПВХ / ПВ або розгортання, з яким UID встановити гучність? Якщо так, то як?

Відповіді:


31

Немає способу встановити UIDвикористання визначення Pod, але Kubernetes економить UIDджерело, отримане.

Отже, ви можете встановити значення UIDby InitContainer, яке запускається перед головним контейнером, просто додати його до containersконтуру Deployment:

initContainers:
- name: volume-mount-hack
  image: busybox
  command: ["sh", "-c", "chown -R 200:200 /nexus"]
  volumeMounts:
  - name: <your nexus volume>
    mountPath: /nexus

Чудово працює. Дякую за цей злом. Використовуючи його з зображенням DB Oracle.
Томас Гофманн

Однак це не допомагає ConfigMaps та Secrets.
Торстен Бронгер

Це працювало і для мене (також з chmod). Я сподіваюся, що хтось (або Кубернетес) реалізує менш хакітний метод.
leeman24

Я використовую щось на кшталт того, command: ["sh", "-c", "chmod 777 /nexus && chown 200:200 /nexus"]щоб переконатися, що папка може бути записана.
Мартін Тапп

Але питання полягає в тому, як ми можемо знати UID процесу в основному контейнері? Це може бути що завгодно, крім 200, так чи не так?
Наваз

7

Як сказав Антон, хоча ми не можемо встановити UID, використовуючи визначення Pod. Ось ще одне вирішення цієї теми.

Будь ласка, зверніться до офіційного документа Kubernetes Налаштування контексту безпеки для Pod або Container

Визначення стручка, яке я використав:

apiVersion: v1
kind: Pod
metadata:
  name: nexus3
  labels:
    app: nexus3
spec:
  securityContext:
    fsGroup: 200
  volumes:
  - name: nexus-data-vol
    emptyDir: {}
  containers:
  - name: nexus3-container
    image: sonatype/nexus3
    volumeMounts:
    - name: nexus-data-vol
      mountPath: /nexus-data

Визначення Служби:

apiVersion: v1
kind: Service
metadata:
  name: nexus3-service
spec:
  type: NodePort
  ports:
  - port: 8081
    nodePort: 30390
    protocol: TCP
    targetPort: 8081
  selector:
    app: nexus3

А потім створити струк і сервіс без будь-якого відхилення дозволу чи інших помилок:

# kubectl create -f nexus3.yaml
# kubectl create -f nexus3-svc.yaml

Спробуйте увійти в контейнер Nexus3 і перевірити власника / дозвіл / nexus-data:

# kubectl exec -it nexus3 -- sh
sh-4.2$ ls -ld /nexus-data/
drwxrwsrwx 16 root nexus 4096 Mar 13 09:00 /nexus-data/
sh-4.2$

Як бачите, каталог належить до root: nexus, а також ви можете перевірити файли в каталозі:

sh-4.2$ cd /nexus-data/
sh-4.2$ ls -l
total 72
drwxr-sr-x   3 nexus nexus  4096 Mar 13 09:00 blobs
drwxr-sr-x 269 nexus nexus 12288 Mar 13 08:59 cache
drwxr-sr-x   8 nexus nexus  4096 Mar 13 09:00 db
drwxr-sr-x   3 nexus nexus  4096 Mar 13 09:00 elasticsearch
drwxr-sr-x   3 nexus nexus  4096 Mar 13 08:59 etc
drwxr-sr-x   2 nexus nexus  4096 Mar 13 08:59 generated-bundles
drwxr-sr-x   2 nexus nexus  4096 Mar 13 08:59 instances
drwxr-sr-x   3 nexus nexus  4096 Mar 13 08:59 javaprefs
drwxr-sr-x   2 nexus nexus  4096 Mar 13 08:59 kar
drwxr-sr-x   3 nexus nexus  4096 Mar 13 08:59 keystores
-rw-r--r--   1 nexus nexus     8 Mar 13 08:59 lock
drwxr-sr-x   2 nexus nexus  4096 Mar 13 09:00 log
drwxr-sr-x   2 nexus nexus  4096 Mar 13 08:59 orient
-rw-r--r--   1 nexus nexus     5 Mar 13 08:59 port
drwxr-sr-x   2 nexus nexus  4096 Mar 13 08:59 restore-from-backup
drwxr-sr-x   7 nexus nexus  4096 Mar 13 09:00 tmp
sh-4.2$ touch test-file
sh-4.2$ ls -l test-file
-rw-r--r-- 1 nexus nexus 0 Mar 13 09:13 test-file
sh-4.2$ mkdir test-dir
sh-4.2$ ls -l test-dir
total 0
sh-4.2$ ls -ld test-dir
drwxr-sr-x 2 nexus nexus 4096 Mar 13 09:13 test-dir

Це сила SetGID :)

Тепер перевіримо, чи працює служба чи ні. Я використовую minikube для запуску кластеру kubernetes:

chris@XPS-13-9350 ~ $ minikube service nexus3-service --url
http://192.168.39.95:30390
chris@XPS-13-9350 ~ $ curl -u admin:admin123 http://192.168.39.95:30390/service/metrics/ping
pong

Служба працює як очікувалося.


0

Що стосується Торстен Bronger «s коментар , коли ви налаштувати ConfigMaps і секрети в масиві томів в стручок специфікації, ви можете вказати дозволу для забезпечення доступу ви хочете , використовуючи defaultModeвластивість, так що поки ви не можете встановити групу і користувач власності, вам може дозволити процесам у стручку читати файли в цих кріпленнях. Запис на секретну або конфігураційну карту насправді не має сенсу, а режим дозволу за замовчуванням все одно становить 755, тому читання не повинно бути проблемою для жодного користувача.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.