Project Oxygen & Ideo-LabIDEO LAB Dashboard 2026

☸️ Storage Systems — Chapitre 17 : Stockage persistant pour containers et Kubernetes

Kubernetes rend les containers mobiles et éphémères ; le stockage persistant rend les applications stateful possibles. Cette page densifie le sujet : PV, PVC, StorageClass, CSI, Longhorn, OpenEBS, Rook-Ceph, Portworx, cloud CSI, StatefulSets, backups Velero, snapshots CSI, bases de données, multi-zone, sécurité, observabilité, runbooks et checklist production.

Kubernetes StoragePV / PVC / StorageClassCSIStatefulSetsVelero / SnapshotsLonghorn / Rook-Ceph / Portworx
17.1

Problème initial

Containers stateless vs applications stateful : pourquoi le stockage persistant devient difficile dans un monde éphémère.

StatelessStatefulEphemeral
17.2

Persistent Volumes

PV, PVC, StorageClass, access modes, reclaim policy, volumeBindingMode et dynamic provisioning.

PVPVCStorageClass
17.3

CSI

Container Storage Interface : contrôleur, node plugin, sidecars, attach/mount, snapshots, resize et drivers.

CSIDriversSidecars
17.4

Solutions Kubernetes

Longhorn, OpenEBS, Rook-Ceph, Portworx, EBS CSI, Azure Disk CSI, GCE Persistent Disk CSI.

LonghornRook-CephCloud CSI
17.5

StatefulSets

Bases de données, files, brokers : identité stable, PVC par pod, ordonnancement, rolling updates et headless services.

StatefulSetDBBrokers
17.6

Backup Kubernetes

Velero, snapshots CSI, disaster recovery, sauvegarde etcd, backup applicatif, restore namespace et GitOps.

VeleroCSI SnapshotsDR
17.7

Difficultés

Performance, multi-zone, corruption, split-brain, backup cohérent, scheduling, permissions, expansion et observabilité.

PerformanceMulti-zoneSplit-brain
17.8

Access Modes

RWO, RWX, ROX, RWOP : choix volume bloc/fichier, implications pour pods, DB et workloads partagés.

RWORWXRWOP
17.9

Topology & zones

WaitForFirstConsumer, topology keys, zones cloud, node affinity, local PV, anti-affinity et failure domains.

TopologyZonesAffinity
17.10

Local PV & performance

NVMe local, local persistent volumes, hostPath anti-pattern, node failure, database latency et edge clusters.

Local PVNVMeEdge
17.11

RWX / fichiers partagés

NFS, CephFS, Azure Files, EFS, Filestore, SMB CSI : usages, limites et performance metadata.

NFSCephFSEFS
17.12

Bases de données sur Kubernetes

PostgreSQL, MySQL, MongoDB, Cassandra, Kafka : operators, storage class, quorum, WAL, PVC et backups.

PostgreSQLKafkaOperators
17.13

Cloud CSI

AWS EBS/EFS, Azure Disk/Files, GCE PD/Filestore : contraintes zone, performance, snapshots et coûts.

AWSAzureGCP
17.14

Sécurité storage K8s

RBAC, secrets, encryption, FSGroup, permissions, tenant isolation, backup credentials et ransomware.

RBACEncryptionSecrets
17.15

Observabilité

PVC usage, filesystem full, CSI errors, attach latency, IO latency, storage backend metrics et alerting.

MetricsPVCAlerting
17.16

Matrice de décision

Choisir Longhorn, OpenEBS, Rook-Ceph, Portworx, cloud CSI, NFS selon SLA, équipe, coût et workloads.

DecisionSLACost
17.17

Runbooks incidents

PVC pending, pod stuck, mount failed, volume full, snapshot failed, node lost, restore urgent et corruption DB.

RunbookIncidentRestore
17.18

Checklist production

Préprod Kubernetes storage : StorageClass, backup, snapshots, topology, monitoring, restore drills et documentation.

Prod-readyAuditChecklist
17.1 Problème initial : stateless vs stateful
Containers éphémères

