MODOP – Cluster KVM HA avec Pacemaker, Corosync, Heartbeat

Inventaire de l’infrastructure HA KVM

3 Machines hyperviseurs KVM

node-kvm01

  • vSwitch : vmbr1
  • ip : 192.168.1.10/24
    • vip : 192.168.1.100
  • OS : RockyLinux
  • vCPU : 2
  • DD : 8Go
  • NFS: ServeurNAS:/clusterKVM
  • Ram : 2Go

node-kvm02

  • vSwitch : vmbr1
  • ip : 192.168.1.11/24
    • vip : 192.168.1.100
  • OS : RockyLinux
  • vCPU : 2
  • DD : 8Go
  • NFS: ServeurNAS:/clusterKVM
  • Ram : 2Go

node-kvm03

  • vSwitch : vmbr1
  • ip : 192.168.1.12/24
    • vip : 192.168.1.100
  • OS : RockyLinux
  • vCPU : 2
  • DD : 8Go
  • NFS: ServeurNAS:/clusterKVM
  • Ram : 2Go

Machines virtuelles KVM

Spécification de la machine virtuelle KVM – node-Centos7

  • Host : node-Centos7
  • vSwitch : vmbr0 de KVM
    • IP :10.20.0.2/24
    • GW :10.20.0.1
    • DNS :192.168.1.1
  • OS : Centos7
  • vCPU : 1
  • DD : 8Go
  • Ram : 1Go

Installation des machines KVM

1°) Update (3 KVM)

[root@node-kvm0x ~]# dnf update -y
[root@node-kvm0x ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
[root@node-kvm0x ~]# setenforce 0

2°) Installation des Epel (3 KVM)

[root@node-kvm0x ~]# rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm

3°) Configure Chrony (NTP) (3 KVM)

[root@node-kvm0x ~]# timedatectl

[root@node-kvm0x ~]# timedatectl list-timezones |grep -i Paris
Europe/Paris
[root@node-kvm0x ~]# timedatectl set-timezone "Europe/Paris"

4°) Configurer la résolution des hosts (3 KVM)

[root@node-kvm0x ~]# echo "192.168.1.10 node-kvm01" >> /etc/hosts
[root@node-kvm0x ~]# echo "192.168.1.11 node-kvm02" >> /etc/hosts
[root@node-kvm0x ~]# echo "192.168.1.12 node-kvm03" >> /etc/hosts

5°) Vérification du réseau  KVM (3 KVM)

[root@node-kvm01 ~]# ping -c 3 node-kvm02
[root@node-kvm01 ~]# ping -c 3 node-kvm03

[root@node-kvm02 ~]# ping -c 3 node-kvm01
[root@node-kvm02 ~]# ping -c 3 node-kvm03
[root@node-kvm03 ~]# ping -c 3 node-kvm01
[root@node-kvm03 ~]# ping -c 3 node-kvm02

Installation HighAvailability des 3 nodes KVM

1°) Activation packet HighAvailability (3 KVM)

[root@node-kvm0x ~]# yum repolist all | grep -i HighAvailability
[root@node-kvm0x ~]# dnf config-manager --set-enabled ha
[root@node-kvm0x ~]# yum repolist all | grep -i HighAvailability
ha Rocky Linux 8 - HighAvailability activé

2°) Installation pacemaker (3 KVM)

[root@node-kvm0x ~]# dnf install pcs pacemaker -y

3°) Mise en place Firewall HighAvailability (3 KVM)

[root@node-kvm0x ~]# firewall-cmd --permanent --add-service=high-availability
[root@node-kvm0x ~]# firewall-cmd --reload

4°) Création « password » pour l’utilisateur hacluster (Défaut Cluster user)

[root@node-kvm0x ~]# passwd hacluster
Nouveau mot de passe : MOT_PASSE_USER_haCluster
Retapez le nouveau mot de passe : MOT_PASSE_USER_haCluster
passwd : mise à jour réussie de tous les jetons d'authentification.

5°) Démarrer le daemon PCS (3 KVM)

