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