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