Kubernetes a été conçu pour lancer, arrêter, déplacer et recréer des containers facilement. Un pod peut disparaître à tout moment : rescheduling, rolling update, autoscaling, drain de nœud, panne, éviction. Le filesystem interne d’un container n’est donc pas un endroit fiable pour conserver des données métier.

Erreur classique : écrire une base, un upload utilisateur ou une file de messages dans le filesystem éphémère du container.
Besoin stateful

Les applications stateful exigent identité, ordre, persistance, cohérence, sauvegarde, restauration, latence et parfois quorum. Kubernetes peut les héberger, mais uniquement avec un design de stockage explicite.

Pod diesNew podMount PVCData survives
TypeExemplesStockageRisque
StatelessAPI web, workers, frontends.Config/secrets, logs externes.Faible si données externes.
Stateful simpleUploads, cache persistant.PVC, RWX parfois.Permissions, backup.
Stateful critiquePostgreSQL, Kafka, MongoDB.PVC dédiés, operators, snapshots.Corruption, split-brain, RPO/RTO.
DistribuéCassandra, Elasticsearch, Ceph.Local PV ou bloc rapide.Quorum et placement zones.
  • Les données survivent aux pods, pas forcément aux nœuds si local PV mal conçu.
  • Un volume persistant ne remplace pas un backup.
  • Une base stateful dans Kubernetes nécessite un operator ou un runbook très solide.
  • La topologie multi-zone doit être pensée avant production.
  • Les snapshots doivent être cohérents avec l'application, pas seulement avec le disque.
Deployment / StatefulSetPVCStorageClassCSI DriverStorage Backend
17.2 Persistent Volumes : PV, PVC, StorageClass
ObjetRôleQui le crée ?
PersistentVolumeRessource stockage disponible dans le cluster.Admin ou provisioner CSI.
PersistentVolumeClaimDemande de stockage par une application.Développeur/app chart.
StorageClassClasse de provisioning : driver, paramètres, topology.Admin plateforme.
VolumeSnapshotPoint-in-time snapshot via CSI.App/admin/backup tool.
PVC: 100Gi fast-rwoStorageClassCSI CreateVolumePV boundPod mount
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: fast-rwo
provisioner: ebs.csi.aws.com
volumeBindingMode: WaitForFirstConsumer
allowVolumeExpansion: true
reclaimPolicy: Delete
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: data-postgres-0
spec:
  accessModes: ["ReadWriteOnce"]
  storageClassName: fast-rwo
  resources:
    requests:
      storage: 100Gi
PolicyEffetUsage
DeleteSupprime volume backend quand PVC supprimé.Dev/test, données recréables.
RetainGarde volume backend.Production critique, investigations.
RecycleLegacy, rarement utilisé.À éviter.

WaitForFirstConsumer retarde la création/binding du volume jusqu'au scheduling du pod. C'est essentiel en multi-zone pour créer le volume dans la même zone que le nœud choisi.

Bonne pratique cloud multi-zone : StorageClass avec WaitForFirstConsumer pour volumes zonaux.
17.3 CSI : Container Storage Interface

CSI standardise l'intégration des systèmes de stockage avec Kubernetes. Au lieu d'intégrations spécifiques dans Kubernetes, chaque fournisseur expose un driver CSI avec un controller plugin et un node plugin.

KubernetesCSI ControllerStorage APIKubeletCSI NodeMount device
ComposantRôle
Controller pluginCreate/Delete volume, attach, snapshot, resize.
Node pluginStage/publish volume sur nœud, mount filesystem.
External provisionerObserve PVC et crée PV.
External attacherGère VolumeAttachment.
SnapshotterCrée VolumeSnapshot si supporté.
ResizerExpansion PVC/volume.
  1. Pod demande PVC.
  2. Provisioner crée le volume backend.
  3. Scheduler place le pod.
  4. Attacher attache le volume au nœud si bloc cloud.
  5. Node plugin stage le volume.
  6. Kubelet mount dans le container.
