Volumes et PersistentVolumes
La persistance des données dans Kubernetes nécessite de comprendre trois niveaux d'abstraction : PersistentVolume (PV), PersistentVolumeClaim (PVC), et StorageClass. Cette séparation découple les administrateurs (qui provisionnent le stockage) des développeurs (qui en font la demande).
Volumes éphémères
Un volume monté dans un pod sans PVC est éphémère : il vit et meurt avec le pod.
spec:
volumes:
- name: tmp
emptyDir: {} # Répertoire vide, partagé entre conteneurs du pod
- name: host-logs
hostPath: # Chemin sur le noeud (attention : lie le pod au noeud)
path: /var/log/app
type: DirectoryOrCreate
containers:
- name: app
volumeMounts:
- name: tmp
mountPath: /tmp/cachePersistentVolume et PersistentVolumeClaim
Le PV représente une pièce de stockage physique (NFS, iSCSI, disque cloud). Le PVC est une demande de stockage par une application. Kubernetes fait correspondre les PVC aux PV selon la capacité, les access modes et la StorageClass.
# PersistentVolume (créé par l'admin, ou dynamiquement)
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-nfs-01
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteMany # RWX : plusieurs noeuds peuvent lire/écrire
nfs:
server: 192.168.1.10
path: /exports/k8s# PersistentVolumeClaim (créé par le développeur/l'app)
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: data-pvc
spec:
accessModes:
- ReadWriteOnce # RWO : un seul noeud peut monter en écriture
resources:
requests:
storage: 5Gi
storageClassName: fast-ssd # Sélectionne la StorageClass# Utilisation dans un pod
spec:
volumes:
- name: data
persistentVolumeClaim:
claimName: data-pvc
containers:
- name: db
volumeMounts:
- name: data
mountPath: /var/lib/postgresql/dataAccess Modes
- ReadWriteOnce (RWO) : un seul noeud peut monter le volume en lecture/écriture. Standard pour les bases de données.
- ReadOnlyMany (ROX) : plusieurs noeuds peuvent monter en lecture seule.
- ReadWriteMany (RWX) : plusieurs noeuds peuvent monter en lecture/écriture. Requiert NFS, CephFS, ou similaire.
- ReadWriteOncePod (RWOP) : un seul pod peut monter en écriture (v1.29+ stable).
StorageClass et provisioning dynamique
La StorageClass permet le provisioning dynamique : quand un PVC est créé, Kubernetes appelle le provisioner (driver CSI) pour créer le PV automatiquement, sans intervention manuelle.
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: fast-ssd
annotations:
storageclass.kubernetes.io/is-default-class: "true" # StorageClass par défaut
provisioner: ebs.csi.aws.com # Driver CSI AWS EBS
parameters:
type: gp3
iops: "3000"
reclaimPolicy: Retain # Delete (défaut) ou Retain
volumeBindingMode: WaitForFirstConsumer # Bind au moment du scheduling du podContainer Storage Interface (CSI)
CSI est le standard d'interface entre Kubernetes et les systèmes de stockage. Les drivers CSI courants : aws-ebs-csi-driver, azure-disk-csi-driver, gcp-compute-persistent-disk-csi-driver, democratic-csi (Freenas/TrueNAS), Longhorn (stockage distribué sur noeuds k8s).
kubectl get storageclass
kubectl get pv
kubectl get pvc -A # PVCs dans tous les namespaces
kubectl describe pvc data-pvc # Vérifier si le PVC est Bound