[root@node-kvm0x ~]# systemctl enable pcsd.service --now
[root@node-kvm0x ~]# systemctl status pcsd.service

6°) Configurer KVM HighAvailability GUI  (sur node-kvm01)

  • https://IP_Node_kvm01:2224/login


Création du Cluster « Create New »


« Create cluster »


« Use same password for all nodes » et Authenticate »


« Start the cluster » et « Finish »


Sélectionner le Cluster


Les 3 machines sont bien entrées dans le Cluster

Check l’état du cluster (node-kvm01)

[root@node-kvm01 ~]# pcs status

Activer les services pacemaker et corosync (node-kvm02 et node-kmv03)

[root@node-kvm02 ~]# systemctl enable pacemaker
[root@node-kvm03 ~]# systemctl enable corosync

Check le quorum (sur un des nodes)

[root@node-kvm0x ~]# corosync-quorumtool

Ajouter une adresse VIP sur notre Cluster pour le HeartBeat

 « Ressources »


« Add »


Remplir les Champs puis « Option Arguments »


Remplir le « cidr_netmask » et « monitor_retries »
Et « Create ressource »

Correction de BUG d’installation (3 KVM)

Si sur l’interface GUI vous rencontrez le message « BLOCKED » et sur le pcs status « Stopped »
Il faudra désactiver stonith

[root@node-kvm0x ~]# pcs property set stonith-enabled=false

[root@node-kvm0x ~]# ip a show ens18

[root@node-kvm0x ~]# pcs status resources

Check Heartbeat INIT

Passage de node-kvm01 « standby »
[root@node-kvm02 ~]# pcs node standby node-kvm01
[root@node-kvm02 ~]# pcs status

La VIP vient d’être transférée sur l’host node-kvm02 suite au standby du node-kvm01

Passage de node-kvm02 « standby » avec node-kvm01 « standby »

[root@node-kvm03 ~]# pcs node standby node-kvm02
[root@node-kvm03 ~]# pcs status

La VIP se transfert sur le node-kvm03.

Retour des node-kvm02 et node-kvm01
[root@node-kvm03 ~]# pcs node unstandby node-kvm02
[root@node-kvm03 ~]# pcs node unstandby node-kvm01
[root@node-kvm03 ~]# pcs status

Installation des services KVM sur les 3 nodes

1°) Installation KVM et Middleware (3 KVM)

[root@node-kvm0x ~]# dnf -y install qemu-kvm libvirt virt-install

Check Chargement du module kvm (3 KVM)

[root@node-kvm0x ~]# lsmod | grep kvm

[root@node-kvm0x ~]# systemctl enable --now libvirtd
[root@node-kvm0x ~]# systemctl status libvirtd

2°) Création du bridge vmbr0 – Réseau VM (3 KVM)

Création Bridge « vmbr0 » (3 KVM)

[root@node-kvm0x ~]# vi vmbr0.xml
<network>
 <name>private</name>
 <forward mode='nat'/>
 <bridge name='vmbr0' stp='on' delay='0'/>
 <ip address='10.20.0.10' netmask='255.255.255.0'>
 <dhcp>
 <range start='10.20.0.100' end='10.20.0.254'/>
 </dhcp>
 </ip>
</network>

Attacher la configuration du bridge vmbr0 (3 KVM)

[root@node-kvm0x ~]# virsh net-define vmbr0.xml
Réseau private défini depuis vmbr0.xml
[root@node-kvm0x ~]# virsh net-list --all

Activer le Bridge/Réseau sur KVM (3 KVM)

[root@node-kvm0x ~]# virsh net-start private
Réseau private démarré

Activer « Autostart » Bridge/Réseau sur KVM (3 KVM)

[root@node-kvm0x ~]# virsh net-autostart private
Réseau private marqué en démarrage automatique
[root@node-kvm0x ~]# virsh net-list --all

[root@node-kvm0x ~]# route -n

[root@node-kvm0x ~]# ip a show vmbr0

Mount Ressource NFS –  Centraliser les services libvirt KVM

1°) Installation NFS client paquet (3 KVM)

