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: 10GiLe 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-2Straté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ésDaemonSet
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: /prockubectl get daemonset -n monitoring
kubectl get pods -n monitoring -o wide # Un pod par noeud