Cluster Proxmox — qdevice (3 votes)
Le cluster n'a plus seulement une description en prose : ses dix conteneurs
sont declares dans homelab-config/iac/terraform/, un fichier par conteneur
nomme <VMID>-lxc-<nom>.tf. tofu plan rend No changes. — et le jour ou il
ne le rendra plus, quelqu'un aura modifie un conteneur a la main.
Attention a la portee : un plan vide couvre les conteneurs DECLARES, pas le
cluster entier. Un conteneur cree a la main est invisible a Terraform ; c'est
control-drift-check.sh qui le signale.
Le token API est en lecture seule (PVEAuditor) : une ecriture sur l'API
rend HTTP 403, donc un apply lance par erreur echoue cote Proxmox. Aucun
apply n'a jamais ete execute.
Trois limites a connaitre avant d'envisager l'ecriture — dont le fait que
quatre conteneurs portent un passthrough TUN que le provider ne modelise pas,
et qu'aucun fichier ne declare vm_id. Elles sont sur la page
Derive de configuration et dans
iac/README.md.
Deployé 2026-04-19 suite à incident perte-de-quorum sur cluster 2-node.
Problème initial (2-node)
Cluster Proxmox homelab = 2 nodes (galahad + lancelot), chacun 1 vote. Quorum exige 2/2 votes. Conséquence : si UN node tombe, le survivant a 1/2 → pas de quorum → /etc/pve passe en read-only → aucune action cluster possible (pas de pct start, pas de modif config, pas de backup vzdump, etc.).
Apparaît structurellement a chaque panne d'un node. L'incident 2026-04-19 (lancelot down ~6h) l'a démontré : galahad seul mais paralysé.
Solution : qdevice sur penny
corosync-qnetd tourne sur penny (hors cluster PVE), fournit un 3e vote arbitraire aux 2 nodes PVE. Quorum devient 2/3 — un node peut tomber, le survivant + qdevice = 2/3 = quorate.
Déploiement effectué
Penny (qnetd host)
apt install corosync-qnetd
# firewall
iptables -I INPUT -s 192.168.1.0/24 -p tcp --dport 5403 -j ACCEPT
iptables -I INPUT -s 100.64.0.0/10 -p tcp --dport 5403 -j ACCEPT
iptables-save > /etc/iptables/rules.v4
Galahad + Lancelot (qdevice hosts)
apt install corosync-qdevice
# Config SSH port override pour penny (penny SSH = port 2806 hardened)
cat >> /root/.ssh/config <<EOF
Host 192.168.1.28
Port 2806
StrictHostKeyChecking accept-new
EOF
Setup initial
Depuis UN node PVE (peu importe lequel), une fois :
pvecm qdevice setup 192.168.1.28 -f
Script PVE qui :
- SSH root@penny pour copier les certs corosync
- Généré cert qdevice sur chaque node
- Met a jour
/etc/corosync/corosync.conf(config_version incremente) - Démarre
corosync-qdevice.servicesur chaque node
pvecm qdevice setup utilisé root@qnetd. Si penny a PermitRootLogin no (hardening), enable temporaire via drop-in /etc/ssh/sshd_config.d/99-qdevice-setup.conf avec PermitRootLogin prohibit-password + depose les pubkeys root galahad+lancelot dans /root/.ssh/authorized_keys penny. Revert immédiat après setup.
Vérification
sudo corosync-quorumtool -s
Attendu :
Quorate: Yes
Expected votes: 3
Total votes: 3
Flags: Quorate Qdevice
Membership node list: 1, 2
0x00000001 1 A,V,NMW 192.168.1.18 (local)
0x00000002 1 A,V,NMW 192.168.1.19
0x00000000 1 Qdevice
sudo corosync-qdevice-tool -s
Doit afficher Model: Net + membership list des 2 nodes PVE.
Gain résilience
- Perte d'un node : l'autre + qdevice = 2/3, reste quorate.
/etc/pveRW maintenu. Les LXC du node survivant continuent, on peut même migrer les LXC du node mort si storage partagé. - Perte de penny (qdevice) : les 2 nodes PVE ont 2/3 votes = quorate. Pas d'impact immédiat cluster.
- Double perte (penny + 1 node PVE) : 1/3, KO. Mais c'est un double-fault extrême.
Piège : pmxcfs stuck RO
Voir operations/depannage.md section "pmxcfs stuck read-only". Le qdevice ne previent pas ce bug transitionnel. Après une recovery, si /etc/pve reste RO malgre Quorate: Yes, systemctl restart pve-cluster sur le node revenu.
DR : re-provisioning qnetd
Si penny brule, le cluster reste quorate avec 2/3 temporairement puis passe a 2 votes + 1 vote deficit au prochain hello corosync — re-dimensionnement automatique OK.
Pour restaurer qdevice après re-installation penny :
# Sur penny reinstalle
apt install corosync-qnetd
# Re-open firewall 5403 TCP LAN + Tailscale
# Sur un node PVE (les 2 en fait, les certs sont par-node)
pvecm qdevice remove
pvecm qdevice setup 192.168.1.28 -f
Voir aussi
- Dépannage : pmxcfs stuck RO
- Réseau — topologie 2-node cluster