feat(incus) : l'API d'administration, sur le plan de management #21
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "feat/incus-api"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Un refus repris, et je le dis franchement : l'API Incus avait été écartée le 08/08 au motif d'« une API d'administration de plus sur des routeurs de bordure ». L'analyse confondait deux choses — exposer une API sur DN42, qui reste hors de question, et en exposer une là où
sshdécoute déjà et où Ansible arrive déjà.Elle est nécessaire, pas confortable : le connecteur Ansible
incusexécuteincus execdepuis le contrôleur. Sans elle, un conteneur ne peut pas être un hôte d'inventaire, donc les rôles déjà écrits ne s'y appliquent pas — tout l'objet du passage aux conteneurs.Deux garde-fous plutôt qu'un : le démon se lie à l'adresse de management et jamais au wildcard (que
tcp_l3mdev_accept=1rendrait joignable depuis l'overlay), et la règle restreint aux deux plans privés — pas ànftables_ssh_sources_*, qui valent « partout » par défaut.Le certificat client n'a que sa moitié publique dans le dépôt, comme la chaîne d'AC du rôle openbao. La confiance se compare par empreinte, pas par nom : un certificat remplacé sous le même nom serait sinon tenu pour déjà accordé, et le poste refoulé sans explication.
Mesuré : les quatre nœuds répondent
auth: trusted, la joignabilité du plan de management depuis la maison ayant été vérifiée avant d'ouvrir quoi que ce soit (14,3 ms vers Roubaix, 0,65 ms vers Bordeaux). Écoute confirmée sur<mgmt>:8443.changed=0au second passage.Ligne 19 de la matrice des flux, avec le raisonnement complet.
L'adressage et cloud-init, c'est-à-dire ce qui rend les conteneurs déclaratifs. `topology/containers.yml` décrit un SERVICE, jamais une instance : le placement suit le rôle que les nœuds portent déjà, donc un cinquième routeur aura son conteneur sans qu'une ligne soit écrite. L'adresse en découle : <lan de services du site>::<index>:<id du nœud> Le /64 est partagé par les nœuds d'un site, donc une adresse doit être unique sur DEUX axes : `index` distingue le service, `id` la machine, et les deux sont déjà stables et jamais réutilisés. Lire une adresse dit ce qu'elle est et où elle tourne. L'index est réservé comme as.yml réserve le /27 — l'inventaire refuse un doublon, un index absent, un rôle que personne ne porte, et un nœud sans patte de services. Le conteneur naît configuré, par cloud-init injecté par Incus, exactement comme tofu le fait pour les VM. La variante `cloud` de l'image est nécessaire et non préférée : l'image ordinaire configure eth0 en DHCP — la convention LXC — alors qu'ici eth0 fait face à DN42, qui n'a ni DHCP ni annonces de routeur. Sans elle un conteneur démarre sans aucune adresse, ce qui a été constaté avant d'être corrigé. DEUX DÉFAUTS TROUVÉS EN DÉROULANT, et le second est le plus grave du lot : - La même leçon que `forward`, à payer une seconde fois dans `input` : le bail DHCP et la résolution sont servis par le dnsmasq du nœud, donc ce trafic lui est DESTINÉ. Sans règle, le conteneur n'obtient jamais d'adresse et rien ne le dit — le journal du client montre une absence de réponse, pas un refus. - **`flush ruleset` détruisait la table d'Incus.** Le jeu de règles vidait TOUTES les tables de la machine, y compris `inet incus` où vit le NAT de la sortie des conteneurs, et Incus ne la recrée pas. Un simple `--tags nftables` coupait donc tous les conteneurs du réseau, en silence, le symptôme n'apparaissant qu'au prochain `apt`. Remplacé par le motif idiomatique qui ne vide que notre table. Vérifié : après rechargement, les deux tables coexistent et le conteneur sort toujours. Une garde de ce rôle était fausse et a été corrigée : attendre `python3` ne prouvait rien, l'image `cloud` l'embarquant déjà — cloud-init est écrit en python. Elle rapportait donc un succès sur un conteneur sans la moindre adresse. C'est `cloud-init status --wait`, suivi d'un contrôle explicite de la route par défaut. MESURÉ : quatre conteneurs, adresses `:🅰️1`, `:🅰️3`, `:🅰️2`, `:🅰️4` conformes au schéma, bail DHCP obtenu sur la patte de sortie, un conteneur de Roubaix joint un conteneur de Bordeaux PAR DN42 en 14,9 ms, et un nœud tiers les joint dans la VRF en 13,8 ms. `changed=0` au second passage sur les quatre. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FGwvXLVXJ2PrRFwJTB3Xp9