
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 sur 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 à un seul nœud :
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. Son mécanisme 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 », puis collez le token. En automatisé, avec Ansible ou cloud-init, un preseed fait le join sans interaction. Il faut d'abord exposer l'API du nœud joignant, sinon le join échoue :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, l'invalide avec No matching cluster join operation found. Consommez-le immédiatement, régénérez-le au besoin, et réglez sa durée de vie par 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 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 à chaud si le stockage le permet, sinon 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.Pour aller plus loin
Section intitulée « Pour aller plus loin »- Workers et nœuds distants : étendre ce cluster au-delà du réseau local.
- Stockage partagé CephFS : donner aux instances un volume que tous les nœuds voient.
- Réseau OVN : VPC et load balancers : bâtir des réseaux virtuels par-dessus ce cluster.