Aide-mémoire CKAD
exemple YAML StatefulSet k8s
Les Pods d’un Deployment sont interchangeables — n’importe quel replica peut mourir et revenir avec un nouveau nom, en partageant un seul volume. Un StatefulSet les numérote (web-0, web-1, ...), les démarre/arrête dans l’ordre, et donne à chacun son propre PVC qui survit à un redémarrage.
apiVersion: v1
kind: Service
metadata:
name: web
labels:
app: web
spec:
clusterIP: None
selector:
app: web
ports:
- port: 80
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: web
spec:
serviceName: web
replicas: 3
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- name: web
image: nginx:1.27
ports:
- containerPort: 80
volumeMounts:
- name: data
mountPath: /usr/share/nginx/html
volumeClaimTemplates:
- metadata:
name: data
spec:
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 1Gi
kubectl get sts web
kubectl get pods -l app=web -o wide
kubectl get pvc -l app=web
kubectl scale sts/web --replicas=5
kubectl rollout status sts/web
kubectl exec -it web-0 -- sh
kubectl delete sts web --cascade=orphan
kubectl get pods -l app=web
kubectl delete pvc -l app=web
Champs
- serviceName
- Doit nommer un Service headless (clusterIP: None) du même namespace. Donne à chaque Pod un nom DNS stable.
- volumeClaimTemplates
- Un PVC par Pod, créé automatiquement et nommé <template>-<pod>. Pas partagé comme le volume d’un Deployment.
- podManagementPolicy
- OrderedReady (défaut) attend que chaque Pod soit Ready avant de lancer le suivant. Parallel les démarre tous en même temps.
- updateStrategy
- RollingUpdate met à jour l’ordinal le plus haut en premier. partition retient les Pods sous cet ordinal.
- selector
- Même règle que Deployment — selector.matchLabels doit matcher template.metadata.labels, et c’est immuable après create.
- clusterIP
- None rend le Service headless : le DNS résout vers l’IP propre de chaque Pod (<pod>.<svc>), pas une IP virtuelle partagée.
- kubectl scale sts
- Scale up en ajoutant l’ordinal suivant et en attendant qu’il soit Ready. Scale down en retirant l’ordinal le plus haut en premier.
- kubectl delete
- Supprimer un StatefulSet ne supprime pas ses PVC. Les données survivent aux Pods exprès — supprimer les PVC soi-même pour vraiment les enlever.
Pièges
- Pas de kubectl create statefulset. Écrire le YAML à la main, ou dry-run un Deployment puis changer kind, ajouter serviceName et volumeClaimTemplates.
- serviceName doit pointer sur un vrai Service headless (clusterIP: None), sinon le DNS des Pods ne résout jamais.
- Supprimer le StatefulSet ne supprime pas ses PersistentVolumeClaims. À supprimer soi-même si la tâche veut vraiment que les données disparaissent.
- Scale down retire l’ordinal le plus haut en premier (web-2 avant web-1). Scale up attend que chaque nouveau Pod soit Ready avant le suivant (défaut OrderedReady).
Doc officielle StatefulSets