Aller au contenu principal

Chapitre 7.1 - StatefulSets Approfondi

Objectifs d'Apprentissage

À la fin de ce chapitre, vous serez capable de:

  • Comprendre les StatefulSets en profondeur
  • Déployer des bases de données avec StatefulSets
  • Gérer le scaling et les mises à jour
  • Comprendre les init containers dans StatefulSets
  • Implémenter la réplication maître-esclave
  • Gérer les quorums et l'élection de leader

Introduction

Les StatefulSets sont essentiels pour les applications stateful. Ce chapitre approfondit les concepts et présente des cas d'usage avancés.


Architecture d'un StatefulSet

Composants


Exemple: Base de Données PostgreSQL

Étape 1: Service Headless

apiVersion: v1
kind: Service
metadata:
name: postgres
spec:
clusterIP: None
selector:
app: postgres
ports:
- port: 5432
name: postgres

Étape 2: ConfigMap pour Configuration

apiVersion: v1
kind: ConfigMap
metadata:
name: postgres-config
data:
postgresql.conf: |
max_connections = 200
shared_buffers = 256MB
effective_cache_size = 1GB

Étape 3: Secret pour Credentials

apiVersion: v1
kind: Secret
metadata:
name: postgres-secret
type: Opaque
data:
postgres-password: cG9zdGdyZXM= # base64
replication-password: cmVwbGljYXRpb24= # base64

Étape 4: StatefulSet

apiVersion: apps/v1
kind: StatefulSet
metadata:
name: postgres
spec:
serviceName: postgres
replicas: 3
selector:
matchLabels:
app: postgres
template:
metadata:
labels:
app: postgres
spec:
initContainers:
- name: init-postgres
image: postgres:14
command:
- /bin/bash
- -c
- |
set -e
if [[ $HOSTNAME == "postgres-0" ]]; then
echo "Initializing primary database..."
else
echo "Waiting for primary to be ready..."
until pg_isready -h postgres-0.postgres; do
sleep 1
done
fi
env:
- name: PGHOST
value: postgres-0.postgres
containers:
- name: postgres
image: postgres:14
env:
- name: POSTGRES_PASSWORD
valueFrom:
secretKeyRef:
name: postgres-secret
key: postgres-password
- name: PGDATA
value: /var/lib/postgresql/data/pgdata
ports:
- containerPort: 5432
name: postgres
volumeMounts:
- name: postgres-data
mountPath: /var/lib/postgresql/data
- name: postgres-config
mountPath: /etc/postgresql
volumes:
- name: postgres-config
configMap:
name: postgres-config
volumeClaimTemplates:
- metadata:
name: postgres-data
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: "fast-ssd"
resources:
requests:
storage: 50Gi

Init Containers

Les init containers s'exécutent avant les conteneurs principaux et peuvent:

  • Initialiser la base de données
  • Attendre que d'autres services soient prêts
  • Configurer l'environnement
  • Vérifier les dépendances

Exemple:

spec:
template:
spec:
initContainers:
- name: wait-for-db
image: busybox:1.35
command:
- sh
- -c
- |
until nc -z postgres-0.postgres 5432; do
echo "Waiting for database..."
sleep 2
done
containers:
- name: app
image: my-app:1.0

Réplication Maître-Eslave

Architecture

Configuration:

spec:
template:
spec:
containers:
- name: postgres
env:
- name: POSTGRES_REPLICATION_MODE
value: "master" # Pour postgres-0
- name: POSTGRES_MASTER_HOST
value: "postgres-0.postgres" # Pour postgres-1, postgres-2

Quorum et Élection de Leader

Pour les applications nécessitant un quorum (ex: etcd, Consul):

apiVersion: apps/v1
kind: StatefulSet
metadata:
name: etcd
spec:
serviceName: etcd
replicas: 3 # Quorum: (3/2) + 1 = 2
template:
spec:
containers:
- name: etcd
image: quay.io/coreos/etcd:v3.5.0
env:
- name: ETCD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: ETCD_INITIAL_CLUSTER
value: "etcd-0=http://etcd-0.etcd:2380,etcd-1=http://etcd-1.etcd:2380,etcd-2=http://etcd-2.etcd:2380"

Quorum: (N/2) + 1, où N = nombre de replicas


Scaling

Scaling Up

kubectl scale statefulset postgres --replicas=5

Processus:

  1. Crée postgres-3
  2. Attends que postgres-3 soit Ready
  3. Crée postgres-4
  4. Attends que postgres-4 soit Ready

Scaling Down

kubectl scale statefulset postgres --replicas=2

Processus:

  1. Supprime postgres-4 (dernier)
  2. Attends que postgres-4 soit terminé
  3. Supprime postgres-3
  4. Attends que postgres-3 soit terminé

Important: Pour les bases de données, assurez-vous que les données sont sauvegardées avant le scaling down.


Mises à Jour

Rolling Update

spec:
updateStrategy:
type: RollingUpdate
rollingUpdate:
partition: 0 # Mettre à jour tous les Pods

Processus:

  1. Mise à jour de postgres-2 (dernier)
  2. Mise à jour de postgres-1
  3. Mise à jour de postgres-0 (premier)

Mise à Jour Partielle (Canary)

spec:
updateStrategy:
type: RollingUpdate
rollingUpdate:
partition: 2 # Garde postgres-0 et postgres-1 à l'ancienne version

Résultat: Seulement postgres-2 est mis à jour.


Commandes Utiles

Gestion

# Voir les StatefulSets
kubectl get statefulset
kubectl get sts

# Détails
kubectl describe statefulset postgres

# Voir les Pods
kubectl get pods -l app=postgres

# Logs d'un Pod spécifique
kubectl logs postgres-0

Scaling

# Scaling up
kubectl scale statefulset postgres --replicas=5

# Scaling down
kubectl scale statefulset postgres --replicas=2

Mises à Jour

# Mise à jour de l'image
kubectl set image statefulset/postgres postgres=postgres:15

# Voir le statut de la mise à jour
kubectl rollout status statefulset/postgres

# Rollback
kubectl rollout undo statefulset/postgres

Bonnes Pratiques

1. Sauvegardes Régulières

Mettre en place des sauvegardes automatiques des volumes.

2. Monitoring

Surveiller l'état de chaque Pod et les métriques de performance.

3. Quorum Approprié

Utiliser un nombre impair de replicas pour éviter les égalités.

4. Init Containers

Utiliser des init containers pour l'initialisation et les vérifications.

5. Service Headless

Toujours créer un service headless pour la découverte DNS.


Résumé

Dans ce chapitre, vous avez appris:

StatefulSets approfondis: Applications stateful avec identités stables
Bases de données: Déploiement de PostgreSQL avec réplication
Init containers: Initialisation avant les conteneurs principaux
Réplication: Configuration maître-esclave
Quorum: Calcul et configuration pour applications distribuées
Scaling: Ordre garanti (croissant/decroissant)
Mises à jour: RollingUpdate et mises à jour partielles
Bonnes pratiques: Sauvegardes, monitoring, quorum


Prochaines Étapes

Chapitre 7.2: DaemonSets
Chapitre 7.3: Jobs
Chapitre 7.4: CronJobs


Chapitre créé le: Décembre 2024