Chapitre 6.4 - StatefulSets et Stockage Persistant
Objectifs d'Apprentissage
À la fin de ce chapitre, vous serez capable de:
- Comprendre les StatefulSets et leurs caractéristiques
- Déployer des applications stateful avec stockage persistant
- Comprendre les identités stables des Pods
- Utiliser volumeClaimTemplates
- Comprendre les différences avec Deployments
- Gérer le scaling ordonné
Introduction
Les Deployments sont parfaits pour les applications stateless (sans état). Pour les applications stateful (avec état) comme les bases de données, vous avez besoin de StatefulSets.
Qu'est-ce qu'un StatefulSet?
Un StatefulSet gère les déploiements et le scaling d'un ensemble de Pods avec:
- Identités stables: Noms de Pods prévisibles (web-0, web-1, web-2)
- Stockage persistant: Chaque Pod a son propre volume
- Ordre garanti: Déploiement et scaling ordonné
- Service headless: Service sans ClusterIP pour la découverte DNS
Caractéristiques Principales
1. Identités Stables
Noms des Pods:
web-0web-1web-2
Avantages:
- Identité stable même après redémarrage
- DNS stable pour la découverte de service
- Stockage lié à l'identité
2. Stockage Persistant Individuel
Chaque Pod a son propre volume persistant créé via volumeClaimTemplates.
3. Ordre Garanti
Déploiement: Ordre croissant (0, 1, 2)
Suppression: Ordre décroissant (2, 1, 0)
Scaling: Ordonné
4. Service Headless
Un service headless (sans ClusterIP) permet la découverte DNS stable.
apiVersion: v1
kind: Service
metadata:
name: web-service
spec:
clusterIP: None # Headless service
selector:
app: web
ports:
- port: 80
DNS:
web-0.web-service.default.svc.cluster.localweb-1.web-service.default.svc.cluster.localweb-2.web-service.default.svc.cluster.local
Exemple Complet
Étape 1: Créer le Service Headless
apiVersion: v1
kind: Service
metadata:
name: web-service
spec:
clusterIP: None
selector:
app: web
ports:
- port: 80
name: http
Étape 2: Créer le StatefulSet
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: web-statefulset
spec:
serviceName: "web-service" # Doit correspondre au service headless
replicas: 3
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- name: nginx
image: nginx:1.20
ports:
- containerPort: 80
name: http
volumeMounts:
- name: www
mountPath: /usr/share/nginx/html
volumeClaimTemplates:
- metadata:
name: www
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: "fast-ssd"
resources:
requests:
storage: 10Gi
Résultat:
- 3 Pods:
web-0,web-1,web-2 - 3 PVCs:
www-web-0,www-web-1,www-web-2 - Chaque Pod a son propre volume
VolumeClaimTemplates
Les volumeClaimTemplates créent automatiquement un PVC pour chaque Pod.
Caractéristiques:
- Création automatique de PVCs
- Nom:
{template-name}-{pod-name} - Chaque Pod a son propre PVC
- PVCs supprimés seulement si le Pod est supprimé
Différences: Deployment vs StatefulSet
| Caractéristique | Deployment | StatefulSet |
|---|---|---|
| Identité | Aléatoire (random-abc123) | Stable (web-0, web-1) |
| Stockage | Partagé ou éphémère | Individuel persistant |
| Scaling | Aléatoire | Ordre garanti |
| Service | ClusterIP normal | Headless (DNS) |
| Cas d'usage | Stateless apps | Stateful apps (DB, etc.) |
| Redémarrage | Nouveau nom | Même nom |
Cas d'Usage
1. Bases de Données
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: postgres
spec:
serviceName: postgres
replicas: 3
template:
spec:
containers:
- name: postgres
image: postgres:14
env:
- name: PGDATA
value: /var/lib/postgresql/data/pgdata
volumeMounts:
- name: postgres-data
mountPath: /var/lib/postgresql/data
volumeClaimTemplates:
- metadata:
name: postgres-data
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: "fast-ssd"
resources:
requests:
storage: 50Gi
2. Applications avec État
- Systèmes de fichiers distribués
- Caches avec données persistantes
- Applications avec identités stables
3. Services Requérant un Ordre
- Réplication maître-esclave
- Applications avec quorum
- Services avec élection de leader
Scaling
Scaling Up
kubectl scale statefulset web-statefulset --replicas=5
Résultat: Crée web-3 puis web-4 dans l'ordre.
Scaling Down
kubectl scale statefulset web-statefulset --replicas=2
Résultat: Supprime web-2 puis web-1 dans l'ordre décroissant.
Important: Les PVCs ne sont pas supprimés automatiquement. Supprimez-les manuellement si nécessaire.
Mises à Jour
Rolling Update
spec:
updateStrategy:
type: RollingUpdate
template:
spec:
containers:
- name: nginx
image: nginx:1.21 # Nouvelle version
Processus:
- Mise à jour de
web-2(dernier) - Mise à jour de
web-1 - Mise à jour de
web-0(premier)
OnDelete
spec:
updateStrategy:
type: OnDelete
Processus: Mise à jour seulement quand un Pod est supprimé manuellement.
Commandes Utiles
Créer et Gérer
# Créer un StatefulSet
kubectl apply -f statefulset.yaml
# Voir les StatefulSets
kubectl get statefulset
kubectl get sts
# Voir les Pods
kubectl get pods -l app=web
# Détails
kubectl describe statefulset web-statefulset
Scaling
# Augmenter les replicas
kubectl scale statefulset web-statefulset --replicas=5
# Réduire les replicas
kubectl scale statefulset web-statefulset --replicas=2
Voir les Volumes
# Voir les PVCs créés
kubectl get pvc
# Voir les détails
kubectl describe pvc www-web-0
Bonnes Pratiques
1. Utiliser pour Applications Stateful
StatefulSets seulement pour applications avec état. Utilisez Deployments pour stateless.
2. Service Headless Requis
Toujours créer un service headless pour la découverte DNS.
3. Stockage Approprié
Choisir le bon access mode (RWO pour bases de données).
4. Sauvegardes
Mettre en place des sauvegardes régulières des volumes.
5. Monitoring
Surveiller l'état et les performances de chaque Pod.
Résumé
Dans ce chapitre, vous avez appris:
StatefulSet: Gère les applications stateful avec identités stables
Caractéristiques: Noms prévisibles, volumes individuels, ordre garanti, service headless
volumeClaimTemplates: Création automatique de PVCs par Pod
Cas d'usage: Bases de données, applications avec état, services ordonnés
Différences: Identité stable vs aléatoire, stockage individuel vs partagé
Scaling: Ordre garanti (croissant pour up, décroissant pour down)
Mises à jour: RollingUpdate (inverse) ou OnDelete
Prochaines Étapes
Module 7: Workloads Avancés (StatefulSets approfondi, DaemonSets, Jobs)
Lab 6.4: StatefulSet avec Stockage Persistant
Chapitre créé le: Décembre 2024