Aller au contenu
Conteneurs & Orchestration medium
🔐 Alerte sécurité — Incident supply chain Trivy : lire mon analyse de l'attaque

Stockage Kubernetes : PV, PVC, StorageClass et CSI

16 min de lecture

logo kubernetes

Votre Pod redémarre et perd toutes ses données. Votre PVC reste bloqué en Pending. Vous ne comprenez pas pourquoi votre volume n’est pas accessible depuis un autre nœud. Ces situations sont fréquentes quand on découvre le stockage Kubernetes.

Ce guide vous donne les bases essentielles pour comprendre et manipuler le stockage dans Kubernetes : la relation entre Pod, PVC, PV et StorageClass, les access modes, les reclaim policies, et comment diagnostiquer les problèmes courants.

Pourquoi le stockage est particulier dans Kubernetes

Section intitulée « Pourquoi le stockage est particulier dans Kubernetes »

Dans un environnement traditionnel, vos applications stockent leurs données sur des disques locaux stables. Dans Kubernetes, les Pods sont éphémères : ils peuvent être détruits, recréés et déplacés sur d’autres nœuds à tout moment.

Se posent alors trois questions :

  1. Comment préserver les données quand un Pod disparaît ?
  2. Comment partager du stockage entre plusieurs Pods ?
  3. Comment rendre le stockage portable d’un nœud à l’autre ?

Kubernetes répond à ces questions avec un modèle en couches : volumes éphémères pour les données temporaires, et stockage persistant (PV/PVC) pour les données qui doivent survivre aux Pods.

Le modèle mental : Pod → PVC → PV → StorageClass

Section intitulée « Le modèle mental : Pod → PVC → PV → StorageClass »

Avant d’entrer dans les détails, voici le schéma mental que vous devez avoir :

Modèle de stockage Kubernetes : l'utilisateur crée un PVC qui peut être lié à un PV statique ou provisionné dynamiquement via une StorageClass, le tout connecté au backend de stockage via CSI

En résumé :

  • Le Pod monte un PVC (PersistentVolumeClaim)
  • Le PVC réclame un PV (PersistentVolume)
  • Le PV peut être créé statiquement par un admin, ou dynamiquement via une StorageClass
  • CSI (Container Storage Interface) est l’interface standard entre Kubernetes et le backend de stockage

Avant le stockage persistant, voyons les volumes éphémères — ceux dont les données ne survivent pas au Pod.

Un volume emptyDir est créé quand le Pod démarre et supprimé quand le Pod est détruit. Il permet aux conteneurs d’un même Pod de partager des fichiers.

Cas d’usage :

  • Cache temporaire
  • Partage de fichiers entre conteneurs d’un même Pod
  • Répertoire de travail pour des calculs intermédiaires
apiVersion: v1
kind: Pod
metadata:
name: emptydir-demo
spec:
containers:
- name: app
image: busybox
command: ["sleep", "3600"]
volumeMounts:
- mountPath: /data
name: temp-storage
volumes:
- name: temp-storage
emptyDir: {}

Le volume hostPath monte un répertoire du nœud hôte dans le Pod. Il donne accès direct au système de fichiers du nœud.

Cas d’usage limités :

  • Accéder aux logs du nœud (/var/log)
  • Monter un socket Docker ou containerd
  • Tests locaux en développement
apiVersion: v1
kind: Pod
metadata:
name: hostpath-demo
spec:
containers:
- name: app
image: busybox
command: ["sleep", "3600"]
volumeMounts:
- mountPath: /host-logs
name: host-storage
volumes:
- name: host-storage
hostPath:
path: /var/log
type: Directory

Le stockage persistant permet de conserver les données même après la suppression du Pod. C’est le cœur du domaine Storage de la CKA.

Un PersistentVolume représente un volume de stockage réel dans le cluster. Il est créé soit :

  • Statiquement par un administrateur
  • Dynamiquement par une StorageClass

Le PV contient les informations techniques : capacité, access modes, reclaim policy, et les détails du backend de stockage.

apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-example
spec:
capacity:
storage: 10Gi
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
storageClassName: manual
hostPath:
path: /mnt/data

Un PersistentVolumeClaim est une demande de stockage faite par un utilisateur. Le PVC spécifie :

  • La capacité souhaitée
  • L’access mode requis
  • Optionnellement, une StorageClass