kubectl get storageclass
kubectl get pvc -A
kubectl get pv
kubectl get volumeattachment
kubectl describe pvc 
kubectl describe pod 
kubectl logs -n kube-system -l app=csi-controller
kubectl logs -n kube-system -l app=csi-node
  • Driver CSI absent sur un nœud.
  • Permissions cloud insuffisantes.
  • Volume dans mauvaise zone.
  • Attach limit atteint sur instance cloud.
  • Filesystem déjà monté ou dirty.
  • StorageClass sans allowVolumeExpansion.
17.4 Solutions Kubernetes : Longhorn, OpenEBS, Rook-Ceph, Portworx, Cloud CSI
SolutionTypeForcesPoints d’attention
LonghornBlock distribué K8sSimplicité, UI, backups.Réseau et perf selon cluster.
OpenEBSLocal/distribué selon moteurFlexible, K8s-native.Choix moteur critique.
Rook-CephCeph via operatorBlock/File/Object complet.Complexité Ceph.
PortworxEnterprise K8s storageDR, multi-cloud, features avancées.Licence/coût.
AWS EBS CSICloud block zonalManagé, snapshots.Zone-bound, attach limits.
Azure Disk CSICloud block zonalIntégration Azure.Zone/performance tiers.
GCE PD CSICloud block zonal/régionalIntégration GCP.Mode régional coûteux/contraintes.
  • Cloud provider : utiliser d'abord CSI natif cloud pour simplicité.
  • On-prem simple : Longhorn peut être un bon point d'entrée.
  • On-prem complet block/file/object : Rook-Ceph/ODF.
  • Enterprise multi-cloud : Portworx selon budget/SLA.
  • Performance DB maximale : local PV ou bloc cloud performant + operator DB.
Installer un SDS Kubernetes sans monitoring, sans backup et sans comprendre le réseau cluster revient à déplacer le problème du stockage dans Kubernetes au lieu de le résoudre.
SLARPO/RTO, panne nœud, panne zone.
PerformanceIOPS, p99, throughput, small writes.
OpsQui sait réparer à 3h du matin ?
BackupSnapshots, export, restore namespace/app.
CoûtLicences, disques, réseau, egress, snapshots.
17.5 StatefulSets : bases, files, brokers

Un StatefulSet fournit identité stable, nom DNS stable et PVC stable par réplique. Il est adapté aux applications où chaque instance a un rôle ou des données propres : bases répliquées, brokers, clusters distribués.

postgres-0data-postgres-0 PVCpostgres-1data-postgres-1 PVC
ÉlémentRôle
OrdinalNom stable pod-0, pod-1.
volumeClaimTemplatesCrée un PVC par pod.
Headless ServiceDNS stable par pod.
OrderedReadyDémarrage/arrêt ordonné par défaut.
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: postgres
spec:
  serviceName: postgres-headless
  replicas: 3
  selector:
    matchLabels:
      app: postgres
  template:
    metadata:
      labels:
        app: postgres
    spec:
      containers:
      - name: postgres
        image: postgres:16
        volumeMounts:
        - name: data
          mountPath: /var/lib/postgresql/data
  volumeClaimTemplates:
  - metadata:
      name: data
    spec:
      accessModes: ["ReadWriteOnce"]
      storageClassName: fast-rwo
      resources:
        requests:
          storage: 100Gi
  • Supprimer le StatefulSet ne supprime pas forcément les PVC selon politique.
  • Scale down conserve les PVC anciens.
  • Un pod peut revenir avec ses données anciennes.
  • La réplication applicative doit être cohérente avec le scheduling.
  • Utiliser un operator mature pour DB critiques.
  • Anti-affinity entre replicas.
  • PDB pour éviter évictions simultanées.
  • Backups applicatifs en plus des snapshots.
  • Tests restore et failover.
