Guide technique26 juin 202613 min de lecture

    Changer ou ajouter un ring Corosync sur un cluster Proxmox

    Un cluster Proxmox repose sur Corosync pour son quorum. Quand le réseau qui porte le ring tombe — typiquement un lien vRack OVH qui disparaît à cause d'une panne de carte — le cluster vacille. Voici la procédure que nous avons déroulée en production pour ajouter un second ring, basculer la réplication ZFS sur l'IP publique et restaurer le service en mode dégradé, le temps de faire réparer le matériel.

    Le contexte : 2 nœuds OVH, ring sur le vRack

    L'architecture de départ est classique chez OVH : deux serveurs Proxmox interconnectés par un vRack (réseau privé L2 entre serveurs OVH). Corosync utilise ce vRack comme ring unique (link 0), et la réplication ZFS entre les deux nœuds passe par ces mêmes IP privées. L'interface publique, elle, ne porte aucun ring : elle sert le trafic des VM, pas le cluster.

    Avant / après la panne vRack

    Nominal

    Ring 0 = vRack (réseau privé)
    Réplication ZFS sur le vRack
    Interface publique = trafic VM seul
    Quorum : 2/2 nœuds

    Carte vRack en panne

    Ring 0 coupé sur un nœud
    Perte de quorum → /etc/pve en lecture seule
    Réplication ZFS bloquée
    Interface publique toujours up

    Objectif : ajouter l'interface publique comme ring et y rapatrier la réplication ZFS, pour remonter le service sans attendre la réparation de la carte vRack.

    Deux fichiers, deux lecteurs : la base à comprendre

    C'est le point qui fait perdre le plus de temps. Corosync sur Proxmox manipule deux fichiers distincts, lus par des composants différents :

    FichierLu parRôle
    /etc/corosync/corosync.confdaemon corosyncQuorum, transport knet, rings
    /etc/pve/corosync.confmaster pmxcfs + outils PVESource de vérité, propagée au cluster ; remote_node_ip, réplication, migration

    Règle d'or : tant que le cluster est quorate, on édite uniquement /etc/pve/corosync.conf (le master) et pmxcfs propage automatiquement vers le fichier local de chaque nœud. Sans quorum, /etc/pve est en lecture seule : il faut éditer le fichier local et le copier à la main (voir l'étape « mode dégradé »).

    Les pièges qui font perdre 2 h

    • La réplication / migration suit l'IP primaire = ring0_addr, pas l'état runtime de corosync ni /etc/hosts.
    • Le reload à chaud n'applique que si config_version augmente. En cas de doute : restart.
    • Après changement de ring0_addr, pmxcfs garde l'ancienne nodelist en cache : il faut redémarrer pve-cluster pour rafraîchir /etc/pve/.members.
    • Le migration network de datacenter.cfg ne marche que si les IP cibles tiennent dans un seul CIDR. IP publiques dans des /24 disjoints → inutilisable, d'où le choix de mettre le réseau voulu en ring0_addr.

    Étape 1 — Éditer la configuration

    On édite /etc/pve/corosync.conf si on est quorate, sinon /etc/corosync/corosync.conf localement (voir le mode dégradé plus bas). Principes :

    • ring0_addr = lien primaire (celui que suivra la réplication).
    • ring1_addr = lien secours.
    • Déclarer un bloc interface par linknumber utilisé (0 et 1).
    • Incrémenter config_version à chaque édition.

    Avant de choisir la nouvelle version, vérifier celle réellement chargée par le daemon :

    corosync-cmapctl -g totem.config_version

    Dans notre cas, on passe d'un seul ring (vRack) à deux rings en ajoutant l'IP publique. Pour basculer la réplication sur le public, on met l'IP publique en ring0_addr et le vRack (encore vivant sur l'autre nœud) en secours :

    Pour mémoire, voici la configuration de départ (un seul ring sur le vRack), utile pour comparer :

    Étape 2 — Redémarrer Corosync

    Le reload à chaud est capricieux ; on préfère un restart complet qui recharge le fichier quelle que soit la version. À faire sur les deux nœuds :

    systemctl restart corosync          # sur les DEUX nœuds
    corosync-cfgtool -s                 # LINK 0 = primaire, status: connected
    pvecm status                        # Quorate: Yes, sans 'expected 1'

    Étape 3 — Rafraîchir la nodelist pmxcfs

    Indispensable après un changement de ring0_addr : sinon les outils PVE gardent l'ancienne IP en cache et la réplication continue de cibler le vRack mort.

    systemctl restart pve-cluster       # sur les DEUX nœuds
    cat /etc/pve/.members               # les "ip" doivent montrer le nouveau primaire

    On enchaîne avec les autres services PVE pour qu'ils rechargent la topologie :

    systemctl restart pvestatd pvedaemon pveproxy
    # si HA active :
    systemctl restart pve-ha-lrm pve-ha-crm

    Étape 4 — La réplication ZFS bascule sur l'IP publique

    Pourquoi ça suffit

    La réplication ZFS de Proxmox (pvesr) ouvre une session SSH vers l'IP primaire du nœud cible = son ring0_addr. En mettant l'IP publique en ring0 et en redémarrant pve-cluster, les jobs zfs send/recv repartent automatiquement sur le public — sans toucher à la définition des jobs.

    Si les IP des nœuds ont changé, rafraîchir les empreintes SSH du cluster, puis forcer un job pour valider :

    pvecm updatecerts                       # rafraîchit les ssh_known_hosts du cluster
    pvesr run --id <vmid-job> --verbose     # le ssh doit cibler la nouvelle IP publique

    Cas dégradé : plus de quorum du tout

    Si le lien primaire est mort des deux côtés (ou si la panne a déjà fait sauter le quorum avant l'intervention),/etc/pve est en lecture seule et la propagation cluster ne fonctionne plus. Il faut pousser la conf à la main :

    Une fois le nouveau ring établi, le quorum revient (plus besoin de expected 1). On déroule alors les étapes 2 à 4 (restart corosync, pve-cluster et services) pour que pmxcfs reprenne la main et que la réplication reparte.

    Vérification finale

    Checklist de sortie

    • corosync-cfgtool -s : LINK 0 connected sur le bon réseau, LINK 1 listé.
    • pvecm status : Quorate: Yes, sans expected 1 résiduel.
    • cat /etc/pve/.members : les IP affichées sont bien les IP primaires attendues.
    • pvesr run --id <job> --verbose : le SSH cible bien la nouvelle IP et le job réussit.

    Prérequis réseau / firewall

    • corosync / knet = UDP 5405 (jusqu'à 5412). L'ouvrir entre les IP des nœuds, restreint au pair (pas au monde) si on passe par du public.
    • Si on a changé les IP des nœuds : pvecm updatecerts pour régénérer les ssh_known_hosts.
    • Faire passer du quorum sur Internet est un mode dégradé temporaire : latence variable, exposition. À réserver au temps de la réparation vRack, puis revenir au privé en ring0.

    Ce scénario — un nœud OVH qui perd brutalement son lien vRack — est exactement le type d'incident que nous traitons en astreinte pour nos clients. Nous opérons des clusters Proxmox hébergés chez OVHcloud en infogérance : bascule de ring, réplication ZFS, suivi de la réparation matérielle avec le datacenter, retour en nominal.

    Questions fréquentes

    Documentation officielle

    Articles connexes

    Un cluster Proxmox sur OVHcloud à fiabiliser ?

    Nous concevons et opérons des clusters Proxmox redondants (rings multiples, réplication ZFS, HA), et intervenons en astreinte sur les pannes réseau et quorum — vRack OVH compris. Discutons de votre infrastructure.