Wie kann ich ein Volume mit einer bestimmten UID im Kubernetes Pod mounten?

14

Ich versuche, Nexus basierend auf diesem Image in Kubernetes zum Laufen zu bringen , aber es schlägt fehl mit:

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

Aus der Dokumentation geht hervor, dass der Prozess mit der UID 200 ausgeführt wird und das Volume mit den folgenden Berechtigungen bereitgestellt werden muss:

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.

Ich habe versucht, in der Dokumentation nach einer Möglichkeit zu suchen, das Volume mit diesen Berechtigungen bereitzustellen. Ich konnte jedoch keine Möglichkeit finden, dies zu tun.

Weiß jemand, ob Sie in der Konfiguration für die PVC / PV oder die Bereitstellung angeben können, mit welcher UID das Volume gemountet werden soll? Wenn das so ist, wie?

srkiNZ84
quelle

Antworten:

31

Es gibt keine Möglichkeit, die UIDVerwendung der Definition von Podfestzulegen, aber Kubernetes speichert das UIDvon der Quelle bezogene Volumen.

So können Sie das einstellen UID durch InitContainer, die Kutter vor dem Hauptbehälter, fügen Sie ihn einfach auf den containersPfad der 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
quelle
Funktioniert super. Danke für diesen Hack. Verwendung mit Oracle DB-Image.
Thomas Hofmann
Dies hilft jedoch nicht bei ConfigMaps und Secrets.
Torsten Bronger
Das hat auch bei mir geklappt (auch mit chmod). Ich hoffe jemand (oder Kubernetes) implementiert eine weniger hackige Methode.
Leeman24
Ich verwende so etwas wie, command: ["sh", "-c", "chmod 777 /nexus && chown 200:200 /nexus"]um sicherzustellen, dass der Ordner beschreibbar ist.
Martin Tapp
5

Wie Anton sagte, obwohl wir die UID nicht mit der Definition von Pod einstellen können. Hier kommt eine weitere Problemumgehung für dieses Thema.

Bitte beziehen Sie sich auf das offizielle Dokument von Kubernetes Informationen finden Konfigurieren Sie einen Sicherheitskontext für einen Pod oder Container

Die Pod-Definition, die ich verwendet habe:

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

Die Service-Definition:

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

Erstellen Sie anschließend einen Pod und einen Service ohne abgelehnte Erlaubnis oder andere Fehler:

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

Versuchen Sie, sich im Nexus3-Container anzumelden und überprüfen Sie den Eigentümer / die Erlaubnis von / 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$

Wie Sie sehen, gehört das Verzeichnis zu root: nexus, und Sie können auch die Dateien im Verzeichnis überprüfen:

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

Das ist die Kraft von SetGID :)

Lassen Sie uns nun überprüfen, ob der Dienst funktioniert oder nicht. Ich verwende minikube, um ein kubernetes Cluster auszuführen:

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

Der Service funktioniert wie erwartet.

chemi0213
quelle
0

In Bezug auf Torsten Bronger ‚s Kommentar , wenn Sie ConfigMaps und Geheimnisse im Volumen Array in der Schote spec konfigurieren, können Sie die Berechtigungen festlegen , den Zugriff Sie wollen , damit mit defaultModeEigentum, also , während Sie nicht Set Gruppen- und Benutzer Eigentum können Sie Mit dieser Option können Prozesse im Pod Dateien in diesen Bereitstellungen lesen. Das Schreiben in eine geheime oder Konfigurations-Map ist nicht wirklich sinnvoll und der Standard-Berechtigungsmodus ist ohnehin 755, so dass das Lesen für keinen Benutzer ein Problem sein sollte.

David Dooling
quelle