17.6 Backup Kubernetes : Velero, snapshots CSI, disaster recovery
NiveauContenuOutil type
Cluster metadataYAML, CRDs, namespaces.GitOps, Velero.
VolumesPV/PVC data.CSI snapshots, restic/kopia, backend snapshots.
ApplicationDump DB, WAL, broker snapshots.pgBackRest, mysqldump, operators.
etcdControl plane state.etcd snapshot.

Velero sauvegarde les ressources Kubernetes et peut orchestrer snapshots de volumes via plugins cloud/CSI. Il est très utile pour restaurer namespace, manifests, PVC et migrations cluster.

velero backup create app-backup --include-namespaces app
velero backup describe app-backup --details
velero restore create --from-backup app-backup
velero schedule create daily --schedule "0 2 * * *"

Les snapshots CSI capturent un volume. Ils sont rapides, mais pas toujours application-consistent. Pour bases critiques, coordonner avec l'application : freeze, flush, backup natif, WAL archiving.

kubectl get volumesnapshotclass
kubectl get volumesnapshot -A
kubectl describe volumesnapshot 
  1. Restaurer CRDs/operators d'abord.
  2. Restaurer secrets/configmaps.
  3. Restaurer PVC/snapshots ou backups applicatifs.
  4. Restaurer workloads.
  5. Valider DNS, ingress, certificates, external dependencies.
  6. Mesurer RTO/RPO.
Un snapshot PVC n'est pas automatiquement un backup complet. Si le storage backend disparaît, le snapshot local peut disparaître aussi. Prévoir copie externe ou repository immuable.
17.7 Difficultés : performance, multi-zone, corruption, split-brain, backup cohérent
DifficultéCauseImpact
PerformanceRéseau, CSI, backend, small writes.Latence p99 élevée.
Multi-zoneVolumes zonaux, scheduling.Pod non schedulable.
CorruptionDeux writers non supportés, fs dirty.Données perdues.
Split-brainQuorum applicatif mal géré.Deux primaires.
Backup incohérentSnapshot crash-only.Restore inutilisable.
PermissionsUID/GID, fsGroup, SELinux.Pod démarre mais ne peut pas écrire.

Les volumes cloud zonaux ne peuvent être attachés qu'à des nœuds de la même zone. Une StorageClass sans topology correcte peut créer des PVC inutilisables pour certains pods.

Utiliser WaitForFirstConsumer et topology spread/anti-affinity cohérents.
Pour une base ou un broker, Kubernetes ne suffit pas à garantir le quorum. Il faut un operator ou mécanisme applicatif qui comprend leader election, fencing, replication et failover.
  • Snapshot disque seul : crash-consistent.
  • Snapshot avec freeze : filesystem-consistent.
  • Backup natif DB : application-consistent.
  • Le restore doit être testé, pas supposé.
17.8 Access Modes : RWO, RWX, ROX, RWOP
ModeSensUsage
RWOReadWriteOnce, monté en écriture par un nœud.DB, broker, bloc cloud.
RWXReadWriteMany, plusieurs nœuds/pods.Fichiers partagés, uploads.
ROXReadOnlyMany.Datasets, modèles IA en lecture.
RWOPReadWriteOncePod.Exclusivité par pod.
  • DB primaire : RWO/RWOP généralement.
  • Uploads partagés : RWX via NFS/CephFS/EFS/Azure Files.
  • Datasets ML : ROX/RWX selon pipeline.
  • Ne pas utiliser RWX pour contourner une architecture applicative mal conçue.
RWX ne signifie pas que l'application sait gérer des écritures concurrentes. Le filesystem autorise l'accès ; la cohérence applicative reste à concevoir.
17.9 Topology & zones : scheduling et failure domains

Le scheduler doit placer le pod là où le volume existe ou peut être créé. Dans le cloud, un disque EBS/Azure Disk/GCE PD est souvent zonal. En on-prem, un local PV dépend d'un nœud précis.

