Lab 06 – Cluster a tre nodi e Corosync
Dipendenze
Sezione intitolata “Dipendenze”- Lab precedenti: Lab 04, con i nodi aggiornati alla stessa versione e l’ora sincronizzata, e Lab 05, per l’accesso SSH con chiave dal DC.
- Server:
desopve01,desopve02edesopve03accesi, senza VM né container; anchedesopve04acceso, solo per configurare la suanic1(resta fuori dal cluster). Un nodo che entra in un cluster non deve avere guest, perché i loro ID potrebbero entrare in conflitto con quelli del cluster. - Rete: la seconda scheda di ogni nodo (
nic1) collegata alla rete172.32.199.0/24. - Credenziali:
root/<password-lab>→ Appendice B.
Obiettivi
Sezione intitolata “Obiettivi”- Capire cosa fanno Corosync, il quorum e il file system del cluster (pmxcfs).
- Preparare una seconda rete per Corosync.
- Creare il cluster
deso-clusterdall’interfaccia web, con due link. - Aggiungere un nodo dall’interfaccia web e uno da riga di comando.
- Diagnosticare lo stato del cluster e verificare cosa succede quando cade un link o un nodo.
Come funziona
Sezione intitolata “Come funziona”I componenti del cluster
Sezione intitolata “I componenti del cluster”Un cluster Proxmox VE è un insieme di nodi che si gestiscono come uno solo: da qualunque nodo vedi e amministri tutti gli altri, e puoi spostare VM e container tra i nodi. Tre componenti lavorano insieme:
| Componente | Cosa fa |
|---|---|
| Corosync | trasporta i messaggi tra i nodi e sa in ogni istante quali nodi sono presenti (membership). Usa il protocollo kronosnet (knet) su UDP, porte 5405-5412 |
Quorum (votequorum) |
ogni nodo ha un voto; il cluster è operativo (quorate) solo se è presente la maggioranza dei voti |
| pmxcfs | il file system del cluster, montato in /etc/pve: configurazioni di VM, storage, utenti e permessi, replicate su tutti i nodi tramite Corosync |
Grazie a pmxcfs, una modifica fatta su un nodo è visibile all’istante su tutti gli altri. Un nodo che perde il quorum rende /etc/pve di sola lettura: così due gruppi di nodi isolati tra loro non possono modificare la stessa configurazione in modo diverso (split brain).
Perché tre nodi e non quattro
Sezione intitolata “Perché tre nodi e non quattro”Con tre nodi il quorum è 2: il cluster sopravvive alla perdita di un nodo qualsiasi. Con quattro nodi il quorum è 3: sopravvive comunque alla perdita di un solo nodo, ma se la rete si divide a metà (due nodi da una parte, due dall’altra) nessuna delle due metà ha la maggioranza e tutto il cluster si ferma. Per i cluster con un numero pari di nodi esiste il QDevice, un voto esterno che fa da arbitro.
Per questo desopve04 resta autonomo: è un secondo “datacenter” che ti servirà per le migrazioni tra cluster (Lab 48) e per confrontare l’installazione su ext4/LVM con quella su ZFS.
Due link per Corosync
Sezione intitolata “Due link per Corosync”Corosync è sensibile alla latenza, non alla banda: se la rete è congestionata (ad esempio da un backup o da una migrazione) i messaggi arrivano in ritardo e i nodi possono credersi isolati. Per questo le best practice prevedono:
- almeno due link su reti diverse, così la caduta di una rete non ferma il cluster;
- un link dedicato solo a Corosync, nei cluster di produzione: lo farai con le VLAN nel lab 22.
Con knet i link lavorano in modalità passive: Corosync ne usa uno alla volta, quello con priorità più alta (di default il numero più basso, quindi il link 0), e passa all’altro in pochi istanti se il primo cade.
| Link | Rete | Indirizzi |
|---|---|---|
| 0 | gestione 172.27.199.0/24 |
vmbr0 dei nodi, .21-.23 |
| 1 | cluster/storage 172.32.199.0/24 |
nic1 dei nodi, .21-.23 |
Procedura
Sezione intitolata “Procedura”1. Configurare la seconda scheda di rete
Sezione intitolata “1. Configurare la seconda scheda di rete”Su ogni nodo nic1 è collegata alla rete 172.32.199.0/24 ma non ha un indirizzo. Configurala dall’interfaccia web su desopve01 e da riga di comando sugli altri nodi.
-
Accedi a
https://desopve01.proxmox.community:8006, selezionadesopve01→ System → Network e fai doppio clic sunic1. -
Inserisci IPv4/CIDR
172.32.199.21/24, lascia vuoto il gateway (la rete è raggiungibile direttamente) e spunta Autostart, così l’interfaccia si attiva all’avvio. Premi OK.
-
La modifica non è ancora attiva: Proxmox VE l’ha scritta in
/etc/network/interfaces.newe mostra in basso le differenze rispetto al file in uso. Premi Apply Configuration e conferma con Yes: il task SRV networking - Reload applica la configurazione conifreloadsenza riavviare il nodo.
-
Sugli altri tre nodi fai lo stesso con
pvesh: il primo comando prepara la modifica, il secondo la applica.root@desopve02 pvesh set /nodes/desopve02/network/nic1 --type eth --cidr 172.32.199.22/24 --autostart 1pvesh set /nodes/desopve02/networkOutput UPID:desopve02:00001497:0001C658:6AF1AFB3:srvreload:networking:root@pam:root@desopve02 ip -br -4 addr show nic1Output nic1 UP 172.32.199.22/24Ripeti su
desopve03(172.32.199.23) edesopve04(172.32.199.24). -
Verifica che i nodi si vedano sulla seconda rete:
root@desopve01 for n in 22 23 24; do ping -c1 -W1 172.32.199.$n | grep "bytes from"; doneOutput 64 bytes from 172.32.199.22: icmp_seq=1 ttl=64 time=1.94 ms64 bytes from 172.32.199.23: icmp_seq=1 ttl=64 time=0.963 ms64 bytes from 172.32.199.24: icmp_seq=1 ttl=64 time=0.906 ms
2. Creare il cluster
Sezione intitolata “2. Creare il cluster”-
Su
desopve01vai su Datacenter → Cluster e premi Create Cluster. -
Compila:
- Cluster Name:
deso-cluster. Massimo 15 caratteri, e non si può cambiare in seguito; - Cluster Network – Link 0: scegli
172.27.199.21dall’elenco; - premi Add e, per il Link 1, scegli
172.32.199.21.
La finestra ricorda la regola dei link: a parità di condizioni vince il numero più basso.

