Lab 6.4 - StatefulSet avec Stockage Persistant
Objectifs du Lab
À la fin de ce lab, vous serez capable de:
- Créer un StatefulSet avec des volumes persistants.
- Comprendre le provisionnement de volumes pour chaque Pod.
- Vérifier l'identité stable des Pods et volumes.
- Tester la persistance des données lors des redémarrages.
- Comprendre les différences entre StatefulSet et Deployment pour le stockage.
Durée Estimée
60-75 minutes
Prérequis
- kubectl installé et configuré.
- Cluster Kubernetes local fonctionnel (minikube ou kind).
- Connaissances sur les StatefulSets et le stockage persistant (Chapitres 6.4 et 7.1).
Partie 1: Préparation de la StorageClass
Pour un StatefulSet, chaque Pod a besoin de son propre volume persistant. Nous allons utiliser une StorageClass pour le provisionnement dynamique.
Étape 1.1: Créer une StorageClass
Créez un fichier storageclass-statefulset.yaml:
# storageclass-statefulset.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: statefulset-storage
provisioner: k8s.io/minikube-hostpath # Pour minikube, ou kubernetes.io/no-provisioner pour kind
volumeBindingMode: WaitForFirstConsumer
reclaimPolicy: Delete
allowVolumeExpansion: false
Note: Si vous utilisez kind ou un cluster sans provisionneur, vous devrez créer les PVs manuellement. Pour ce lab, nous supposons minikube.
Appliquez la StorageClass:
kubectl apply -f storageclass-statefulset.yaml
Partie 2: Création d'un StatefulSet avec Stockage
Nous allons créer un StatefulSet simple qui stocke des données dans des volumes persistants.
Étape 2.1: Créer le StatefulSet
Créez un fichier statefulset-with-storage.yaml:
# statefulset-with-storage.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: web-app
spec:
serviceName: web-app-service # Nom du Service headless (requis pour StatefulSet)
replicas: 3 # Créer 3 Pods
selector:
matchLabels:
app: web-app
template:
metadata:
labels:
app: web-app
spec:
containers:
- name: nginx
image: nginx:1.20
ports:
- containerPort: 80
name: web
volumeMounts:
- name: www
mountPath: /usr/share/nginx/html # Montage du volume persistant
command: ["/bin/sh", "-c"]
args:
- |
echo "Pod $(hostname) - $(date)" > /usr/share/nginx/html/index.html
echo "Données persistantes du Pod $(hostname)" >> /usr/share/nginx/html/data.txt
nginx -g "daemon off;"
volumeClaimTemplates: # Template pour créer un PVC pour chaque Pod
- metadata:
name: www # Nom du volume (sera utilisé dans volumeMounts)
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: statefulset-storage # Utilise notre StorageClass
resources:
requests:
storage: 100Mi # Taille du volume pour chaque Pod
Explication:
serviceName: web-app-service: Un StatefulSet nécessite un Service headless pour la découverte DNS.volumeClaimTemplates: Crée automatiquement un PVC pour chaque Pod du StatefulSet. Chaque Pod aura son propre volume persistant.- Les Pods seront nommés
web-app-0,web-app-1,web-app-2de manière ordonnée.
Étape 2.2: Créer le Service Headless
Un StatefulSet nécessite un Service headless (ClusterIP avec clusterIP: None) pour la découverte DNS:
# service-headless.yaml
apiVersion: v1
kind: Service
metadata:
name: web-app-service
spec:
clusterIP: None # Service headless
selector:
app: web-app
ports:
- port: 80
name: web
Appliquez le Service:
kubectl apply -f service-headless.yaml
Appliquez le StatefulSet:
kubectl apply -f statefulset-with-storage.yaml
Partie 3: Observation du Provisionnement
Étape 3.1: Vérifier la Création des Pods
Les Pods d'un StatefulSet sont créés de manière séquentielle (un par un):
kubectl get pods -l app=web-app -w
Vous devriez voir les Pods être créés dans l'ordre: web-app-0, puis web-app-1, puis web-app-2.
Étape 3.2: Vérifier les PVCs Créés
Chaque Pod a son propre PVC:
kubectl get pvc
Vous devriez voir trois PVCs:
www-web-app-0www-web-app-1www-web-app-2
Chaque PVC est lié à son propre PV:
kubectl get pv
Étape 3.3: Vérifier les Données dans Chaque Pod
Chaque Pod a ses propres données persistantes:
# Pod 0
kubectl exec web-app-0 -- cat /usr/share/nginx/html/index.html
kubectl exec web-app-0 -- cat /usr/share/nginx/html/data.txt
# Pod 1
kubectl exec web-app-1 -- cat /usr/share/nginx/html/index.html
kubectl exec web-app-1 -- cat /usr/share/nginx/html/data.txt
# Pod 2
kubectl exec web-app-2 -- cat /usr/share/nginx/html/index.html
kubectl exec web-app-2 -- cat /usr/share/nginx/html/data.txt
Chaque Pod devrait afficher son propre hostname et ses propres données.
Partie 4: Test de Persistance
Étape 4.1: Ajouter des Données Uniques
Ajoutez des données uniques à chaque Pod:
kubectl exec web-app-0 -- sh -c "echo 'Données uniques Pod 0 - $(date)' >> /usr/share/nginx/html/data.txt"
kubectl exec web-app-1 -- sh -c "echo 'Données uniques Pod 1 - $(date)' >> /usr/share/nginx/html/data.txt"
kubectl exec web-app-2 -- sh -c "echo 'Données uniques Pod 2 - $(date)' >> /usr/share/nginx/html/data.txt"
Vérifiez les données:
kubectl exec web-app-0 -- cat /usr/share/nginx/html/data.txt
Étape 4.2: Supprimer un Pod
Supprimez un Pod pour tester la persistance:
kubectl delete pod web-app-0
Le StatefulSet recréera automatiquement le Pod avec le même nom (web-app-0).
Attendez que le nouveau Pod soit Running:
kubectl get pods -l app=web-app
Étape 4.3: Vérifier la Persistance
Vérifiez que les données sont toujours présentes après le redémarrage:
kubectl exec web-app-0 -- cat /usr/share/nginx/html/data.txt
Vous devriez voir toutes les données précédentes, y compris les "Données uniques Pod 0", ce qui prouve que le volume persistant a été remonté avec les mêmes données.
Partie 5: Scaling du StatefulSet
Étape 5.1: Augmenter le Nombre de Réplicas
Augmentez le nombre de Pods:
kubectl scale statefulset web-app --replicas=5
Vérifiez que de nouveaux Pods et PVCs sont créés:
kubectl get pods -l app=web-app
kubectl get pvc
Vous devriez voir web-app-3 et web-app-4 avec leurs PVCs respectifs.
Étape 5.2: Réduire le Nombre de Réplicas
Réduisez le nombre de Pods:
kubectl scale statefulset web-app --replicas=2
Vérifiez que les Pods sont supprimés dans l'ordre inverse (du plus grand au plus petit):
kubectl get pods -l app=web-app -w
Important: Les PVCs ne sont PAS supprimés automatiquement. Vérifiez:
kubectl get pvc
Les PVCs des Pods supprimés (www-web-app-2, www-web-app-3, www-web-app-4) sont toujours présents, préservant les données.
Partie 6: Nettoyage
Supprimez les ressources créées:
kubectl delete statefulset web-app
kubectl delete service web-app-service
kubectl delete pvc -l app=web-app # Supprimer tous les PVCs du StatefulSet
# Les PVs seront supprimés automatiquement si reclaimPolicy: Delete
kubectl delete -f storageclass-statefulset.yaml
Résumé du Lab
Dans ce lab, vous avez exploré l'utilisation des StatefulSets avec stockage persistant. Vous avez appris à créer un StatefulSet avec volumeClaimTemplates, à observer le provisionnement séquentiel des Pods et des volumes, à tester la persistance des données lors des redémarrages, et à comprendre le comportement du scaling avec les volumes persistants.
Prochaines Étapes
Ce module sur le stockage est maintenant complet. Vous pouvez passer au Module 7 sur les Workloads Avancés.
Module 7: Workloads Avancés
Lab créé le: Décembre 2024