Donc, j'essaie de faire fonctionner Nexus à partir de l'image this 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?
Il n'y a aucun moyen de définir le UID
en utilisant la définition de Pod
, mais Kubernetes enregistre le UID
du volume source.
Ainsi, vous pouvez définir le UID
par InitContainer
, qui se lance avant le conteneur principal, il suffit de l'ajouter au chemin containers
du Deployment
:
initContainers:
- name: volume-mount-hack
image: busybox
command: ["sh", "-c", "chown -R 200:200 /nexus"]
volumeMounts:
- name: <your nexus volume>
mountPath: /nexus
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 aucune 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.
Concernant Torsten Bronger 's comment , 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 souhaité à l'aide du defaultMode
, donc bien que vous ne puissiez pas définir la propriété du groupe et de l'utilisateur, vous pouvez autoriser les processus du module à lire les fichiers de ces montages. Écrire sur une carte secrète ou config 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 n'importe quel utilisateur.