volumeBindingModeImmediate ou WaitForFirstConsumer.
nodeAffinityContraint le PV à certains nœuds.
topologyKeysZones/régions/racks.
podAntiAffinityÉvite replicas sur même domaine.
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: zonal-fast
provisioner: ebs.csi.aws.com
volumeBindingMode: WaitForFirstConsumer
allowedTopologies:
- matchLabelExpressions:
  - key: topology.kubernetes.io/zone
    values: ["eu-west-1a", "eu-west-1b"]
  • Aligner replicas DB avec zones.
  • Utiliser PodDisruptionBudgets.
  • Tester perte zone/nœud.
  • Documenter contraintes de stockage par StorageClass.
17.10 Local PV & performance : NVMe local, edge, DB latency

Un local PV expose un disque local d'un nœud à Kubernetes. Il offre une excellente latence, mais la donnée reste attachée au nœud. Si le nœud meurt, le volume n'est pas automatiquement disponible ailleurs.

  • Databases avec réplication applicative.
  • Kafka brokers.
  • Cassandra/ScyllaDB.
  • Elasticsearch/OpenSearch.
  • Edge clusters avec NVMe local.
hostPath est généralement un anti-pattern pour production multi-tenant : sécurité, portabilité, backup et scheduling difficiles. Préférer local PV ou CSI dédié.
  • Operator applicatif qui sait reconstruire replica.
  • Anti-affinity entre replicas.
  • Monitoring disque local.
  • Runbook node loss.
  • Backup hors nœud.
17.11 RWX / fichiers partagés : NFS, CephFS, EFS, Azure Files
SolutionForceLimite
NFS CSISimple, classique.HA/perf selon NAS.
CephFSDistribué, intégré Ceph.MDS/ops Ceph.
AWS EFSManagé, multi-AZ.Coût/perf modes.
Azure FilesSMB/NFS managé.Performance tiers.
GCP FilestoreNFS managé.Coût/capacité minimum.
  • Uploads partagés.
  • CMS médias.
  • Datasets lecture partagée.
  • Fichiers temporaires multi-pods.
  • Mais pas toujours DB transactionnelle.

Les workloads petits fichiers et metadata intensifs saturent vite les services RWX. Surveiller ops metadata, latence, locks et nombre de clients.

17.12 Bases de données sur Kubernetes : operators, WAL, PVC, backups
Une base sur Kubernetes peut être robuste si elle est opérée comme une base de données, pas comme un simple pod avec PVC.
PostgreSQLCloudNativePG, Crunchy, Zalando selon contexte.
MySQLOracle MySQL Operator, Percona, Bitnami charts à évaluer.
MongoDBOperator officiel/enterprise ou community.
KafkaStrimzi, Confluent, Redpanda.
CassandraK8ssandra, cass-operator.
  • RWO rapide pour WAL/redo/logs.
  • Low p99 latency.
  • Topology anti-affinity.
  • Snapshots coordonnés.
  • Backup natif obligatoire.
Le failover DB doit inclure fencing/quorum. Deux primaires écrivant sur deux PVC différents peuvent corrompre logiquement l'application.
17.13 Cloud CSI : AWS EBS/EFS, Azure Disk/Files, GCE PD/Filestore
CloudBloc RWOFichier RWXPoint clé
AWSEBS CSIEFS CSIEBS zonal, EFS multi-AZ.
AzureAzure Disk CSIAzure Files CSIPerformance tiers.
GCPPersistent Disk CSIFilestore CSIPD zonal/régional.
  • Attach limits par instance.
  • Zones et topology.
  • IOPS/débit selon type disque.
  • Snapshots facturés.
  • Expansion parfois online selon FS/driver.
Coût = capacité provisionnée + snapshots + IOPS provisionnées + throughput + opérations + egress éventuel
17.14 Sécurité storage Kubernetes : RBAC, secrets, FSGroup, encryption
  • RBAC limité sur PVC/PV/snapshots.
  • Secrets cloud CSI protégés.
  • Encryption at rest côté backend.
  • NetworkPolicy vers storage APIs si possible.
  • Pod Security Standards pour limiter hostPath.

