Aller au contenu principal

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-0
  • web-1
  • web-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.local
  • web-1.web-service.default.svc.cluster.local
  • web-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éristiqueDeploymentStatefulSet
IdentitéAléatoire (random-abc123)Stable (web-0, web-1)
StockagePartagé ou éphémèreIndividuel persistant
ScalingAléatoireOrdre garanti
ServiceClusterIP normalHeadless (DNS)
Cas d'usageStateless appsStateful apps (DB, etc.)
RedémarrageNouveau nomMê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:

  1. Mise à jour de web-2 (dernier)
  2. Mise à jour de web-1
  3. 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