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.

Un marcheur dans une jungle porte son propre pack amarré. Un marcheur dans une jungle néon porte son propre pack amarré.
Service headless + StatefulSet
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
Inspecter et scale
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
Supprimer sans perdre les données
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

S’entraîner sur un cluster réel →