
Un StatefulSet gère des Pods avec une identité stable, un stockage persistant dédié et un ordre de déploiement garanti. Contrairement à un Deployment où les Pods sont interchangeables, chaque Pod d’un StatefulSet conserve son nom, son réseau et son stockage même après un redémarrage.
Ce guide couvre la création, le headless Service, les volumeClaimTemplates, les stratégies de mise à jour et le scaling — tout ce qu’il faut pour la certification CKAD.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- Créer un StatefulSet avec un headless Service
- Configurer le stockage persistant avec
volumeClaimTemplates - Comprendre le DNS stable des Pods StatefulSet
- Mettre à jour un StatefulSet avec RollingUpdate et partitions
- Choisir entre Deployment, StatefulSet et DaemonSet
Quand utiliser un StatefulSet ?
Section intitulée « Quand utiliser un StatefulSet ? »Un StatefulSet est conçu pour les applications qui nécessitent :
| Besoin | Exemple |
|---|---|
| Identité réseau stable | Chaque Pod garde son nom (app-0, app-1) |
| Stockage persistant dédié | Chaque Pod a son propre PVC |
| Ordre de déploiement | app-0 démarre avant app-1 |
| Scaling ordonné | Scale down en ordre inverse |
Cas d’usage typiques
Section intitulée « Cas d’usage typiques »| Application | Pourquoi StatefulSet |
|---|---|
| Bases de données | PostgreSQL, MySQL, MongoDB — chaque instance a ses données |
| Clusters distribués | etcd, Zookeeper, Kafka — identité stable pour l’élection |
| Caches répliqués | Redis Cluster — nœuds avec rôles spécifiques |
| Queues de messages | RabbitMQ — identité stable pour le clustering |
Prérequis : le headless Service
Section intitulée « Prérequis : le headless Service »Un StatefulSet nécessite un headless Service pour fournir le DNS stable de chaque Pod.
Un headless Service se distingue d’un Service classique par clusterIP: None.
Au lieu de load-balancer vers les Pods, il crée une entrée DNS pour chaque
Pod.
apiVersion: v1kind: Servicemetadata: name: nginx labels: app: nginxspec: clusterIP: None # Headless Service selector: app: nginx ports: - port: 80 name: webAppliquer :
kubectl apply -f headless-service.yamlDNS stable des Pods
Section intitulée « DNS stable des Pods »Chaque Pod d’un StatefulSet obtient un nom DNS prévisible :
<nom-pod>.<service-headless>.<namespace>.svc.cluster.localExemple avec un StatefulSet web et un Service nginx dans le namespace
default :
| Pod | DNS complet |
|---|---|
web-0 | web-0.nginx.default.svc.cluster.local |
web-1 | web-1.nginx.default.svc.cluster.local |
web-2 | web-2.nginx.default.svc.cluster.local |
Ce DNS stable permet aux applications distribuées de joindre un pair précis, même après un redémarrage du Pod.
Créer un StatefulSet minimal
Section intitulée « Créer un StatefulSet minimal »Voici un StatefulSet simple avec 3 réplicas Nginx et un volume persistant de 1 Go par Pod :
apiVersion: apps/v1kind: StatefulSetmetadata: name: webspec: serviceName: nginx # Référence au headless Service replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.27 ports: - containerPort: 80 name: web volumeMounts: - name: www mountPath: /usr/share/nginx/html volumeClaimTemplates: - metadata: name: www spec: accessModes: ["ReadWriteOnce"] resources: requests: storage: 1GiPoints clés :
| Champ | Rôle |
|---|---|
serviceName: nginx | Lie le StatefulSet au headless Service |
replicas: 3 | Crée 3 Pods : web-0, web-1, web-2 |
volumeClaimTemplates | Crée un PVC dédié par Pod (www-web-0, www-web-1, etc.) |
Appliquer :
kubectl apply -f statefulset-nginx.yamlObserver le déploiement ordonné :
kubectl get pods -l app=nginx -w# NAME READY STATUS RESTARTS AGE# web-0 0/1 Pending 0 0s# web-0 1/1 Running 0 3s# web-1 0/1 Pending 0 0s # Démarre après web-0 Ready# web-1 1/1 Running 0 3s# web-2 0/1 Pending 0 0s # Démarre après web-1 Ready# web-2 1/1 Running 0 3sVérifier les PVC créés :
kubectl get pvc# NAME STATUS VOLUME CAPACITY ACCESS MODES# www-web-0 Bound pvc-xxx 1Gi RWO# www-web-1 Bound pvc-yyy 1Gi RWO# www-web-2 Bound pvc-zzz 1Gi RWOObserver et diagnostiquer un StatefulSet
Section intitulée « Observer et diagnostiquer un StatefulSet »Ces commandes sont essentielles pour l’examen CKAD.
Commandes principales
Section intitulée « Commandes principales »# Vue d'ensemble des StatefulSetskubectl get sts
# Détails complets (événements, stratégie, réplicas)kubectl describe sts web
# Pods du StatefulSet avec leurs nœudskubectl get pods -l app=nginx -o wide
# PVC associéskubectl get pvc -l app=nginx
# État du rollout en courskubectl rollout status sts/web
# Historique des révisionskubectl rollout history sts/webVérifier le DNS stable
Section intitulée « Vérifier le DNS stable »Depuis un Pod du cluster, testez la résolution DNS :
kubectl run dns-test --rm -it --image=busybox:1.37 -- nslookup web-0.nginx# Server: 10.96.0.10# Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local## Name: web-0.nginx# Address 1: 10.244.1.5 web-0.nginx.default.svc.cluster.localStratégies de mise à jour
Section intitulée « Stratégies de mise à jour »Kubernetes supporte deux stratégies de mise à jour pour les StatefulSets.
RollingUpdate (par défaut)
Section intitulée « RollingUpdate (par défaut) »C’est la stratégie par défaut. Kubernetes met à jour les Pods un par un, en ordre inverse (du plus grand ordinal vers le plus petit).
spec: updateStrategy: type: RollingUpdateComportement :
web-2est mis à jour et doit devenir Ready- Puis
web-1est mis à jour - Puis
web-0
Appliquer une mise à jour (par exemple changer l’image) :
kubectl set image sts/web nginx=nginx:1.28Suivre la progression :
kubectl rollout status sts/web# Waiting for partitioned roll out to finish: 0 out of 3 new pods have been updated...# statefulset rolling update complete 3 pods...Rolling update partitionné (canary)
Section intitulée « Rolling update partitionné (canary) »Vous pouvez limiter la mise à jour aux Pods d’ordinal supérieur ou égal à
une valeur avec partition. C’est utile pour les déploiements progressifs.
spec: updateStrategy: type: RollingUpdate rollingUpdate: partition: 2 # Seul web-2 sera mis à jourExemple : avec partition: 2 et 3 réplicas :
web-2: reçoit la nouvelle specweb-1: garde l’ancienne specweb-0: garde l’ancienne spec
C’est une forme de canary deployment pour StatefulSet.
OnDelete (contrôle manuel)
Section intitulée « OnDelete (contrôle manuel) »Avec OnDelete, Kubernetes ne met pas à jour automatiquement les Pods. Vous
devez les supprimer manuellement pour qu’ils soient recréés avec la nouvelle
spec.
spec: updateStrategy: type: OnDeleteWorkflow :
# 1. Modifier la spec du StatefulSetkubectl apply -f statefulset-updated.yaml
# 2. Les Pods existants ne changent pas
# 3. Supprimer manuellement un Pod pour déclencher sa recréationkubectl delete pod web-0
# 4. Le nouveau Pod est créé avec la nouvelle specAnnuler une mise à jour
Section intitulée « Annuler une mise à jour »kubectl rollout undo sts/webPolitique de gestion des Pods
Section intitulée « Politique de gestion des Pods »Par défaut, les Pods sont créés et supprimés de manière ordonnée. Vous
pouvez changer ce comportement avec podManagementPolicy.
OrderedReady (par défaut)
Section intitulée « OrderedReady (par défaut) »Les Pods sont créés un par un, chaque Pod devant être Ready avant de créer le suivant. Lors du scale down, les Pods sont supprimés en ordre inverse.
spec: podManagementPolicy: OrderedReady # Par défautCas d’usage : applications où l’ordre de démarrage est critique (bases de données distribuées, clusters avec élection de leader).
Parallel
Section intitulée « Parallel »Les Pods peuvent être créés ou supprimés simultanément. Kubernetes n’attend pas que chaque Pod soit Ready avant de passer au suivant.
spec: podManagementPolicy: ParallelCas d’usage : applications tolérantes au démarrage simultané, où la vitesse de scaling est prioritaire sur l’ordre.
Scaling d’un StatefulSet
Section intitulée « Scaling d’un StatefulSet »Scale up
Section intitulée « Scale up »kubectl scale sts web --replicas=5Avec OrderedReady, les nouveaux Pods sont créés dans l’ordre : web-3, puis
web-4.
Scale down
Section intitulée « Scale down »kubectl scale sts web --replicas=2Les Pods sont supprimés en ordre inverse : web-4, web-3, web-2.
Suppression d’un StatefulSet
Section intitulée « Suppression d’un StatefulSet »Conserver les Pods (orphan)
Section intitulée « Conserver les Pods (orphan) »Pour supprimer le StatefulSet sans toucher aux Pods :
kubectl delete sts web --cascade=orphanLes Pods continuent de tourner, mais ne sont plus gérés par un contrôleur. Utile pour recréer un StatefulSet avec une configuration différente.
Suppression complète
Section intitulée « Suppression complète »kubectl delete sts webCela supprime le StatefulSet et ses Pods, mais pas les PVC.
Supprimer aussi les PVC
Section intitulée « Supprimer aussi les PVC »kubectl delete sts webkubectl delete pvc -l app=nginxPolitique de rétention des PVC (Kubernetes 1.27+)
Section intitulée « Politique de rétention des PVC (Kubernetes 1.27+) »Depuis Kubernetes 1.27, vous pouvez configurer le comportement des PVC lors de
la suppression ou du scaling avec persistentVolumeClaimRetentionPolicy :
spec: persistentVolumeClaimRetentionPolicy: whenDeleted: Retain # Garde les PVC quand le StatefulSet est supprimé whenScaled: Delete # Supprime les PVC quand le Pod est supprimé par scaling| Valeur | Comportement |
|---|---|
Retain | Les PVC sont conservés (comportement par défaut actuel) |
Delete | Les PVC sont supprimés avec le Pod/StatefulSet |
Dépannage des StatefulSets
Section intitulée « Dépannage des StatefulSets »Problèmes courants
Section intitulée « Problèmes courants »| Symptôme | Cause probable | Solution |
|---|---|---|
Pod Pending | Pas de PV disponible ou StorageClass manquante | kubectl describe pod + vérifier StorageClass |
| Pod ne démarre pas | Pod précédent pas Ready | Vérifier l’état du Pod d’ordinal inférieur |
PVC Pending | Provisioner défaillant ou quota atteint | kubectl describe pvc |
| DNS non résolu | Headless Service manquant ou mal configuré | Vérifier clusterIP: None |
| Mise à jour bloquée | Pod en erreur | kubectl describe pod + logs |
Commandes de diagnostic
Section intitulée « Commandes de diagnostic »# Voir les événements du StatefulSetkubectl describe sts web
# Vérifier un Pod spécifiquekubectl describe pod web-0kubectl logs web-0
# Vérifier les PVCkubectl describe pvc www-web-0
# État du rolloutkubectl rollout status sts/web --timeout=60sComparatif : Deployment vs StatefulSet vs DaemonSet
Section intitulée « Comparatif : Deployment vs StatefulSet vs DaemonSet »Choisir la bonne ressource est essentiel pour la CKAD.
| Critère | Deployment | StatefulSet | DaemonSet |
|---|---|---|---|
| Identité des Pods | Anonyme | Stable (app-0, app-1) | Anonyme |
| Nommage | Hash aléatoire | Ordinal incrémental | Hash aléatoire |
| Stockage | PVC partagé ou sans état | PVC dédié par Pod | Généralement hostPath |
| Ordre de déploiement | Non garanti | Ordonné (par défaut) | Non garanti |
| DNS stable | Non | Oui (headless Service) | Non |
| Scaling | Horizontal libre | Ordonné | Suit les nœuds |
| Cas d’usage | APIs, web stateless | Bases de données, clusters | Agents système |
Arbre de décision
Section intitulée « Arbre de décision »Votre application a-t-elle besoin de :│├── Tourner sur CHAQUE nœud éligible ?│ └── → DaemonSet│├── Identité stable + stockage persistant par instance ?│ └── → StatefulSet│└── Ni l'un ni l'autre ? └── → DeploymentExemple avancé : cluster distribué
Section intitulée « Exemple avancé : cluster distribué »Voici un exemple plus complet avec anti-affinité pour répartir les Pods sur différents nœuds :
apiVersion: apps/v1kind: StatefulSetmetadata: name: distributed-appspec: serviceName: distributed-app replicas: 3 podManagementPolicy: OrderedReady updateStrategy: type: RollingUpdate rollingUpdate: partition: 0 selector: matchLabels: app: distributed-app template: metadata: labels: app: distributed-app spec: affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchLabels: app: distributed-app topologyKey: kubernetes.io/hostname terminationGracePeriodSeconds: 30 containers: - name: app image: busybox:1.37 command: ["sh", "-c", "echo 'Pod $(hostname) started'; sleep infinity"] ports: - containerPort: 8080 name: http volumeMounts: - name: data mountPath: /data resources: requests: cpu: 100m memory: 128Mi limits: cpu: 200m memory: 256Mi livenessProbe: exec: command: ["cat", "/tmp/healthy"] initialDelaySeconds: 5 periodSeconds: 10 readinessProbe: exec: command: ["cat", "/tmp/ready"] initialDelaySeconds: 5 periodSeconds: 5 volumeClaimTemplates: - metadata: name: data spec: accessModes: ["ReadWriteOnce"] resources: requests: storage: 5GiPoints clés :
podAntiAffinity: empêche deux Pods d’être sur le même nœudterminationGracePeriodSeconds: 30: laisse le temps à l’application de se terminer proprementlivenessProbeetreadinessProbe: essentiels pour les rolling updates ordonnés
À retenir
Section intitulée « À retenir »- Un StatefulSet fournit une identité stable (
app-0,app-1) et un stockage persistant dédié par Pod - Il nécessite un headless Service (
clusterIP: None) pour le DNS stable - La stratégie de mise à jour par défaut est RollingUpdate, pas OnDelete
volumeClaimTemplatescrée automatiquement un PVC par Pod- Les mises à jour se font en ordre inverse (du plus grand ordinal vers le plus petit)
podManagementPolicy: Parallelaccélère le scaling mais pas les updates- Les PVC ne sont pas supprimés automatiquement lors d’un scale down ou
d’une suppression du StatefulSet (sauf avec
persistentVolumeClaimRetentionPolicy) - Le DNS d’un Pod est
<pod>.<service>.<namespace>.svc.cluster.local
Contrôle de connaissances
Section intitulée « Contrôle de connaissances »Contrôle de connaissances
Validez vos connaissances avec ce quiz interactif
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
Vérification
(0/0)Profil de compétences
Quoi faire maintenant
Ressources pour progresser
Des indices pour retenter votre chance ?
Nouveau quiz complet avec des questions aléatoires
Retravailler uniquement les questions ratées
Retour à la liste des certifications