Aller au contenu principal

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