Passer au contenu principal

Fondamentaux (Kubernetes)

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/cache

PersistentVolume 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/data

Access 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 pod

Container 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

Sources