
Un cluster Incus regroupe plusieurs serveurs sous une seule API : les instances se répartissent sur les nœuds, la configuration est répliquée dans une base distribuée, et un nœud peut tomber sans arrêter le service. Ce guide monte un cluster pas à pas : exposer l'API, activer le clustering, ajouter des nœuds par token, et surtout comprendre le quorum à 3 nœuds et la récupération après panne. Monté et testé sur un cluster 3 nœuds Incus 7.0 (placement --target, migration d'instance, evacuate/restore). Pour qui vise la haute disponibilité.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- Exposer l'API et activer le clustering.
- Ajouter un nœud via un token de join.
- Comprendre le quorum (pourquoi 3 nœuds).
- Maintenir et récupérer un cluster.
Prérequis
Section intitulée « Prérequis »- Des serveurs Incus fraîchement installés, aux versions identiques (un écart de version fait échouer le join).
- Le port 8443 ouvert entre les nœuds.
- Les horloges synchronisées (NTP) : un décalage casse la réplication.
Exposer l'API et activer le clustering
Section intitulée « Exposer l'API et activer le clustering »Par défaut, Incus n'écoute que sur son socket local. Le clustering exige d'exposer l'API sur le réseau avec core.https_address, sinon l'activation échoue (This server is not available on the network) :
incus config set core.https_address=:8443La voie recommandée pour un cluster neuf est incus admin init en répondant yes à « use Incus clustering ». Sur un serveur déjà initialisé, on transforme le démon en cluster single-node :
incus cluster enable node1incus cluster list+-------+-----------------------------+-----------------+--------+-------------------+| NAME | URL | ROLES | STATUS | MESSAGE |+-------+-----------------------------+-----------------+--------+-------------------+| node1 | https://192.168.10.184:8443 | database-leader | ONLINE | Fully operational || | | database | | |+-------+-----------------------------+-----------------+--------+-------------------+Le premier membre porte les rôles database-leader et database : c'est lui qui héberge la base distribuée pour l'instant.
Ajouter un nœud
Section intitulée « Ajouter un nœud »L'ajout se fait en deux temps, avec un token à usage unique.
-
Sur un membre du cluster, générez le token pour le futur nœud :
Fenêtre de terminal incus cluster add node2# Member node2 join token: eyJzZXJ2ZXJf...Le token embarque l'adresse des membres, un secret et l'empreinte du certificat du cluster. Le mécanisme du token de confiance est détaillé dans le guide Accès distant et UI.
-
Sur le nouveau nœud, lancez
incus admin initen répondant yes à « joining an existing cluster » et collez le token. En automatisé (Ansible, cloud-init), un preseed fait le join sans interaction. Il faut d'abord exposer l'API du nœud joignant, sinon le join échoue (voir l'encadré ci-dessous) :Fenêtre de terminal # sur le nœud joignant, AVANT le preseedincus config set core.https_address=192.168.10.50:8443# preseed.yaml sur node2 (192.168.10.50)cluster:enabled: trueserver_address: 192.168.10.50:8443cluster_token: eyJzZXJ2ZXJf...member_config:- entity: storage-poolname: defaultkey: sourcevalue: ""Fenêtre de terminal cat preseed.yaml | incus admin init --preseed
Autre piège fréquent : un token expiré. Un délai trop long entre incus cluster add et le join, ou un redémarrage du serveur entre les deux, invalide le token (erreur No matching cluster join operation found). Consommez le token immédiatement et régénérez-le au besoin ; sa durée de vie se règle via cluster.join_token_expiry.
Le member_config fournit les valeurs spécifiques au nœud (comme la source du pool de stockage) : chaque serveur garde ses propres disques locaux tout en partageant la configuration.
Le quorum : pourquoi 3 nœuds
Section intitulée « Le quorum : pourquoi 3 nœuds »C'est le point à comprendre avant de viser la haute disponibilité. La base distribuée d'Incus (Cowsql, un fork de dqlite) est répliquée par l'algorithme Raft, qui a besoin d'une majorité de votants pour fonctionner.
- Par défaut, 3 membres sont votants (
cluster.max_voters=3). - La base reste disponible tant qu'une majorité est en ligne. Avec 3 votants, le cluster survit à la perte d'un nœud.
- Avec seulement 2 nœuds, il n'y a aucune tolérance de panne réelle (perdre un votant fait perdre la majorité).
La conclusion est nette : un vrai cluster HA commence à 3 nœuds. En dessous, c'est du confort de gestion, pas de la haute disponibilité.
Une fois node2 et node3 joints, incus cluster list montre les trois membres ONLINE. Le rôle database-leader reste sur node1, les deux autres portent database : les trois forment le quorum Raft à 3 voix.
+-------+-----------------------------+-----------------+--------+-------------------+| NAME | URL | ROLES | STATUS | MESSAGE |+-------+-----------------------------+-----------------+--------+-------------------+| node1 | https://192.168.10.184:8443 | database-leader | ONLINE | Fully operational || | | database | | |+-------+-----------------------------+-----------------+--------+-------------------+| node2 | https://192.168.10.50:8443 | database | ONLINE | Fully operational |+-------+-----------------------------+-----------------+--------+-------------------+| node3 | https://192.168.10.199:8443 | database | ONLINE | Fully operational |+-------+-----------------------------+-----------------+--------+-------------------+Placer les instances
Section intitulée « Placer les instances »Sans précision, Incus place une nouvelle instance sur le membre qui en a le moins. On cible un nœud précis avec --target :
incus launch images:debian/13 web1 --target node2incus launch images:debian/13 web2 --target node3incus launch images:debian/13 web3 # placement automatiqueincus list -c ns4L # la colonne LOCATION indique le nœud d'exécutionSur le cluster de test, les deux premières instances atterrissent où on les envoie, la troisième est placée automatiquement sur le nœud le moins chargé (ici node1) :
+------+---------+----------------------+----------+| NAME | STATE | IPV4 | LOCATION |+------+---------+----------------------+----------+| web1 | RUNNING | 10.107.24.164 (eth0) | node2 || web2 | RUNNING | 10.107.24.252 (eth0) | node3 || web3 | RUNNING | 10.107.24.100 (eth0) | node1 |+------+---------+----------------------+----------+Maintenance et récupération
Section intitulée « Maintenance et récupération »Pour intervenir sur un nœud, on l'évacue (ses instances migrent ou s'arrêtent), puis on le restaure :
incus cluster evacuate node2# ... maintenance ...incus cluster restore node2Sur le cluster de test, évacuer node2 migre web1 vers node1 : Incus stoppe l'instance, la déplace, puis marque le nœud EVACUATED. Le membre reste dans le cluster mais n'accepte plus d'instances :
Evacuating cluster member: Stopping "web1" ... Migrating "web1" to "node1"
+-------+-----------------------------+-----------------+-----------+--------------------------------+| NAME | URL | ROLES | STATUS | MESSAGE |+-------+-----------------------------+-----------------+-----------+--------------------------------+| node2 | https://192.168.10.50:8443 | database | EVACUATED | Unavailable due to maintenance |+-------+-----------------------------+-----------------+-----------+--------------------------------+Le restore fait le chemin inverse : web1 remigre vers node2, qui repasse ONLINE. Le comportement d'évacuation se règle par instance via cluster.evacuate (migrate en live si le stockage le permet, stop, ou force-stop).
Pour retirer définitivement un membre (ajoutez --force s'il est injoignable) :
incus cluster remove node2À retenir
Section intitulée « À retenir »- Le clustering exige d'abord d'exposer l'API :
incus config set core.https_address=:8443. - On active avec
incus admin init(recommandé) ouincus cluster enable(single-node). - Un nœud s'ajoute via
incus cluster add(token) puis un join sur le nouveau serveur ; le token est à consommer vite. - La HA réelle demande 3 nœuds (quorum Raft/Cowsql) ; 2 nœuds ne tolèrent aucune panne.
- Versions identiques + NTP obligatoires ; récupération via
recover-from-quorum-loss.
FAQ : questions fréquentes sur le cluster Incus
Section intitulée « FAQ : questions fréquentes sur le cluster Incus »Trois nœuds minimum
La base distribuée d'Incus (Cowsql, fork de dqlite) est répliquée par Raft, qui exige une majorité de votants.- Par défaut, 3 membres sont votants (
cluster.max_voters=3) ; - avec 3 votants, le cluster survit à la perte d'un nœud ;
- avec 2 nœuds, perdre un votant fait perdre la majorité : aucune tolérance de panne.
Token puis join
# sur un membre du cluster
incus cluster add node2 # -> token
# sur le nouveau nœud (interactif ou preseed)
incus admin init --preseed < preseed.yaml
Le token à usage unique embarque l'adresse des membres, un secret et l'empreinte du certificat. Le member_config du preseed fournit les valeurs locales au nœud (comme la source du pool de stockage).Le token a expiré
L'erreurNo matching cluster join operation found vient d'un token expiré ou perdu :- un délai trop long entre
incus cluster addet le join ; - ou un redémarrage du serveur entre les deux.
incus cluster add à nouveau). Sa durée de vie se configure via cluster.join_token_expiry.recover-from-quorum-loss
Si vous perdez la majorité, le cluster devient indisponible. Tant qu'un membre database survit :incus admin cluster list-database
# arrêter incus.service + incus.socket sur tous les survivants
incus admin cluster recover-from-quorum-loss # sur le nouveau leader
# redémarrer incus.socket puis incus.service
Aucune donnée n'est supprimée de la base. C'est la procédure de dernier recours après une panne majeure.