Les problèmes UID/GID, fsGroup, SELinux/AppArmor sont fréquents : le volume monte, mais l'application ne peut pas écrire.

securityContext:
  runAsUser: 1000
  runAsGroup: 1000
  fsGroup: 1000
  fsGroupChangePolicy: "OnRootMismatch"
Un token Kubernetes trop puissant peut supprimer PVC, snapshots et backups. Séparer droits app, backup et admin cluster.
17.15 Observabilité : PVC usage, CSI errors, latency
MétriquePourquoi
PVC used/freeÉviter filesystem full.
PV phaseBound, Released, Failed.
Pod mount errorsCSI/node/plugin issue.
Attach latencyCloud/API delays.
IO latencyPerformance applicative.
Snapshot statusBackup/DR reliability.
kubectl get pvc -A
kubectl get pv
kubectl describe pod 
kubectl get events -A --sort-by=.lastTimestamp
kubectl top pod -A
kubectl get volumesnapshot -A
kubectl get volumeattachment
  • PVC > 80/90/95%.
  • PVC Pending > 5 min.
  • VolumeAttachment stuck.
  • CSI pod CrashLoopBackOff.
  • Snapshot failed.
  • Backend storage latency high.
17.16 Matrice de décision : choisir une solution storage Kubernetes
BesoinOptionAttention
Cloud simple RWOEBS/Azure Disk/GCE PD CSIZonal, attach limits.
Cloud RWXEFS/Azure Files/FilestoreCoût, perf metadata.
On-prem simpleLonghornRéseau et backups.
On-prem completRook-Ceph/ODFComplexité Ceph.
Enterprise multi-cloudPortworxLicence, design.
DB très perfLocal PV + replication appNode failure à gérer.
  • RWO ou RWX ?
  • Cluster cloud ou on-prem ?
  • Perte nœud/zone tolérée ?
  • Latence p99 requise ?
  • Qui opère le backend ?
  • Comment restaurer une app complète ?
Choix = workload + SLA + topology + backup + compétences ops + coût 3 ans + risque de panne
17.17 Runbooks incidents Kubernetes storage
  1. kubectl describe pvc.
  2. Vérifier StorageClass/provisioner.
  3. Vérifier quotas namespace.
  4. Vérifier topology/zone.
  5. Vérifier logs CSI provisioner.
kubectl describe pvc 
kubectl get sc
kubectl logs -n kube-system -l app=csi-controller
  1. Décrire pod et events.
  2. Vérifier VolumeAttachment.
  3. Vérifier node plugin CSI.
  4. Vérifier permissions filesystem.
  5. Vérifier backend attach/mount.
Un volume plein peut corrompre une DB ou bloquer un broker.
  1. Confirmer usage dans pod.
  2. Étendre PVC si supporté.
  3. Agrandir filesystem si nécessaire.
  4. Purger données validées.
  5. Ajouter alertes.
  1. Identifier app, namespace, PVC, point restore.
  2. Restaurer dans namespace isolé.
  3. Valider données et application.
  4. Basculer service/DNS/Ingress.
  5. Documenter RTO/RPO.
17.18 Checklist production stockage Kubernetes
ContrôleOK ?Note
StorageClass par usagefast-rwo, rwx, archive.
Topology multi-zone validéeWaitForFirstConsumer.
Backup + restore testéApp complète, pas PVC seul.
Monitoring PVC/CSICapacity, errors, latency.
Operators DB validésFailover, backup, upgrade.
  • RBAC minimal sur PVC/PV/snapshots.
  • Secrets CSI protégés.
  • Encryption backend.
  • hostPath interdit sauf exceptions contrôlées.
  • Backup credentials séparés.
  • Runbook PVC Pending.
  • Runbook Mount Failed.
  • Runbook volume full.
  • Runbook restore.
  • Documentation StorageClasses et limitations.
NO-GO si : aucun restore testé, StorageClass par défaut non documentée, PVC sans alerting capacité, snapshots non cohérents, DB sans operator/runbook, hostPath utilisé comme stockage production.