StatefulSets et DaemonSets 25 min de lecture

StatefulSets pour applications stateful

StatefulSet vs Deployment

Les StatefulSets sont pour les applications qui necessitent :

  • Identite reseau stable (nom DNS predictible)
  • Stockage persistent par Pod
  • Ordre de deploiement et scaling garantis
  • Ordre de suppression et terminaison garantis

Cas d'usage

  • Bases de donnees (MySQL, PostgreSQL, MongoDB)
  • Systemes distribues (Kafka, ZooKeeper, Cassandra)
  • Applications qui necessitent un stockage persistent par instance

StatefulSet YAML

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mysql
spec:
  serviceName: mysql
  replicas: 3
  selector:
    matchLabels:
      app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - name: mysql
        image: mysql:8.0
        ports:
        - containerPort: 3306
        volumeMounts:
        - name: data
          mountPath: /var/lib/mysql
  volumeClaimTemplates:
  - metadata:
      name: data
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 10Gi

Headless Service

Les StatefulSets necessitent un Headless Service pour le DNS stable.

apiVersion: v1
kind: Service
metadata:
  name: mysql
spec:
  clusterIP: None
  selector:
    app: mysql
  ports:
  - port: 3306

DNS predictible

Chaque Pod a un nom DNS stable :

mysql-0.mysql.default.svc.cluster.local
mysql-1.mysql.default.svc.cluster.local
mysql-2.mysql.default.svc.cluster.local
Important : Les StatefulSets creent les Pods dans l'ordre (0, 1, 2...) et les suppriment dans l'ordre inverse (2, 1, 0).