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).