Volumes - Au-delà des ConfigMaps et Secrets#
Lorsque vous avez monté des ConfigMaps et des Secrets dans vos Pods, vous avez utilisé le mécanisme de “volumes”. Ils peuvent aussi être utilisés pour gérer la persistance des données
Volumes : intérêt ?
Dans un conteneur, tout ce qui est écrit sur le système de fichiers est éphémère : si le conteneur redémarre, les données sont perdues. Les volumes résolvent ce problème en permettant de :
Persister des données au-delà du cycle de vie d’un conteneur
Injecter des fichiers de configuration (comme vous l’avez fait avec ConfigMap et Secret)
Les volumes que vous connaissez déjà#
Vous avez déjà utilisé deux types de volumes sans le savoir :
Volume de type configMap ou secret#
volumes:
- name: config-volume
configMap:
name: my-app-config
Ce type de volume monte les données d’un ConfigMap ou d’un Secret sous forme de fichiers dans le conteneur.
D’autres types de volumes#
Kubernetes propose de nombreux types de volumes. En voici quelques-uns pour comprendre la diversité des cas d’usage :
hostPath - Accéder au système de fichiers du nœud#
Un volume hostPath monte un fichier ou un répertoire depuis le nœud (la machine hôte) dans le conteneur.
Attention !
hostPath est dangereux en production car :
Il peut exposer des fichiers sensibles du système
Il pose des problèmes de sécurité et de portabilité
À utiliser uniquement pour des cas très spécifiques (monitoring système, accès à Docker socket, etc.)
Exemple d’utilisation :
apiVersion: v1
kind: Pod
metadata:
name: pod-with-hostpath
spec:
containers:
- name: my-container
image: ubuntu:22.04
command: ["/bin/sh", "-c", "ls -la /host-data && sleep 3600"]
volumeMounts:
- name: host-volume
mountPath: /host-data
volumes:
- name: host-volume
hostPath:
path: /tmp
type: Directory
Exercice : Tester un volume hostPath
Cet exercice vous permet de comprendre comment hostPath fonctionne et pourquoi il crée une dépendance avec le nœud.
Créez un fichier sur le nœud minikube :
minikube ssh echo "Fichier créé sur le nœud" > /tmp/test-hostpath.txt exit
Créez un Pod qui monte
/tmpdu nœud dans le fichierpod-hostpath.yaml:apiVersion: v1 kind: Pod metadata: name: test-hostpath spec: containers: - name: reader image: ubuntu:22.04 command: ["/bin/sh", "-c", "cat /host-tmp/test-hostpath.txt && sleep 3600"] volumeMounts: - name: host-tmp mountPath: /host-tmp volumes: - name: host-tmp hostPath: path: /tmp type: Directory
Appliquez et vérifiez que le Pod peut lire le fichier du nœud :
kubectl apply -f pod-hostpath.yaml kubectl logs test-hostpath # Devrait afficher : "Fichier créé sur le nœud"
Modifiez le fichier depuis le Pod :
kubectl exec test-hostpath -- sh -c "echo 'Modifié depuis le Pod' >> /host-tmp/test-hostpath.txt"
Vérifiez sur le nœud que la modification est visible :
minikube ssh cat /tmp/test-hostpath.txt exit # Devrait afficher les deux lignes
Nettoyez :
kubectl delete pod test-hostpath
nfs - Partage de fichiers réseau#
Un volume nfs (Network File System) permet de monter un partage NFS existant dans vos Pods. C’est une solution simple et éprouvée pour partager des données entre plusieurs Pods, même s’ils tournent sur des nœuds différents.
Avantages :
Les données persistent indépendamment du cycle de vie des Pods
Plusieurs Pods peuvent accéder simultanément aux mêmes données (lecture/écriture)
Technologie mature et largement supportée
Exemple :
apiVersion: v1
kind: Pod
metadata:
name: pod-with-nfs
spec:
containers:
- name: my-container
image: ubuntu:22.04
command: ["/bin/sh", "-c", "ls -la /mnt/nfs && sleep 3600"]
volumeMounts:
- name: nfs-volume
mountPath: /mnt/nfs
volumes:
- name: nfs-volume
nfs:
server: nfs-server.example.com
path: /exported/path
Prérequis
Pour utiliser un volume NFS, vous devez avoir :
Un serveur NFS accessible depuis votre cluster
Les permissions appropriées configurées sur le serveur NFS
Autres types de volumes disponibles#
Kubernetes supporte de nombreux autres types de volumes, notamment :
Volumes cloud : aws, azure, …
iscsi…