Dans cette documentation nous allons voir ensemble comment mettre en place une infrastructure de haute disponibilité basée sur un cluster Proxmox VE composé de deux nœuds utilisant un stockage local ZFS avec réplication entre les serveurs ainsi qu'un QDevice pour le Quorum.
Cette configuration nous permettra d'avoir une infrastructure résiliente tout en conservant la simplicité d’administration propre à Proxmox.
L'environnement Proxmox que j'utilise pour faire cette documentation est un environneent virtuel.
C'est à dire que les serveurs Proxmox que je vais utiliser sont des VMs cependant la procédure reste identique avec du matériel physique.
L'objectif de cette documentation est de montrer les différentes étapes de la préparation des serveurs jusqu’à la mise en place de la réplication des machines virtuelles.
Nous verrons donc ensemble :
L'idée est d’obtenir une continuité de service, une réplication automatique des machines virtuelles et une capacité de bascule maîtrisée.
ATTENTION : Je ne montrerai pas comment faire l'installation des serveurs Proxmox. Je pars du principe que les deux serveurs sont déjà installés.
Idéalement il faut à minima deux interfaces réseau sur les serveurs Proxmox :
Exemple :
| Usage | Interface | IP |
|---|---|---|
| Management | vmbr0 | 192.168.60.x |
| Cluster | vmbr1 | 192.168.70.x |
Voici un exemple de la configuration réseau nécessaire pour créer le Cluster.
On y retrouvera nos deux cartes réseau ainsi que les subnets dédiés à chacune d'elles.
Cette configuration est à mettre dans /etc/network/interfaces et sera a faire sur les deux serveurs en prennant évidemment soin de ne pas utiliser les mêmes adresses sur les deux nœuds.
auto lo
iface lo inet loopback
iface ens192 inet manual
iface ens224 inet manual
auto vmbr0
iface vmbr0 inet static
address 192.168.60.1/24
gateway 192.168.60.254
bridge-ports ens192
bridge-stp off
bridge-fd 0
auto vmbr1
iface vmbr1 inet static
address 192.168.70.1/24
bridge-ports ens224
bridge-stp off
bridge-fd 0
Avant de commencer la configuration nous allons procéder à quelques vérifications sur nos deux serveurs Proxmox.
Il est impératif que les serveurs soient correctement configurés et qu'ils puissent communiquer ensemble sur le réseau.
Personnellement je vais le faire en SSH sur les serveurs mais il est tout à fait possible de le faire depuis le shell de l'interface graphique.
nano /etc/hostname


nano /etc/hosts


Je vais utiliser deux réseaux pour avoir deux liens pour corosync.
Je vais donc vérifier que les deux serveurs puissent comminiquer sur ces deux réseaux.
# Fichier hosts
ping Nested-Cluster1-Prox9-02

# Second réseau pour corosync
ping 192.168.70.2

# Fichier hosts
ping Nested-Cluster1-Prox9-01

# Second réseau pour corosync
ping 192.168.70.1

ATTENTION : Le cluster Corosync dépend fortement de la résolution DNS/hosts et de la stabilité du réseau.
apt update && apt full-upgrade
reboot
Il existe de nombreuses options et de nombreux types de pool de stockage ZFS.
Je ne les expliquerai pas ici cependant si cela vous intéresse, vous trouverez des informations dans la documentation Configurer un pool ZFS dans Proxmox
Pour les besoins de cette documentation j'ai ajouté sur chacun des deux nœuds 3 disques de 40Go et je vais mettre en place un pool ZFS de type "RAIDZ".








lsblklsblk

zpool create -f REPLI-ZFS raidz /dev/sdb /dev/sdc /dev/sdd

| Éléments | Descriptions |
|---|---|
zpool create |
Création d’un pool ZFS |
-f |
Force la création |
REPLI-ZFS |
Nom du pool |
raidz |
Type de RAID ZFS (un disque de parité) |
/dev/sdb /dev/sdc /dev/sdd |
Disques à utiliser |
zpool status

La ligne "raidz1-0" indique que le pool ZFS est correctement créé en "RAIDZ" et donc avec un disque de parité.
zfs set compression=lz4 REPLI-ZFS

zfs set atime=off REPLI-ZFS

| Options | Bénéfices |
|---|---|
compression=lz4 |
Compression rapide et efficace |
atime=off |
Réduction des écritures disque |
Attention, la création d'un pool ZFS avec la commande zpool create ne signifit pas pour autant qu’il sera visible automatiquement dans l’interface web du serveur PVE.
pvesm add zfspool REPLI-ZFS --pool REPLI-ZFS

Le pool sera ainsi visible et disponible dans l'inventaire à gauche.






Attendre la fin de la tâche de création.

Le Cluster sera visible dans la partie de droite.





Pour créer le Cluster en utiliant les lignes de commande (CLI) il faudra effectuer les manipulations suivantes :
# Sur le premier serveur Proxmox
pvecm create Cluster-Name

Une fois la commande passée on peut vérifier que le Cluster est correctement créé à l'aide de la commande suivante : pvecm status
Le résultat sera comme ceci :

Une fois le Cluster créé il faudra en suite ajouter le second serveur Proxmox
# Sur le second serveur Proxmox
pvecm add 192.168.60.1 # adresse IP du premier serveur PVE

Après avoir ajouté le second serveur Proxmox au Cluster, les deux serveur seront visibles depuis leur interface graphique.