Kubernetes lie automatiquement le PVC à un PV compatible.

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-example
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
storageClassName: manual

Une StorageClass définit comment provisionner dynamiquement des volumes. Elle spécifie :

  • Le provisioner (driver CSI ou in-tree)
  • Les paramètres du backend (type de disque, IOPS, etc.)
  • La reclaim policy par défaut
  • Le volumeBindingMode
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: fast-storage
provisioner: pd.csi.storage.gke.io
parameters:
type: pd-ssd
reclaimPolicy: Delete
volumeBindingMode: WaitForFirstConsumer
allowVolumeExpansion: true

Les access modes définissent comment un volume peut être monté par les nœuds et les Pods. C’est un point central pour la CKA.

Access modeAbréviationSignificationCas d’usage typique
ReadWriteOnceRWOLecture/écriture depuis un seul nœudDB mono-instance, app stateful
ReadOnlyManyROXLecture seule depuis plusieurs nœudsAssets statiques partagés
ReadWriteManyRWXLecture/écriture depuis plusieurs nœudsStockage partagé (NFS, CephFS)
ReadWriteOncePodRWOPLecture/écriture depuis un seul PodApps nécessitant un writer unique strict

Tous les backends ne supportent pas tous les access modes :

BackendRWOROXRWXRWOP
AWS EBS
GCE PD
Azure Disk
NFS
CephFS

Reclaim policies : que faire quand le PVC est supprimé ?

Section intitulée « Reclaim policies : que faire quand le PVC est supprimé ? »

La reclaim policy définit ce qui arrive au PV (et au stockage sous-jacent) quand le PVC qui l’utilise est supprimé.

