Introduction
Un cluster Proxmox permet :
- Migration live : déplacer une VM d'un nœud à l'autre sans coupure
- Réplication ZFS : synchroniser les disques entre nœuds toutes les minutes
- Haute disponibilité (HA) : redémarrer automatiquement les VMs sur l'autre nœud en cas de panne
Ce guide couvre une architecture à 2 nœuds + un QDevice (qui agit comme arbitre pour éviter le split-brain).
Prérequis
- 2 serveurs dédiés VeryCloud avec Proxmox VE 8.x installé et identique
- Disques ZFS sur chaque nœud (RAIDZ ou mirror recommandé)
- Réseau privé entre les deux nœuds (vRack ou VLAN)
- Un VPS Debian/Ubuntu tiers comme QDevice (peut être très petit, 1 vCPU / 1 GB RAM)
- Synchronisation NTP active sur tous les nœuds
Étape 1 : Préparation des nœuds
Sur chaque nœud Proxmox, configurez les hostnames et le /etc/hosts :
Nœud 1 (pve01) :
hostnamectl set-hostname pve01
Nœud 2 (pve02) :
hostnamectl set-hostname pve02
Sur les deux nœuds, éditez /etc/hosts :
nano /etc/hosts
Ajoutez :
10.10.10.1 pve01.local pve01
10.10.10.2 pve02.local pve02
Utilisez les IPs du réseau privé (vRack) pour la communication interne du cluster.
Étape 2 : Synchronisation NTP
apt install -y chrony
systemctl enable --now chrony
timedatectl set-timezone Europe/Paris
Vérifiez la dérive :
chronyc tracking
L'écart entre nœuds doit être inférieur à 1 seconde.
Étape 3 : Créer le cluster sur le nœud 1
Sur pve01 uniquement :
pvecm create production-cluster --link0 10.10.10.1
--link0 spécifie l'IP utilisée par Corosync (la couche de communication du cluster).
Vérifiez :
pvecm status
Vous voyez un cluster avec 1 nœud (pve01).
Étape 4 : Joindre le nœud 2 au cluster
Sur pve02 :
pvecm add pve01 --link0 10.10.10.2
Entrez le mot de passe root de pve01. La synchronisation prend ~30 secondes.
Vérifiez sur l'un des deux nœuds :
pvecm status
Doit afficher 2 nœuds, status Quorate.
Étape 5 : Configurer un QDevice (arbitre)
Avec seulement 2 nœuds, en cas de coupure réseau, chaque nœud pense être seul et risque de démarrer les mêmes VMs simultanément (split-brain). Le QDevice résout ce problème.
Sur votre VPS tiers (Debian/Ubuntu) :
apt update
apt install -y corosync-qnetd
Sur les deux nœuds Proxmox :
apt install -y corosync-qdevice
Sur pve01 :
pvecm qdevice setup IP_DU_VPS_QDEVICE
Entrez le mot de passe root du VPS QDevice. Le script configure tout automatiquement.
Vérifiez :
pvecm status
Doit afficher 3 votes au total : 2 nœuds + 1 QDevice.
Étape 6 : Créer les pools ZFS pour la réplication
Sur chaque nœud, créez un pool ZFS identique. Exemple avec un mirror sur 2 disques :
zpool create -f data mirror /dev/sda /dev/sdb
zfs set compression=lz4 data
zfs set atime=off data
Ajoutez le pool dans Proxmox :
Datacenter → Storage → Add → ZFS
- ID :
data - ZFS Pool :
data - Content : Disk image, Container
- Nodes : tous
Faites la même chose sur l'autre nœud, avec le même ID data.
Étape 7 : Créer une VM et la répliquer
Créez une VM sur pve01 en utilisant le pool data pour le disque (voir le tuto précédent pour Windows).
Une fois la VM créée :
VM → Replication → Add :
- Target :
pve02 - Schedule :
*/15(toutes les 15 minutes — ajustable) - Comment :
Replication vers pve02
Cliquez sur Create. Proxmox fait une snapshot ZFS et la transmet à l'autre nœud.
Vérifiez :
zfs list -t snapshot data
Vous voyez des snapshots __replicate_* sur les deux nœuds.
Étape 8 : Migration live
Migrer une VM d'un nœud à l'autre sans interruption :
VM → Migrate
- Target node :
pve02 - Online : coché (migration à chaud)
La migration prend quelques secondes à quelques minutes selon la RAM de la VM. La VM ne s'arrête pas.
Étape 9 : Configurer la haute disponibilité (HA)
Datacenter → HA → Resources → Add :
- VM : sélectionnez l'ID (ex: 100)
- Max. restart : 1
- Max. relocate : 1
- Group : laissez vide ou créez un groupe
- State :
started
Si pve01 tombe, la VM 100 sera automatiquement démarrée sur pve02 (en utilisant la dernière réplication ZFS, donc avec une perte de données potentielle de quelques minutes).
Étape 10 : Test de failover
Simulez une panne de pve01 :
# Sur pve01
shutdown -h now
Sur pve02, surveillez :
ha-manager status
Au bout de 1-2 minutes, vous devez voir la VM 100 redémarrer automatiquement sur pve02.
Une fois pve01 rebooté, la VM peut être ramenée dessus via une migration live.
Dépannage
"no quorum" après la perte d'un nœud
Le QDevice n'est pas configuré ou ne répond pas. Vérifiez sur le QDevice :
systemctl status corosync-qnetd
Et sur les nœuds Proxmox :
systemctl status corosync-qdevice
Réplication ZFS en échec
Erreur la plus courante : pool ZFS avec un nom différent entre les deux nœuds. Tous les noms doivent être identiques (ex: data partout).
Inspectez les logs :
cat /var/log/replicate/100-0.log
Migration live échoue
Vérifiez que la version de Proxmox VE et le kernel sont identiques sur les deux nœuds :
pveversion
uname -r
Mettez à jour si nécessaire :
apt update && apt full-upgrade -y
Cluster "two nodes, no quorum" malgré QDevice
Redémarrez les services :
systemctl restart corosync corosync-qdevice
Commandes utiles
# Statut du cluster
pvecm status
# Lister les nœuds
pvecm nodes
# Status HA
ha-manager status
# Forcer une réplication immédiate
pvesr run --id 100-0
# Lister les snapshots ZFS de réplication
zfs list -t snapshot | grep __replicate
# Quitter un cluster (sur le nœud à retirer)
pvecm delnode pve02
# Vérifier la consommation Corosync
journalctl -u corosync -n 50
Conclusion
Vous disposez maintenant d'un cluster Proxmox robuste, capable de supporter la panne d'un nœud complet sans perte de service significative. C'est une infrastructure de production professionnelle.
Pour aller plus loin :
- Combinez avec Proxmox Backup Server pour des sauvegardes incrémentales déduplicquées (voir le tuto suivant)
- Ajoutez un 3e nœud pour atteindre une véritable HA (sans QDevice)
- Utilisez Ceph au lieu de ZFS pour du stockage distribué synchrone
Ressources
- Documentation cluster Proxmox : https://pve.proxmox.com/wiki/Cluster_Manager
- Réplication ZFS : https://pve.proxmox.com/wiki/Storage_Replication
- Haute disponibilité : https://pve.proxmox.com/wiki/High_Availability
- QDevice : https://pve.proxmox.com/wiki/Cluster_Manager#_corosync_external_vote_support



















