Kubernetes | Déploiement d'une BD MySQL et Wordpress (PV, PVC, et deployment)

Photo by Growtika on Unsplash

Kubernetes | Déploiement d'une BD MySQL et Wordpress (PV, PVC, et deployment)

LinkedIn | GitLab | GitHub | Credly

Contexte

Ce laboratoire vise à effectuer un déploiement de Wordpress sur un cluster Kubernetes.

Objectifs

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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

  1. 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

Documentation

Volumes Persistants

Installer kubeadm sur ubuntu

Creating a Single Control-Plane Cluster with kubeadm