Reclaim PolicyEffetUsage
DeleteLe PV et le stockage backend sont supprimésEnvironnements cloud, données non critiques
RetainLe PV est conservé (statut Released), données préservéesDonnées critiques, reprise manuelle
RecycleDéprécié — Effacement basique (rm -rf /volume/*)Ne plus utiliser
Fenêtre de terminal
kubectl patch pv <pv-name> -p '{"spec":{"persistentVolumeReclaimPolicy":"Retain"}}'

Le volumeBindingMode d’une StorageClass contrôle quand le binding PVC → PV se produit.

ModeComportementQuand l’utiliser
ImmediateLe PV est créé/lié dès la création du PVCStockage sans contrainte de topologie
WaitForFirstConsumerLe binding attend qu’un Pod consomme le PVCStockage zonal (EBS, GCE PD), scheduling-aware
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: zonal-storage
provisioner: pd.csi.storage.gke.io
volumeBindingMode: WaitForFirstConsumer

L’administrateur crée manuellement les PV avant que les utilisateurs créent leurs PVC.

  1. Admin crée le PV

    apiVersion: v1
    kind: PersistentVolume
    metadata:
    name: static-pv
    spec:
    capacity:
    storage: 50Gi
    accessModes:
    - ReadWriteOnce
    persistentVolumeReclaimPolicy: Retain
    storageClassName: manual
    nfs:
    server: nfs.example.com
    path: /exports/data
  2. Utilisateur crée le PVC

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
    name: my-pvc
    spec:
    accessModes:
    - ReadWriteOnce
    resources:
    requests:
    storage: 50Gi
    storageClassName: manual
  3. Kubernetes lie PVC → PV

    Le PVC passe en status Bound.

Avantages : Contrôle total, pas de dépendance au provisioner.

Inconvénients : Manuel, ne scale pas, risque de sur/sous-provisionnement.

Kubernetes crée automatiquement les PV à la demande, via une StorageClass et un driver CSI.

  1. StorageClass existe

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
    name: fast
    provisioner: csi.example.com
    parameters:
    type: ssd
  2. Utilisateur crée le PVC

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
    name: dynamic-pvc
    spec:
    accessModes:
    - ReadWriteOnce
    resources:
    requests:
    storage: 20Gi
    storageClassName: fast
  3. CSI provisionne automatiquement le PV

    Le driver CSI crée le volume sur le backend et le PV dans Kubernetes.

Avantages : Automatique, scalable, moins d’erreurs humaines.

Inconvénients : Dépendance au driver CSI, debugging plus complexe.

CSI (Container Storage Interface) est l’interface standard pour intégrer des solutions de stockage à Kubernetes. C’est le mécanisme derrière les StorageClasses modernes.

Un driver CSI se compose de :

  • Controller Plugin : Gère les opérations au niveau du cluster (création/suppression de volumes, attachement aux nœuds)
  • Node Plugin : Gère les opérations sur chaque nœud (montage/démontage du volume dans le Pod)

Ces plugins communiquent avec Kubernetes via gRPC.

Selon le driver, CSI permet :

  • Provisionnement dynamique
  • Snapshots de volumes
  • Clonage de volumes
  • Expansion de volumes (allowVolumeExpansion: true)
  • Topologie (placement zone-aware)

Un PVC en Pending est un problème classique. Voici les causes les plus fréquentes :

CauseVérificationSolution
Pas de StorageClass par défautkubectl get scCréer une SC par défaut ou spécifier storageClassName
StorageClass inexistantekubectl get sc <nom>Créer la StorageClass ou corriger le nom
Aucun PV statique compatiblekubectl get pvCréer un PV avec capacité/access mode compatibles
Capacité demandée trop grandekubectl describe pvcRéduire la demande ou créer un PV plus grand
Access mode non supportékubectl describe pvcVérifier le support du backend
Driver CSI non fonctionnelkubectl get pods -n kube-systemVérifier les pods du driver CSI
WaitForFirstConsumer actifkubectl describe pvcCréer un Pod qui consomme le PVC
Fenêtre de terminal
# Lister les ressources de stockage
kubectl get pv
kubectl get pvc -A
kubectl get storageclass
# Inspecter un PVC
kubectl describe pvc <nom>
# Inspecter un PV
kubectl describe pv <nom>
# Voir les événements récents
kubectl get events -A --sort-by=.lastTimestamp | grep -i pvc
# Vérifier les pods CSI
kubectl get pods -n kube-system | grep csi
Fenêtre de terminal
$ kubectl describe pvc my-pvc
Name: my-pvc
Namespace: default
Status: Pending
...
Events:
Type Reason Message
---- ------ -------
Warning ProvisioningFailed storageclass.storage.k8s.io "nonexistent" not found

Diagnostic : La StorageClass nonexistent n’existe pas.

Solution : Corriger le storageClassName dans le PVC ou créer la StorageClass.

Voici un exemple fonctionnel avec provisionnement dynamique :

# 1. StorageClass (à adapter selon votre environnement)
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: standard
provisioner: rancher.io/local-path # Exemple avec local-path-provisioner
reclaimPolicy: Delete
volumeBindingMode: WaitForFirstConsumer
---
# 2. PVC
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: app-data
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
storageClassName: standard
---
# 3. Pod qui utilise le PVC
apiVersion: v1
kind: Pod
metadata:
name: app-with-storage
spec:
containers:
- name: app
image: nginx:alpine
volumeMounts:
- mountPath: /usr/share/nginx/html
name: data
volumes:
- name: data
persistentVolumeClaim:
claimName: app-data

Appliquez et vérifiez :

Fenêtre de terminal
kubectl apply -f storage-example.yaml
kubectl get pvc app-data
kubectl get pv
kubectl describe pod app-with-storage

Les 5 points essentiels de ce guide :

  • Pod → PVC → PV → StorageClass : c’est le modèle mental à avoir pour comprendre le stockage Kubernetes
  • Access modes : RWO = un seul nœud, RWX = plusieurs nœuds, RWOP = un seul Pod
  • Reclaim policies : Delete supprime les données, Retain les conserve
  • Provisionnement dynamique via StorageClass + CSI est le mode moderne
  • Un PVC en Pending = vérifier StorageClass, capacité, access mode, et driver CSI

Contrôle de connaissances

Validez vos connaissances avec ce quiz interactif

7 questions
5 min.
80% requis

Informations

  • Le chronomètre démarre au clic sur Démarrer
  • Questions à choix multiples, vrai/faux et réponses courtes
  • Vous pouvez naviguer entre les questions
  • Les résultats détaillés sont affichés à la fin

Lance le quiz et démarre le chronomètre

StorageClass en détail

Approfondissez les paramètres des StorageClasses et le provisionnement dynamique Lire le guide StorageClass

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracing. Aujourd'hui, ce site ne couvre même pas mes frais d'hébergement, d'électricité, de matériel, de logiciels, mais surtout de cafés.

Un soutien régulier, même symbolique, m'aide à garder ces ressources gratuites et à continuer de produire des guides de qualité. Merci pour votre appui.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn