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:
- Crée
postgres-3 - Attends que
postgres-3soit Ready - Crée
postgres-4 - Attends que
postgres-4soit Ready
Scaling Down
kubectl scale statefulset postgres --replicas=2
Processus:
- Supprime
postgres-4(dernier) - Attends que
postgres-4soit terminé - Supprime
postgres-3 - Attends que
postgres-3soit 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:
- Mise à jour de
postgres-2(dernier) - Mise à jour de
postgres-1 - 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