[root@node-kvm0x ~]# yum install nfs-utils
[root@node-kvm0x ~]# showmount --exports ServeurNAS

[root@node-kvm0x ~]# echo "IP_NAS ServeurNAS" >> /etc/hosts
[root@node-kvm0x ~]# mkdir /clusterKVM
[root@node-kvm0x ~]# echo "ServeurNAS:/volume3/DataStoreKVM /clusterKVM nfs defaults 0 0 " >> /etc/fstab
[root@node-kvm0x ~]# mount /clusterKVM

2°) Check montage NFS

[root@node-kvm0x ~]# df -H /clusterKVM

[root@node-kvm01 ~]# mkdir -p /clusterKVM/kvm/{images,iso}

Création Machine virtuelle Centos7 KVM (node-kvm01)

Spécification de la machine virtuelle KVM – node-Centos7

  • Host : node-Centos7
  • vSwitch : vmbr0 de KVM
    • IP :10.20.0.2/24
    • GW :10.20.0.1
    • DNS :192.168.1.1
  • OS : Centos7
  • vCPU : 1
  • DD : 8Go
  • Ram : 1Go

1°) Récupération de l’ISO (node-kvm01)

[root@node-kvm01 ~]# cd /clusterKVM /kvm/iso/
[root@node-kvm01 iso]# dnf -y install wget
[root@node-kvm01 iso]# wget http://mirror.softaculous.com/centos/7.9.2009/isos/x86_64/CentOS-7-x86_64-Minimal-2009.iso

2°) Check le node Actif dans le Cluster (node-kvm01)

[root@node-kvm01 ~]# pcs status

3°) Lancement de la création de la VM (node-kvm01)

[root@node-kvm01 iso]# virt-install --name node01-kvm-el7 --ram 1024 --disk path=/clusterKVM/kvm/images/node-kvm-el7.img,size=8 --vcpus 1 --os-variant rhel7.1 --network bridge=vmbr0 --graphics none --console pty,target_type=serial --location /clusterKVM/kvm/iso/CentOS-7-x86_64-Minimal-2009.iso --extra-args 'console=ttyS0,115200n8 serial'

Procéder à l’installation de la machine…

La machine est désormais installée sur le node-kvm01 et sur le NFS /clusterKVM/kvm/images/

[root@node-kvm02 ~]# ls -al /clusterKVM/kvm/images/node-kvm-el7.img


Machine virtuelle

[root@node-kvm01 ~]# virsh list --all

Centralisation conf du Cluster KVM (3 KVM)

1°) Stopper la machine

[root@node-kvm01 ~]# virsh shutdown node01-kvm-el7

2°) Déplacement de la structure KVM sur NFS

Node-kvm01

[root@node-kvm01 ~]# cp -r /etc/libvirt /clusterKVM/kvm/libvirt
[root@node-kvm01 ~]# mv /etc/libvirt{,-old}
[root@node-kvm01 ~]# cd /etc
[root@node-kvm01 etc]# ln -s /clusterKVM/kvm/libvirt /etc/libvirt
[root@node-kvm01 ~]# ls -al /etc/libvirt

Node-kvm02

[root@node-kvm02 ~]# mv /etc/libvirt{,-old}
[root@node-kvm02 ~]# cd /etc
[root@node-kvm02 etc]# ln -s /clusterKVM/kvm/libvirt /etc/libvirt
[root@node-kvm02 etc]# ls -al /etc/libvirt

Node-kvm03

[root@node-kvm03 ~]# mv /etc/libvirt{,-old}
[root@node-kvm03 ~]# cd /etc
[root@node-kvm03 etc]# ln -s /clusterKVM/kvm/libvirt /etc/libvirt
[root@node-kvm03 etc]# ls -al /etc/libvirt

Check de la centralisation

La conf est désormais centralisé sur le NFS sur /clusterKVM/kvm/libvirt

3°) Check démarrage de la machine sur le node-kvm02

[root@node-kvm02 etc]# virsh start node01-kvm-el7
Domain node01-kvm-el7 started
[root@node-kvm02 etc]# virsh list --all

