Passer au contenu principal

Workloads (Kubernetes)

StatefulSets et DaemonSets

Deployments couvrent les applications stateless. Pour les applications stateful (bases de données, caches distribués, brokers) et pour les agents système qui doivent tourner sur chaque noeud, Kubernetes fournit StatefulSet et DaemonSet.

StatefulSet

Un StatefulSet garantit trois choses que le Deployment ne garantit pas :

  • Identité stable : chaque pod a un nom prévisible et permanent (web-0, web-1...)
  • Stockage stable : chaque pod reçoit son propre PVC, persistant à travers les redémarrages
  • Ordre de démarrage : les pods démarrent et s'arrêtent dans l'ordre (0, 1, 2... et inversement)
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: postgres
spec:
  serviceName: postgres-headless   # Service headless requis pour le DNS stable
  replicas: 3
  selector:
    matchLabels:
      app: postgres
  template:
    metadata:
      labels:
        app: postgres
    spec:
      containers:
      - name: postgres
        image: postgres:17-alpine
        env:
        - name: PGDATA
          value: /var/lib/postgresql/data/pgdata
        volumeMounts:
        - name: data
          mountPath: /var/lib/postgresql/data
  volumeClaimTemplates:            # Un PVC créé par pod
  - metadata:
      name: data
    spec:
      accessModes: ["ReadWriteOnce"]
      resources:
        requests:
          storage: 10Gi

Le DNS stable : postgres-0.postgres-headless.default.svc.cluster.local. Chaque pod est adressable individuellement — indispensable pour la réplication PostgreSQL, les clusters Cassandra, etc.

kubectl get statefulset postgres
kubectl get pods -l app=postgres   # postgres-0, postgres-1, postgres-2
kubectl get pvc                    # data-postgres-0, data-postgres-1, data-postgres-2

Stratégie de mise à jour

Par défaut RollingUpdate, de N-1 vers 0. partition permet un canary : seuls les pods avec un index >= partition sont mis à jour.

spec:
  updateStrategy:
    type: RollingUpdate
    rollingUpdate:
      partition: 2    # Seul postgres-2 sera mis à jour ; postgres-0 et postgres-1 restent inchangés

DaemonSet

Un DaemonSet s'assure qu'un pod tourne sur chaque noeud (ou un sous-ensemble via nodeSelector/affinités). Quand un noeud rejoint le cluster, le DaemonSet y démarre automatiquement un pod. Quand le noeud est retiré, le pod est garbage-collecté.

Cas d'usage typiques : agent de logs (Fluent Bit), agent de métriques (node-exporter), agent réseau (Cilium, Calico), agent de sécurité (Falco), agent de stockage (CSI node driver).

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: node-exporter
  namespace: monitoring
spec:
  selector:
    matchLabels:
      app: node-exporter
  template:
    metadata:
      labels:
        app: node-exporter
    spec:
      hostNetwork: true       # Accès au réseau de l'hôte
      hostPID: true           # Accès aux processus de l'hôte
      tolerations:
      - operator: Exists      # Tolère toutes les taints, y compris les control plane nodes
      containers:
      - name: node-exporter
        image: prom/node-exporter:v1.8.2
        ports:
        - containerPort: 9100
        volumeMounts:
        - name: proc
          mountPath: /host/proc
          readOnly: true
      volumes:
      - name: proc
        hostPath:
          path: /proc
kubectl get daemonset -n monitoring
kubectl get pods -n monitoring -o wide  # Un pod par noeud

Sources