- Cluster Name:
-
Premi Create. Il task genera la chiave di autenticazione di Corosync (
/etc/corosync/authkey), scrive/etc/pve/corosync.confe riavvia Corosync e pmxcfs.
3. Aggiungere desopve02 dall’interfaccia web
Sezione intitolata “3. Aggiungere desopve02 dall’interfaccia web”-
Su
desopve01, in Datacenter → Cluster, premi Join Information. La finestra contiene, codificati in un’unica stringa, l’indirizzo del nodo, l’impronta del suo certificato e la configurazione dei link. Premi Copy Information.
-
Accedi all’interfaccia web di
desopve02(https://desopve02.proxmox.community:8006) e vai su Datacenter → Cluster → Join Cluster. -
Incolla la stringa in Information: indirizzo e impronta si compilano da soli. Inserisci la password di
rootdidesopve01e scegli gli indirizzi locali didesopve02per i due link:172.27.199.22per il link 0 e172.32.199.22per il link 1.
-
Premi Join ‘deso-cluster’. Durante l’adesione il nodo riceve un nuovo certificato e riavvia il servizio web, quindi la finestra del task smette di aggiornarsi dopo Request addition of this node. È normale: attendi qualche secondo, ricarica la pagina e accedi di nuovo. Il log completo del task, in
desopve02→ Task History, è questo:Establishing API connection with host '172.27.199.21'Login succeeded.check cluster join API versionRequest addition of this nodeJoin request OK, finishing setup locallystopping pve-cluster servicebackup old database to '/var/lib/pve-cluster/backup/config-1794224271.sql.gz'waiting for quorum...OK(re)generate node filesgenerate new node certificatemerge authorized SSH keysgenerated new node certificate, restart pveproxy and pvedaemon servicessuccessfully added node 'desopve02' to cluster.TASK OKNota due passaggi. Il nodo salva la sua vecchia configurazione (
backup old database) e la sostituisce con quella del cluster: per questo deve essere vuoto. Poi unisce le chiavi SSH autorizzate: la chiave del DC, che nel lab 05 avevi copiato su ogni nodo, ora sta in un unico file condiviso.
4. Aggiungere desopve03 da riga di comando
Sezione intitolata “4. Aggiungere desopve03 da riga di comando”Dal DC collegati in SSH a desopve03 (con la chiave del lab 05 non serve la password) e usa pvecm add. Il primo argomento è un nodo che fa già parte del cluster; --link0 e --link1 sono gli indirizzi locali del nodo che entra. Il comando chiede la password di root del nodo indicato e, alla prima connessione, ne mostra l’impronta del certificato: confrontala con quella della Join Information e rispondi yes.
ssh root@desopve03.proxmox.communitypvecm add desopve01.proxmox.community --link0 172.27.199.23 --link1 172.32.199.23Please enter superuser (root) password for 'desopve01.proxmox.community': ********************Establishing API connection with host 'desopve01.proxmox.community'The authenticity of host 'desopve01.proxmox.community' can't be established.X509 SHA256 key fingerprint is 14:32:84:88:C7:D8:14:A6:29:17:FA:04:65:09:52:2A:BC:3E:92:77:76:6D:32:04:CB:3F:3A:FC:A5:69:5B:F3.Are you sure you want to continue connecting (yes/no)? yesLogin succeeded.check cluster join API versionRequest addition of this nodeJoin request OK, finishing setup locallystopping pve-cluster servicebackup old database to '/var/lib/pve-cluster/backup/config-1794224432.sql.gz'waiting for quorum...OK(re)generate node filesgenerate new node certificatemerge authorized SSH keysgenerated new node certificate, restart pveproxy and pvedaemon servicessuccessfully added node 'desopve03' to cluster.5. Il cluster nell’interfaccia web
Sezione intitolata “5. Il cluster nell’interfaccia web”-
Ricarica l’interfaccia di
desopve01: nell’albero c’è Datacenter (deso-cluster) con tre nodi. In Datacenter → Cluster vedi nodi, ID, voti e indirizzi dei due link.
-
Datacenter → Summary riassume lo stato: Cluster: deso-cluster, Quorate: Yes, tre nodi online.

Da questo momento puoi gestire tutti e tre i nodi accedendo all’interfaccia di uno qualsiasi.
6. Diagnostica da riga di comando
Sezione intitolata “6. Diagnostica da riga di comando”-
pvecm statusè il primo comando da lanciare in caso di dubbi. ControllaQuorate: Yese il rapporto tra Total votes e Quorum:root@desopve01 pvecm statusOutput Cluster information-------------------Name: deso-clusterConfig Version: 3Transport: knetSecure auth: onQuorum information------------------Date: Mon Nov 9 12:41:44 2026Quorum provider: corosync_votequorumNodes: 3Node ID: 0x00000001Ring ID: 1.dQuorate: YesVotequorum information----------------------Expected votes: 3Highest expected: 3Total votes: 3Quorum: 2Flags: QuorateMembership information----------------------Nodeid Votes Name0x00000001 1 172.27.199.21 (local)0x00000002 1 172.27.199.220x00000003 1 172.27.199.23 -
pvecm nodeselenca i nodi per nome:root@desopve01 pvecm nodesOutput Membership information----------------------Nodeid Votes Name1 1 desopve01 (local)2 1 desopve023 1 desopve03 -
corosync-cfgtool -smostra lo stato di ogni link verso ogni nodo:root@desopve01 corosync-cfgtool -sOutput Local node ID 1, transport knetLINK ID 0 udpaddr = 172.27.199.21status:nodeid: 1: localhostnodeid: 2: connectednodeid: 3: connectedLINK ID 1 udpaddr = 172.32.199.21status:nodeid: 1: localhostnodeid: 2: connectednodeid: 3: connected -
La configurazione di Corosync sta in
/etc/pve/corosync.conf: per ogni nodo un indirizzo per link (ring0_addr,ring1_addr), e intotemil nome del cluster, la modalitàpassivedei link e l’autenticazione cifrata (secauth). Si modifica solo con molta attenzione, incrementandoconfig_version: un errore può fermare l’intero cluster.root@desopve01 cat /etc/pve/corosync.confOutput logging {debug: offto_syslog: yes}nodelist {node {name: desopve01nodeid: 1quorum_votes: 1ring0_addr: 172.27.199.21ring1_addr: 172.32.199.21}node {name: desopve02nodeid: 2quorum_votes: 1ring0_addr: 172.27.199.22ring1_addr: 172.32.199.22}node {name: desopve03nodeid: 3quorum_votes: 1ring0_addr: 172.27.199.23ring1_addr: 172.32.199.23}}quorum {provider: corosync_votequorum}totem {cluster_name: deso-clusterconfig_version: 3interface {linknumber: 0}interface {linknumber: 1}ip_version: ipv4-6link_mode: passivesecauth: ontoken_coefficient: 125version: 2} -
In
/etc/pveogni nodo ha la sua directory, e.membersriporta la vista di pmxcfs. Anche le chiavi SSH autorizzate sono ormai un unico file condiviso, con la chiave dirootdi ogni nodo e quella del DC:root@desopve01 ls /etc/pve/nodesOutput desopve01desopve02desopve03root@desopve01 cat /etc/pve/.membersOutput {"nodename": "desopve01","version": 9,"cluster": { "name": "deso-cluster", "version": 3, "nodes": 3, "quorate": 1 },"nodelist": {"desopve01": { "id": 1, "online": 1, "ip": "172.27.199.21"},"desopve02": { "id": 2, "online": 1, "ip": "172.27.199.22"},"desopve03": { "id": 3, "online": 1, "ip": "172.27.199.23"}}}root@desopve01 cut -d" " -f1,3 /etc/pve/priv/authorized_keysOutput ssh-rsa root@desopve01ssh-ed25519 [email protected]ssh-rsa root@desopve02ssh-rsa root@desopve03
Verifica e test
Sezione intitolata “Verifica e test”Test 1 – Cade il link 1
Sezione intitolata “Test 1 – Cade il link 1”Disattiva nic1 su desopve03, che perde la rete 172.32.199.0/24:
ip link set nic1 downSu desopve01 il link 1 verso il nodo 3 risulta disconnected, ma il cluster resta Quorate con tre voti, perché il link 0 funziona ancora:
corosync-cfgtool -sLocal node ID 1, transport knetLINK ID 0 udp addr = 172.27.199.21 status: nodeid: 1: localhost nodeid: 2: connected nodeid: 3: connectedLINK ID 1 udp addr = 172.32.199.21 status: nodeid: 1: localhost nodeid: 2: connected nodeid: 3: disconnectedpvecm status | grep -E "^Quorate|Total votes"Quorate: YesTotal votes: 3journalctl -u corosync --since "-30 sec" --no-hostname | tail -2Nov 09 12:41:51 corosync[6048]: [KNET ] link: host: 3 link: 1 is downNov 09 12:41:51 corosync[6048]: [KNET ] host: host: 3 (passive) best link: 0 (pri: 1)Riattiva la scheda (ip link set nic1 up): dopo pochi secondi il link torna connected.
Test 2 – Cade la rete di gestione
Sezione intitolata “Test 2 – Cade la rete di gestione”Ora fai cadere il link 0, la rete di gestione. Disattiva nic0 su desopve03, la porta del bridge vmbr0. Una sessione SSH aperta su 172.27.199.23 si interromperebbe, quindi da desopve01 esegui il comando collegandoti all’indirizzo della seconda rete. È la prima connessione SSH verso quell’indirizzo: accept-new ne salva la chiave senza chiedere conferma.
Warning: Permanently added '172.32.199.23' (ED25519) to the list of known hosts.desopve03 non risponde più sulla rete di gestione, ma resta nel cluster: Corosync è passato da solo al link 1.
ping -c1 -W1 172.27.199.23 | grep loss1 packets transmitted, 0 received, 100% packet loss, time 0mspvecm status | grep -E "^Quorate|Total votes"Quorate: YesTotal votes: 3journalctl -u corosync --since "-25 sec" --no-hostname | tail -2Nov 09 12:44:52 corosync[6048]: [KNET ] link: host: 3 link: 0 is downNov 09 12:44:52 corosync[6048]: [KNET ] host: host: 3 (passive) best link: 1 (pri: 1)Riattiva la scheda: Corosync torna al link preferito, il link 0.
journalctl -u corosync --since "-12 sec" --no-hostname | tail -2Nov 09 12:45:05 corosync[6048]: [KNET ] host: host: 3 (passive) best link: 0 (pri: 1)Nov 09 12:45:05 corosync[6048]: [KNET ] pmtud: Global data MTU changed to: 1397Test 3 – Un nodo perde il quorum
Sezione intitolata “Test 3 – Un nodo perde il quorum”Ferma Corosync su desopve03, come se il nodo fosse isolato da entrambe le reti:
systemctl stop corosyncGli altri due nodi hanno 2 voti su 3, cioè il quorum: il cluster continua a funzionare.
pvecm status | sed -n "/Votequorum/,\$p"Votequorum information----------------------Expected votes: 3Highest expected: 3Total votes: 2Quorum: 2Flags: Quorate
Membership information---------------------- Nodeid Votes Name0x00000001 1 172.27.199.21 (local)0x00000002 1 172.27.199.22Il nodo isolato, invece, non può più modificare la configurazione condivisa: /etc/pve è in sola lettura.
touch /etc/pve/prova.txttouch: cannot touch '/etc/pve/prova.txt': Permission deniedRiavvia Corosync (systemctl start corosync): il nodo rientra, ritrovi tre voti e /etc/pve torna scrivibile.
systemctl start corosyncpvecm status | grep -E "^Quorate|Total votes"Quorate: YesTotal votes: 3touch /etc/pve/prova.txt && echo scrittura-ok && rm /etc/pve/prova.txtscrittura-ok-
pvecm statussu qualsiasi nodo:Quorate: Yes,Total votes: 3. -
corosync-cfgtool -s: link 0 e link 1connectedverso tutti i nodi. - L’interfaccia web di un nodo mostra tutti e tre i nodi con lo stato verde.
Stato finale del lab
Sezione intitolata “Stato finale del lab”- Cluster
deso-clustercondesopve01(ID 1),desopve02(ID 2) edesopve03(ID 3), un voto ciascuno, quorum 2. - Corosync su due link: link 0
172.27.199.0/24(vmbr0), link 1172.32.199.0/24(nic1). nic1configurata su tutti e quattro i nodi (172.32.199.21-.24).desopve04resta un nodo autonomo, fuori dal cluster.- Chiavi SSH autorizzate condivise tra i nodi del cluster in
/etc/pve/priv/authorized_keys.
Cosa hai imparato
Sezione intitolata “Cosa hai imparato”- Il ruolo di Corosync, del quorum e di pmxcfs, e perché un nodo senza quorum mette
/etc/pvein sola lettura. - Perché un cluster dovrebbe avere un numero dispari di voti, e quando serve un QDevice.
- Come creare un cluster e aggiungere nodi dall’interfaccia web e con
pvecm add. - Come leggere lo stato del cluster con
pvecm statusecorosync-cfgtool -s. - Che un secondo link mantiene il cluster in piedi quando cade una rete.