Michael#
Première version stable de syonad/two, orchestrateur réseau et VM mono-nœud.
Fonctionnalités#
API et cycle de vie
API HTTP
/vpcs,/subnets,/vms: création et suppression asynchrones (202 + état en base)États unifiés pour les trois types de ressource :
creating→running→deleting→deleted, avecerroren cas d’échec d’exécution ; suppression autorisée depuisrunningeterrorMigration au démarrage de l’agent : toute ressource restée dans un état transitoire est basculée en
error, la file de travail étant en mémoireArrêt gracieux : serveurs HTTP, puis drainage des workers, puis fermeture de la base. Si le budget d’arrêt est dépassé, la base n’est pas fermée — la rejouer au démarrage suivant vaut mieux que de la fermer sous un écrivain concurrent
Réseau
VPC isolés par network namespace, subnets en mode
vxlanoubridgeDHCP par subnet via instances
dnsmasq@dédiées, entrées ip→mac en base, fichier de baux propre à chaque instanceToutes les routes sont distribuées par l’option 121 : route vers le serveur de metadata, route du VPC, et route par défaut. L’option 3 reste émise pour les clients qui n’implémentent pas la 121
default_routechoisit le next-hop de la route par défaut : l”interface_ipdu subnet par défaut, sinon lagatewayfournie ou celle déduite de l’hostgatewayoptionnelle par subnet, non validée par l’agentIsolation du DHCP par ebtables, redirection du service de metadata par iptables
Machines virtuelles
Plusieurs interfaces réseau par VM, dans un même VPC. La position de l’interface détermine son slot PCI, donc son nom dans le guest ; exactement une interface est primaire et porte la route par défaut et le serveur de metadata
Démarrage QEMU/KVM avec plusieurs disques et ordre de démarrage explicite
Amorçage UEFI optionnel (OVMF), avec magasin de variables par VM
Serveur de metadata cloud-init par VM (
metadata@), sans base de données dans le processusLes VMs survivent à l’arrêt de l’agent : QEMU est lancé hors de son cgroup via
systemd-run
Metadata cloud-init
Objet
metadatadans la création de VM :password,sshkey,user_datauser_datatransmis en base64, ce qui autorise les charges gzip+base64 ; un encodage invalide est refusé en 400, jamais servi vide en silenceUn document fourni est servi verbatim, un document absent retombe sur le modèle par défaut, et un document explicitement vide est servi vide — les trois cas sont distincts
Le compte
syonadn’est créé que si un mot de passe ou une clé est fourni, et reste verrouillé quand seule une clé l’est. L’agent n’impose aucune modification du compte root
Exploitation
Watchdog de cohérence : vérifie périodiquement que les ressources
runningexistent encore sur le système et signale les écarts. Lecture seule, il ne répare jamais. Désactivé par défaut, activé dans le fichier d’exempleAPI d’administration en lecture seule sur la boucle locale, pour inspecter la base
Métriques Prometheus : nombre de VPC, subnets et VMs par état
deploy.shavec profils d’host (kvm), préparation système déléguée àbootstrap_kvm.shUnits systemd et scripts publiés comme assets de release, avec manifeste
SHA256SUMSvérifié au déploiement
Périmètre et limites connues#
Un seul nœud : pas d’ordonnanceur ni de placement entre hyperviseurs
Pas de rollback en cas d’échec partiel d’une création — les ressources réseau orphelines ne sont pas nettoyées automatiquement
API destinée à un appelant logiciel : la validation de cohérence des entrées (CIDR, VXLAN ID, format des noms, joignabilité d’une
gateway) est à la charge de l’appelantLe mode de subnet
public_ipest accepté par l’API et par la sélection des routes DHCP, mais sa mise en place réseau n’existe pas : créer un tel subnet échoue explicitementLes interfaces multiples d’une VM doivent appartenir au même VPC
Le réseau des guests est configuré par le DHCP seul ; le
network-configcloud-init servi est sans effet et ne doit pas être « corrigé » sans mesurer l’impact sur les VM existantesModifier les routes d’une VM déjà démarrée ne prend effet qu’au renouvellement du bail, soit jusqu’à six heures plus tard, ou à son redémarrage
vm/<name>/passwordcontient un hash, stocké en clair en base et restitué par l’API d’administration ; celle-ci est désactivée par défaut et n’écoute que sur la boucle localeL’API de l’agent n’a pas d’authentification : son exposition réseau doit être restreinte
Les packages
internal/netns,netif,qemu,vm,iptablesetebtablesne fonctionnent que sous Linux
Installation#
curl -O https://git.g3e.fr/syonad/two/raw/branch/main/scripts/deploy.sh
bash ./deploy.sh -t 0.1.0 -i # -i : préparation de l'host (paquets, kernel, bridges)
deploy.sh se vérifie lui-même contre la branche et télécharge les binaires, les units et
le manifeste depuis cette release.