Lab 7.1 - StatefulSet pour Base de Données
Objectifs du Lab
À la fin de ce lab, vous serez capable de:
- Déployer une base de données (MySQL) avec un StatefulSet.
- Configurer le stockage persistant pour une base de données.
- Comprendre l'importance de l'ordre de démarrage pour les bases de données.
- Configurer un Service headless pour la découverte.
- Tester la persistance des données de la base de données.
Durée Estimée
60-75 minutes
Prérequis
- kubectl installé et configuré.
- Cluster Kubernetes local fonctionnel (minikube ou kind).
- Connaissances sur les StatefulSets (Chapitre 7.1).
Partie 1: Préparation de la StorageClass
Créez une StorageClass pour le stockage de la base de données:
# storageclass-mysql.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: mysql-storage
provisioner: k8s.io/minikube-hostpath # Pour minikube
volumeBindingMode: WaitForFirstConsumer
reclaimPolicy: Delete
Appliquez la StorageClass:
kubectl apply -f storageclass-mysql.yaml
Partie 2: Création du Secret pour MySQL
Créez un Secret pour stocker le mot de passe root de MySQL:
# mysql-secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: mysql-secret
type: Opaque
data:
mysql-root-password: cGFzc3dvcmQxMjM= # "password123" en base64
mysql-password: cGFzc3dvcmQxMjM= # "password123" en base64
Appliquez le Secret:
kubectl apply -f mysql-secret.yaml
Partie 3: Création du Service Headless
Un StatefulSet nécessite un Service headless pour la découverte DNS:
# mysql-service.yaml
apiVersion: v1
kind: Service
metadata:
name: mysql
labels:
app: mysql
spec:
ports:
- port: 3306
name: mysql
clusterIP: None # Service headless
selector:
app: mysql
Appliquez le Service:
kubectl apply -f mysql-service.yaml
Partie 4: Création du StatefulSet MySQL
Créez le StatefulSet pour MySQL avec stockage persistant:
# mysql-statefulset.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mysql
spec:
serviceName: mysql # Nom du Service headless
replicas: 1 # Pour ce lab, une seule instance MySQL
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
initContainers:
- name: init-mysql
image: busybox:1.35
command:
- sh
- -c
- |
# Créer le répertoire de données si nécessaire
if [ ! -d /var/lib/mysql/mysql ]; then
echo "Initialisation du répertoire de données MySQL"
fi
volumeMounts:
- name: data
mountPath: /var/lib/mysql
containers:
- name: mysql
image: mysql:8.0
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-secret
key: mysql-root-password
ports:
- containerPort: 3306
name: mysql
volumeMounts:
- name: data
mountPath: /var/lib/mysql
resources:
requests:
cpu: 500m
memory: 512Mi
volumeClaimTemplates:
- metadata:
name: data
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: mysql-storage
resources:
requests:
storage: 1Gi
Appliquez le StatefulSet:
kubectl apply -f mysql-statefulset.yaml
Partie 5: Vérification du Déploiement
Étape 5.1: Vérifier le Pod
Attendez que le Pod soit Running:
kubectl get pods -l app=mysql
Vérifiez les logs pour s'assurer que MySQL démarre correctement:
kubectl logs mysql-0
Étape 5.2: Vérifier le PVC
Vérifiez que le PVC a été créé:
kubectl get pvc
Vous devriez voir un PVC nommé data-mysql-0.
Partie 6: Test de la Base de Données
Étape 6.1: Créer une Base de Données et une Table
Connectez-vous à MySQL et créez une base de données de test:
kubectl exec -it mysql-0 -- mysql -uroot -ppassword123 -e "CREATE DATABASE testdb;"
kubectl exec -it mysql-0 -- mysql -uroot -ppassword123 -e "USE testdb; CREATE TABLE users (id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50));"
kubectl exec -it mysql-0 -- mysql -uroot -ppassword123 -e "USE testdb; INSERT INTO users (name) VALUES ('Alice'), ('Bob'), ('Charlie');"
Étape 6.2: Vérifier les Données
Vérifiez que les données ont été insérées:
kubectl exec -it mysql-0 -- mysql -uroot -ppassword123 -e "USE testdb; SELECT * FROM users;"
Partie 7: Test de Persistance
Étape 7.1: Supprimer le Pod
Supprimez le Pod pour tester la persistance:
kubectl delete pod mysql-0
Le StatefulSet recréera automatiquement le Pod avec le même nom.
Attendez que le nouveau Pod soit Running:
kubectl get pods -l app=mysql
Attendez quelques secondes que MySQL redémarre complètement:
kubectl logs mysql-0 -f
Appuyez sur Ctrl+C une fois que MySQL est prêt.
Étape 7.2: Vérifier la Persistance des Données
Vérifiez que les données sont toujours présentes:
kubectl exec -it mysql-0 -- mysql -uroot -ppassword123 -e "USE testdb; SELECT * FROM users;"
Vous devriez voir les trois utilisateurs (Alice, Bob, Charlie), ce qui prouve que les données ont persisté!
Partie 8: Nettoyage
Supprimez les ressources créées:
kubectl delete statefulset mysql
kubectl delete service mysql
kubectl delete secret mysql-secret
kubectl delete pvc data-mysql-0
kubectl delete -f storageclass-mysql.yaml
Résumé du Lab
Dans ce lab, vous avez déployé une base de données MySQL avec un StatefulSet. Vous avez appris à configurer le stockage persistant pour une base de données, à utiliser des Secrets pour les mots de passe, et à tester la persistance des données lors des redémarrages. Les StatefulSets sont idéaux pour les applications avec état comme les bases de données.
Prochaines Étapes
Le prochain lab vous montrera comment utiliser les DaemonSets pour déployer des agents sur tous les nœuds.
Lab 7.2: DaemonSet pour Monitoring
Lab créé le: Décembre 2024