Comment monter un volume avec un UID spécifique dans Kubernetes Pod?

14

Donc, j'essaie de faire fonctionner Nexus à partir de cette image dans Kubernetes, mais cela échoue avec:

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

D'après la documentation, il est indiqué que le processus s'exécute avec l'UID 200 et que le volume doit être monté avec ces autorisations:

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.

J'ai essayé de parcourir la documentation pour trouver un moyen de monter le volume avec ces autorisations, mais je n'ai trouvé aucun moyen de le faire.

Est-ce que quelqu'un sait si vous pouvez spécifier dans la configuration pour le PVC / PV ou le déploiement avec quel UID pour monter le volume? Si c'est le cas, comment?

srkiNZ84
la source

Réponses:

31

Il n'y a aucun moyen de définir l' UIDutilisation de la définition de Pod, mais Kubernetes enregistre le UIDvolume d'origine.

Ainsi, vous pouvez définir le UIDby InitContainer, qui se lance avant le conteneur principal, ajoutez-le simplement au containerschemin du 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
la source
Fonctionne très bien. Merci pour ce hack. L'utiliser avec l'image Oracle DB.
Thomas Hofmann
Cela n'aide cependant pas avec ConfigMaps et Secrets.
Torsten Bronger
Cela a également fonctionné pour moi (également avec chmod). J'espère que quelqu'un (ou Kubernetes) implémentera une méthode moins hacky.
leeman24
J'utilise quelque chose comme command: ["sh", "-c", "chmod 777 /nexus && chown 200:200 /nexus"]pour m'assurer que le dossier est accessible en écriture.
Martin Tapp
Mais la question est, comment pouvons-nous connaître l'UID du processus dans le conteneur principal? Cela pourrait être autre chose que 200, non?
Nawaz Il y a
7

Comme Anton l'a dit, bien que nous ne puissions pas définir l'UID en utilisant la définition de Pod. Voici une autre solution de contournement pour ce sujet.

Veuillez vous référer au document officiel de Kubernetes Configurer un contexte de sécurité pour un pod ou un conteneur

La définition de pod que j'ai utilisée:

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

La définition du service:

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

Et puis créez un pod et un service sans autorisation refusée ou autres erreurs:

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

Essayez de vous connecter au conteneur Nexus3 et vérifiez le propriétaire / l'autorisation de / 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$

Comme vous pouvez le voir, le répertoire appartient à root: nexus, et vous pouvez également vérifier les fichiers dans le répertoire:

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

C'est la puissance de SetGID :)

Vérifions maintenant que le service fonctionne ou non. J'utilise minikube pour exécuter un 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

Le service fonctionne comme prévu.

chemi0213
la source
0

En ce qui concerne le commentaire de Torsten Bronger , lorsque vous configurez ConfigMaps et Secrets dans le tableau des volumes dans la spécification de pod, vous pouvez spécifier les autorisations pour autoriser l'accès que vous souhaitez utiliser à l'aide de la defaultModepropriété, donc même si vous ne pouvez pas définir la propriété du groupe et de l'utilisateur, vous peut permettre aux processus du pod de lire les fichiers de ces montages. L'écriture sur une carte secrète ou de configuration n'a pas vraiment de sens et le mode d'autorisation par défaut est 755 de toute façon, donc la lecture ne devrait pas être un problème pour tout utilisateur.

David Dooling
la source