Présentation
Le déploiement d'une base de données fonctionnelle dans un environnement conteneurisé peut être une tâche exigeante. La raison réside dans l'ensemble des défis spécifiques que les bases de données présentent pour maintenir leur disponibilité, leur état et leur redondance. Cependant, de nombreux développeurs préfèrent que leurs piles d'applications et leurs couches de données soient organisées selon les mêmes principes de déploiement rapide et d'automatisation que ceux proposés par des plates-formes telles que Kubernetes.
Cet article vous montrera comment déployer une instance de base de données MySQL sur Kubernetes à l'aide de volumes persistants. Cette fonctionnalité permet aux applications avec état de surmonter la fugacité inhérente aux pods K8s.

Prérequis
- Un cluster Kubernetes avec kubectl installé
- Accès administrateur à votre système
Déploiement MySQL sur Kubernetes
Pour déployer avec succès une instance MySQL sur Kubernetes, créez une série de fichiers YAML que vous utiliserez pour définir les objets Kubernetes suivants :
- Un secret Kubernetes pour stocker le mot de passe de la base de données.
- Un volume persistant (PV) pour allouer de l'espace de stockage à la base de données.
- Une réclamation de volume persistant (PVC) qui réclamera le PV pour le déploiement.
- Le déploiement lui-même.
- Le service Kubernetes.
Étape 1 :Créer un secret Kubernetes
Utilisez un éditeur de texte tel que Nano pour créer le fichier Secret.
nano mysql-secret.yaml
Le fichier définit le secret. Entrez le mot de passe du compte MySQL root dans stringData
section du YAML.
apiVersion: v1
kind: Secret
metadata:
name: mysql-secret
type: kubernetes.io/basic-auth
stringData:
password: test1234
Enregistrez le fichier et quittez. Utilisez kubectl pour appliquer les modifications au cluster.
kubectl apply -f mysql-secret.yaml
Le système confirme la création réussie du secret :

Étape 2 :Créer un volume persistant et une revendication de volume
Créez le fichier de configuration de stockage :
nano mysql-storage.yaml
Ce fichier est composé de deux parties :
- La première partie définit le volume persistant. Personnalisez la quantité de stockage alloué dans
spec.capacity.storage
. Dansspec.hostPath
spécifiez le point de montage du volume. - La deuxième partie du fichier définit le PVC.
apiVersion: v1
kind: PersistentVolume
metadata:
name: mysql-pv-volume
labels:
type: local
spec:
storageClassName: manual
capacity:
storage: 20Gi
accessModes:
- ReadWriteOnce
hostPath:
path: "/mnt/data"
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-pv-claim
spec:
storageClassName: manual
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi
Enregistrez le fichier et quittez.
Ensuite, appliquez la configuration de stockage avec kubectl
.
kubectl apply -f mysql-storage.yaml
Le système confirme la création du PV et du PVC.

Étape 3 :Créer un déploiement MySQL
- Créez le fichier de déploiement. Le fichier de déploiement définit les ressources que le déploiement MySQL utilisera.
nano mysql-deployment.yaml
2. Dans le spec.template.spec.containers
section, spécifiez l'image MySQL :
containers:
- image: mysql:5.6
name: mysql
3. Attribuez la valeur du MYSQL_ROOT_PASSWORD
variable d'environnement au mot de passe que vous avez spécifié dans le secret de l'étape 1 .
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-secret
key: password
4. Connectez le PVC de Étape 2 au déploiement.
volumes:
- name: mysql-persistent-storage
persistentVolumeClaim:
claimName: mysql-pv-claim
5. Dans la section séparée du fichier, définissez le nom et le port du service.
L'intégralité du YAML devrait ressembler à l'exemple ci-dessous :
apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql
spec:
selector:
matchLabels:
app: mysql
strategy:
type: Recreate
template:
metadata:
labels:
app: mysql
spec:
containers:
- image: mysql:5.6
name: mysql
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-secret
key: password
ports:
- containerPort: 3306
name: mysql
volumeMounts:
- name: mysql-persistent-storage
mountPath: /var/lib/mysql
volumes:
- name: mysql-persistent-storage
persistentVolumeClaim:
claimName: mysql-pv-claim
---
apiVersion: v1
kind: Service
metadata:
name: mysql
spec:
ports:
- port: 3306
selector:
app: mysql
Enregistrez le fichier et quittez. Créez le déploiement en appliquant le fichier avec kubectl
:
kubectl apply -f mysql-deployment.yaml
Le système confirme la création réussie du déploiement et du service.

Accéder à votre instance MySQL
Pour accéder à l'instance MySQL, accédez au pod créé par le déploiement.
- Répertorier les pods :
kubectl get pod
2. Trouvez le pod MySQL et copiez son nom en le sélectionnant et en appuyant sur Ctrl+Maj+C :

3. Obtenez un shell pour le pod en exécutant la commande suivante :
kubectl exec --stdin --tty mysql-694d95668d-w7lv5 -- /bin/bash
Le shell du pod remplace le shell principal :

4. Tapez la commande suivante pour accéder au shell MySQL :
mysql -p
5. Lorsque vous y êtes invité, saisissez le mot de passe que vous avez défini dans le secret Kubernetes.
Le shell MySQL apparaît.

Mettre à jour votre déploiement MySQL
Modifiez le fichier YAML approprié pour mettre à jour n'importe quelle partie du déploiement. Appliquez les modifications avec :
kubectl apply -f [filename]
Cependant, gardez à l'esprit les deux limitations suivantes :
- Ce déploiement particulier est pour une instance unique Déploiement MySQL. Cela signifie que le déploiement ne peut pas être mis à l'échelle :il fonctionne sur un seul pod.
- Ce déploiement ne prend pas en charge les mises à jour propagées. Par conséquent, le
spec.strategy.type
doit toujours être défini sur Recréer .
Supprimer votre instance MySQL
Si vous souhaitez supprimer l'intégralité du déploiement, utilisez kubectl
pour supprimer chacun des objets Kubernetes qui lui sont liés :
kubectl delete deployment,svc mysql
kubectl delete pvc mysql-pv-claim
kubectl delete pv mysql-pv-volume
kubectl delete secret mysql-secret
Cette série de commandes supprime le déploiement, le service, le PV, le PVC et le secret que vous avez créés. Le système confirme la suppression réussie :