[root@node-kvm02 etc]# ping -c 3 10.20.0.2

[root@node-kvm02 etc]# ssh -l root 10.20.0.2

La machine est bien actif sur le node-kvm02

Création script KVM HA Fault Server

1°) Structure (node-kvm01)

[root@node-kvm01 home]# cd /etc/libvirt
[root@node-kvm01 libvirt]# mkdir script
[root@node-kvm01 libvirt]# cd script/

2°) Script KVM HA (node-kvm01)

#!/bin/bash

PATH_APP=/clusterKVM/kvm/libvirt/script
LOG_FILE=${PATH_APP}/${HOSTNAME}_check.log
APP_PCS=/sbin/pcs
APP_VIRSH=/usr/bin/virsh

while true
do

####################################################
# Check Nom machine Client et Nom Machine VIP #
####################################################
echo "-----------------------------" >> ${LOG_FILE}
echo " hostname :${HOSTNAME} " >> ${LOG_FILE}
HOST_VIP=`${APP_PCS} status |grep Started |awk -F"Started" '{print $2}'`
echo " Host portant le VIP : ${HOST_VIP} " >> ${LOG_FILE}
echo "" >> ${LOG_FILE}

###################################################
### Check si le client est le client VIP #
###################################################
if [ ${HOSTNAME} == ${HOST_VIP} ]
then
echo "cette machine KVM ${HOSTNAME} est porteur du VIP" >> ${LOG_FILE}
echo "" >> ${LOG_FILE}

#############################################
## Redémarre toutes les machines éteintes #
#############################################
for i in `${APP_VIRSH} list --inactive |grep -v Id |grep -v '^-' |grep '^ '| grep -v 'Nom' | awk '{print $2}'`

do
echo "démarrage de la machine virtuelle :$i" >> ${LOG_FILE}
${APP_VIRSH} start $i
done
else
echo "cette ${HOSTNAME} ne porte pas le VIP"
fi

echo "-----------------------------" >> ${LOG_FILE}

sleep 1

done

3°) Création du service hakvm (3 KVM)

[root@node-kvm0x ~]# vi /etc/systemd/system/hakvm.service
[Unit]
Description=hakvm
Wants=network-online.target
After=network-online.target

[Service]
Type=simple
ExecStart=/etc/libvirt/script/ha_kvm.sh

[Install]
WantedBy=multi-user.target
[root@node-kvm0x ~]# systemctl daemon-reload
[root@node-kvm0x ~]# systemctl enable hakvm.service
Created symlink /etc/systemd/system/multi-user.target.wants/hakvm.service → /etc/systemd/system/hakvm.service.
[root@node-kvm0x ~]# systemctl start hakvm.service
[root@node-kvm0x ~]# systemctl status hakvm.service

Check script KVM HA Fault Server

1°) Inventaire initial

La machine virtuelle « node01-kvm-el7 » et démarrée sur le node Actif « node-kvm01 »

2°) Down Fault Server node-kvm01

Nous allons down la machine node-kvm01 et donc déplacer le VIP sur un nouveau node actif

[root@node-kvm01 ~]# init 0

La machine virtuelle « node01-kvm-el7 » redémarre sur le node actif « node-kvm02 »

[root@node-kvm02 ~]# systemctl status hakvm.service

3°) Down Fault Server node-kvm02

Pour garder le quorum nous redémarrons le node-kvm01.

Nous allons down la machine node-kvm02 (porteur VIP) et donc déplacer le VIP sur un nouveau node actif

[root@node-kvm02 ~]# init 0

La machine virtuelle « node01-kvm-el7 » redémarre sur le node actif « node-kvm01 »

[root@node-kvm01 ~]# systemctl status hakvm.service

Dans notre choix de HA KVM , les machines virtuelles sont redémarrées uniquement sur l’hyperviseur portant la VIP. il est évident que de redémarrer des machines suite à la perte d’un hyperviseur « maître » n’est pas la résilience ultime. En effet , le temps de redémarrer la machine provoque une interruption de service. On abordera ce sujet via la réplication une prochaine fois.

Views: 14

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *