Kubernetes | Déploiement d'une BD MySQL et Wordpress (PV, PVC, et deployment)
Contexte
Ce laboratoire vise à effectuer un déploiement de Wordpress sur un cluster Kubernetes.
Objectifs
Création d'un déploiement MySQL : Nous mettrons en place un déploiement MySQL avec un seul réplica pour gérer notre base de données.
Exposition de MySQL : Un service de type ClusterIP sera créé pour exposer nos pods MySQL, permettant ainsi à d'autres services du cluster de communiquer avec la base de données.
Déploiement de WordPress : Nous configurerons un déploiement WordPress avec les variables d'environnement nécessaires pour se connecter à la base de données MySQL.
Stockage des données WordPress : Le déploiement WordPress sera configuré pour stocker les données dans un volume monté sur le répertoire
/data
d’un des nœuds du cluster, assurant la persistance des données.Exposition de WordPress : Nous créerons un service de type NodePort pour exposer l'interface de WordPress à l'extérieur, rendant le site accessible sur internet.
1. Prérequis : Liste des exigences matérielles et logicielles.
Dans notre cas, nous allons provisionner une instances EC2 s'exécutant sous Ubuntu 20.04 Focal Fossa LTS, grace au provider AWS, à partir delaquelle nous effectuerons toutes nos opérations.
Provisionner une instance EC2 sur AWS à l'aide de Terraform (recommandé)
Provisionner une instance EC2 sur AWS à l'aide d'Ansible
2. Création d'un cluster
Consultez le document Installer kubeadm
Voici une structure détaillée pour la documentation technique sur l'installation de WordPress via Kubernetes :
3. Création du Persistent Volume
nano mysql-pv.yml
Description du manfiest
apiVersion: v1
kind: PersistentVolume
metadata:
name: mysql-pv
labels:
type: local
spec:
capacity:
storage: 3Gi
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
storageClassName: standard
hostPath:
path: /data/mysql-pv
kubectl apply -f mysql-pv.yml
Le Persistent Volume (PV) a été crée
3. Création du déploiement MySQL
3.1. Manifeste PersistentVolumeClaim
nano mysql-pvc.yml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-pvc
spec:
accessModes:
- ReadWriteOnce
volumeMode: Filesystem
resources:
requests:
storage: 2Gi
storageClassName: standard
kubectl apply -f mysql-pvc.yml
3.2. Détails du manifeste de déploiement.
nano mysql-deployment.yml
Contenu du manifest
apiVersion: apps/v1
kind: Deployment
metadata:
name: wordpress-mysql
spec:
replicas: 1
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: mysql:latest
env:
- name: MYSQL_ROOT_PASSWORD
value: "password"
- name: MYSQL_DATABASE
value: "db-acd"
- name: MYSQL_USER
value: "acd"
- name: MYSQL_PASSWORD
value: "devops-acd"
ports:
- containerPort: 3306
volumeMounts:
- name: mysql-data
mountPath: /var/lib/mysql
volumes:
- name: mysql-data
persistentVolumeClaim:
claimName: mysql-pvc
kubectl apply -f mysql-deployment.yml
Nous pouvons vérifier les pods en cours d'exécution :
kubectl get pod
Pod mysql en cours d'exécution
L'on peut vérifier également les détails du pod en cours d'exécution et constater et constater qu'il utiliser bien le PVC déclaré un précédement
kubectl describe pods wordpress-mysql-75b599b99-9d756
3.3. Création du service ClusterIP pour MySQL.
Pour permettre à d'autres pods de communiquer avec MySQL, nous exposerons le déploiement via un service de type ClusterIP.
nano sv-mysql.yml
apiVersion: v1
kind: Service
metadata:
name: sv-mysql
spec:
type: ClusterIP
ports:
- port: 3306
selector:
app: mysql
kubectl apply -f sv-mysql.yml
ClusterIP en cours d'exécution
En entrant la commande ci-dessous, on peut virifier que le ClusterIP est bien exécuté et associé aux pod dont le label est bien "app=mysql"
kubectl describe svc sv-mysql
4. Installation de WordPress
4.1. Création du Persistent Volume
nano wordpress-pv.yml
apiVersion: v1
kind: PersistentVolume
metadata:
name: wordpress-pv
labels:
type: local
spec:
capacity:
storage: 3Gi
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
storageClassName: standard
hostPath:
path: /data/wordpress-pv
kubectl apply -f wordpress-pv.yml
4.2. Manifeste PersistentVolumeClaim pour WordPress
nano wordpress-pvc.yml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: wordpress-pvc
spec:
storageClassName: standard
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 2Gi
kubectl apply -f wordpress-pvc.yml
4.3. Manifest de déploiement de WordPress.
nano wordpress-deployment.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: wordpress
spec:
replicas: 1
selector:
matchLabels:
app: wordpress
template:
metadata:
labels:
app: wordpress
spec:
containers:
- name: wordpress
image: wordpress:latest
env:
- name: WORDPRESS_DB_HOST
value: "sv-mysql" # Doit correspondre au nom du service qui expose MySQL
- name: WORDPRESS_DB_USER
value: "acd" # Doit correspondre à MYSQL_USER
- name: WORDPRESS_DB_PASSWORD
value: "devops-acd" # Doit correspondre à MYSQL_PASSWORD
- name: WORDPRESS_DB_NAME
value: "db-acd" # Doit correspondre à MYSQL_DATABASE
ports:
- containerPort: 80
volumeMounts:
- name: wordpress-storage
mountPath: /var/www/html
volumes:
- name: wordpress-storage
persistentVolumeClaim:
claimName: wordpress-pvc
kubectl get deploy
On peut également vérifier à quel PVC le pod wordpress est rataché
kubectl get pod
ensuite
kubectl describe pods wordpress-6bcf6b499b-92b2z
4.3. Exposition de wordpress
nano sv-wordpress.yml
apiVersion: v1
kind: Service
metadata:
name: wordpress
spec:
type: NodePort
ports:
- port: 80
targetPort: 80
nodePort: 30000
selector:
app: wordpress
kubectl apply -f sv-wordpress.yml
kubectl get services
- Vérification et Tests
En entrant l'ip d'un des nodes suivi du port 30000 dans le navigateur, on accède à la page de configuration de wordpress