Il sera également possible de vérifier le Cluster avec les commandes suivantes :
pvecm nodes

pvecm status

Nous venons créer un Cluster et d'ajouter le second nœud cependant le réseau utilisé ne correspond pas à celui que nous avons configuré et qui sera dédié à Corosync.
Pour utiliser le réseau dédié nous allons devoir faire quelques modifications.
/etc/pve/corosync.confAVANT
nodelist {
node {
name: Nested-Cluster1-Prox9-01
nodeid: 1
quorum_votes: 1
ring0_addr: 192.168.60.1
}
node {
name: Nested-Cluster1-Prox9-02
nodeid: 2
quorum_votes: 1
ring0_addr: 192.168.60.2
}
}
APRES
nodelist {
node {
name: Nested-Cluster1-Prox9-01
nodeid: 1
quorum_votes: 1
ring0_addr: 192.168.70.1 # <== ICI
}
node {
name: Nested-Cluster1-Prox9-02
nodeid: 2
quorum_votes: 1
ring0_addr: 192.168.70.2 # <== ICI
}
}
ATTENTION : Pour que la modification soit prise en compte il faudra redémarrer le service corosync sur chacun des nœuds :
systemctl restart corosync
Nous pouvons vérifier que la modification a bien été prise en compte en utilisant à nouveau la commande pvecm status

apt install corosync-qnetd


systemctl enable corosync-qnetd && systemctl start corosync-qnetd

systemctl status corosync-qnetd

Le service doit être à l'état "active (running)".
Si ce n'est pas le cas vous avez un problème qu'il faudra corriger.
ss -tulnp | grep 5403

Nous allons devoir faire les manipulations suivantes sur les deux serveurs PVE qui composent actuellement le Cluster.
apt install corosync-qdevice

Valider la confirmation des packages en tapant soit "o" soit "y" selon la langue de l'OS.
pvecm qdevice setup <IP_QDEVICE>


Cette commande effectue plusieurs actions importantes :
Nous allons à présent vérifier le fichier "corosync.conf" et s'assurer que tout est en order.
Ouvrir le fichier "corosync.conf"
cat /etc/pve/corosync.conf
Après l'ajout du service dans le cluster Proxmox le fichier devrait comporter ces lignes :

Pour information : Cette section indique que le cluster utilise un vote externe.
Pour vérifier la configuration globale du Cluster il faudra taper cette commande :
pvecm status
Nous devrions avoir ce résultat :

Les certificats sont stockés dans :
/etc/corosync/qdevice/net/

Ils permettent l’authentification entre les nœuds et le QDevice.
Pour simuler une panne je vais éteindre le premier serveur Proxmox du Cluster.
shutdown now
Puis, depuis le second serveur Proxmox, je vais vérifier l'état du Cluster.
pvecm status
Si tout c'est correctement passé le quorum doit être maintenu grâce au QDevice.

Rallumer le premier serveur Proxmox.
Pour tester le réseau et vérifier que tout fonctionne correctement en cas de panne nous allons simuler une coupure réseau vers un nœud.
Depuis le premier serveur Proxmox taper la commande suivante :
ip link set vmbr1 down
Si tout se passe correctement, le Cluster fonctionne toujours.
systemctl enable pve-ha-lrm
systemctl enable pve-ha-crm
systemctl start pve-ha-lrm
systemctl start pve-ha-crm
systemctl status pve-ha-lrm
systemctl status pve-ha-crm
Les services doivent être actifs.

Tous les fichiers du HA sont dans le répertoire /etc/pve/ha/
/etc/pve/ha/resources.cfg/etc/pve/ha/manager_statusha-manager add vm:100

ha-manager status

ha-manager set vm:100 --max_restart 5 --max_relocate 2

CRM (Cluster Resource Manager)
LRM (Local Resource Manager)
Ces composants communiquent via Corosync.
journalctl -u corosync
journalctl -u pve-ha-lrm
journalctl -u pve-ha-crm
corosync-qdevice-tool -s
La réplication dans Proxmox utilise "snapshots ZFS", "zfs send" et "zfs receive".
Elle est "incrémentale", automatisée et très efficace.
ATTENTION : Dans Proxmox VE, la réplication ZFS fonctionne par VM (ou CT).
Il sera donc nécessaire de faire un job de réplicaton par VM ou par CT.
Si vous avez 10 VMs il faudra donc créer 10 jobs de réplication.

Le reste des paramètre peut être laissé par défaut à moins que l'on souhaite brider le débit de la réplication.
Dans ce cas il faudra configurer le paramètre "Rate Limit (MB/s)"

Dans cet exemple, la réplication se fera toutes les 15 minutes.


pvesr create-local-job 100-0 Nested-Cluster1-Prox9-02 --schedule "*/15"
| Éléments | Descriptions |
|---|---|
| pvesr | Proxmox replication |
| create-local-job | Commande de création du job |
| 100-0 | ID du CT ou de la VM suivi d'un ID de réplication |
| Nested-Cluster1-Prox9-02 | Le nœud ciblé |
| --schedule | Fréquence |

pvesr list

zfs list -t snapshot

Pour vérifier que tout est fonctionnel, nous allons faire un test de migration en simulant une panne sur le premier serveur PVE. Pour rappel, c'est lui qui porte actuellement la VM de test.
shutdown -h now



