Bagaimana cara me-mount volume dengan UID spesifik di Kubernetes Pod?

14

Jadi, saya mencoba menjalankan Nexus berdasarkan gambar ini di Kubernetes, tetapi gagal dengan:

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

Dari dokumentasi dikatakan bahwa proses berjalan dengan UID 200 dan volume harus dipasang dengan izin itu:

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.

Saya telah mencoba mencari melalui dokumentasi untuk menemukan cara untuk memasang volume dengan izin tersebut, namun, saya tidak dapat menemukan cara untuk melakukannya.

Apakah ada yang tahu apakah Anda dapat menentukan dalam konfigurasi untuk PVC / PV atau Deployment dengan UID apa untuk memasang volume? Jika ya, bagaimana caranya?

srkiNZ84
sumber

Jawaban:

31

Tidak ada cara untuk mengatur UIDpenggunaan definisi Pod, tetapi Kubernetes menyimpan UIDvolume yang bersumber.

Jadi, Anda dapat mengatur UIDoleh InitContainer, yang diluncurkan sebelum wadah utama, cukup tambahkan ke containersjalur Deployment:

initContainers:
- name: volume-mount-hack
  image: busybox
  command: ["sh", "-c", "chown -R 200:200 /nexus"]
  volumeMounts:
  - name: <your nexus volume>
    mountPath: /nexus
Anton Kostenko
sumber
Bagus sekali. Terima kasih atas retas ini. Menggunakannya dengan gambar Oracle DB.
Thomas Hofmann
Ini tidak membantu dengan ConfigMaps dan Rahasia.
Torsten Bronger
Ini bekerja untuk saya juga (juga dengan chmod). Saya harap seseorang (atau Kubernetes) menerapkan metode yang kurang hacky.
leeman24
Saya menggunakan sesuatu command: ["sh", "-c", "chmod 777 /nexus && chown 200:200 /nexus"]untuk memastikan folder tersebut dapat ditulisi.
Martin Tapp
6

Seperti kata Anton, meskipun kami tidak dapat mengatur UID menggunakan definisi Pod. Inilah solusi lain untuk topik ini.

Silakan merujuk ke dokumen resmi Kubernetes Mengkonfigurasi Konteks Keamanan untuk Pod atau Wadah

Definisi pod yang saya gunakan:

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

Definisi Layanan:

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

Dan kemudian membuat pod dan layanan tanpa izin apa pun ditolak atau kesalahan lain:

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

Coba masuk wadah Nexus3 dan periksa pemilik / izin / 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$

Seperti yang Anda lihat, direktori milik root: nexus, dan Anda juga dapat memeriksa file di direktori:

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

Itulah kekuatan SetGID :)

Sekarang, mari kita periksa apakah layanannya berfungsi atau tidak. Saya menggunakan minikube untuk menjalankan cluster 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

Layanan ini berfungsi seperti yang diharapkan.

chemi0213
sumber
0

Mengenai Torsten Bronger 's komentar , ketika Anda mengkonfigurasi ConfigMaps dan Rahasia dalam array volume di pod spec, Anda dapat menentukan izin untuk memungkinkan akses yang ingin menggunakan defaultModeproperti, sehingga saat Anda tidak bisa set kelompok dan pengguna kepemilikan, Anda dapat memungkinkan proses di pod untuk membaca file di mount tersebut. Menulis ke peta rahasia atau konfigurasi tidak benar-benar masuk akal dan mode izin defaultnya adalah 755 jadi membaca seharusnya tidak menjadi masalah bagi pengguna mana pun.

David Dooling
sumber