Un Pi qui démarre sans son disque USB : k3s repart, mais 01_system.yml échoue sur ce nœud et Docker se replie en silence sur la carte SD. Audit, rien d'appliqué
#63
Reference in New Issue
Block a user
La contrainte (fondateur, 2026-09-25)
L'essentiel, ici : k3s, le réseau (DNS, ingress), le control-plane. Chaque Pi démarre sur sa carte SD ; le disque USB (
LABEL=arcodange_500) est monté sur/mnt/arcodange.Audit en lecture seule : dépôt au commit
c2aab58, cluster relevé le 2026-09-25 vers 18 h 30 UTC. Rien n'a été modifié. Réglage demandé en même temps : #64 (ramasse-miettes d'images du kubelet).Réponses courtes
fstab:LABEL=arcodange_500 /mnt/arcodange ext4 defaults,nofail(prepare_disks.yml)data-rootvide posé sur la carte SDdaemon.jsongardedata-root: /mnt/arcodange/docker; le point de montage vide est un dossier de la SD ;docker.servicen'a aucunRequiresMountsForniAfter=sur le montage./var/lib/containerdest sur la SD./var/lib/rancher/k3s,/var/lib/kubelet) est sur la SD. Aucun argument k3s ne nomme le disque. cri-dockerd n'a besoin que dedockerd.01_system.ymléchoue pour ce nœud à l'étape 4, et la factory ne peut plus y reconfigurer ni Docker ni k3sLe playbook échoue à
prepare_disks.ymlSans partition hors
mmcblk0, la tâche « Choisir une partition candidate » évalue[] | sort(attribute='size') | last. Rejoué en local avec la même expression etall_partitions: []:system.ymlenchaîneprepare_disks→system_docker→iscsi_longhorn→system_k3s→k3s_dns→k3s_ssl→k3s_configdans la même exécution. Un hôte en échec est retiré de toutes les pièces suivantes : sur un Pi démarré sans disque,01_system.ymlne touche plus ni à Docker ni à k3s. Jouersystem_k3s.ymlseul passe.Deux cas voisins :
run_onceest le seul garde-fou.target_partition, qui n'a pas été posée. Rejoué en local :'target_partition' is undefined. Le playbook échoue donc aussi dans le cas où il devrait simplement remonter le disque.Rejeux faits avec ansible-core 2.20.5 (le
.venvdu dépôt), surlocalhost, en reprenant les expressions exactes des tâches.Ce qui dépend de
/mnt/arcodangesystem/prepare_disks.yml(nofail)data-rootde Dockersystem/system_docker.yml: posé seulement si le disque est monté au moment du playbook, mais conservé pour toujours (ledaemon.jsonexistant est relu, puis fusionné)/mnt/arcodange/dockervide, sur la SD. Il perd toutes les images et tous les conteneurs, car leurs définitions vivent dans ledata-root. Chaque pod du nœud retélécharge ses images sur la SD. Espace libre relevé sur les SD : pi1 36,8 Go, pi2 61,1 Go, pi3 17,9 Go. ⚠ Si le disque arrive en retard (disque USB lent à tourner) et se monte par-dessus un Docker déjà lancé, ledata-rootvivant est masqué.inventory/group_vars/{gitea,postgres}/home/pi/arcodange/docker_composes/…) ✅. Leurs conteneurs disparaissent avec ledata-root: rien ne tourne avant un nouveaudocker compose updepuis le playbook.system/k3s_config.yml(defaultDataPath: /mnt/arcodange/longhorn),system/iscsi_longhorn.yml(crée le dossier,ignore_errors)default-replica-count= 3), en mode dégradé. Si les trois Pi démarrent sans disque, tous les volumes tombent. D'après la lecture du moniteur de disque de Longhorn (non éprouvé ici), il réécrit unlonghorn-disk.cfgneuf sur la SD et marque le disque NotReady quand l'UUID change.system/k3s_config.yml: plugin CrowdSec lu depuis le PVC Longhorntraefik-plugins-local, avecabortOnPluginFailure: true(#62)degraded. Si aucune réplique n'est servie, Traefik ne démarre pas et*.arcodange.labtombe.03_cicd.yml: caches/mnt/arcodange/gitea-runner-{cache,act}ci-node-playwrightet son conteneur d'épinglage vivent dans ledata-root: ils sont perdus, et les jobs lourds échouent jusqu'au prochain03_cicd./mnt/backupssetup/backup_nfs.yml: RWX Longhorn,nofail,_netdev,x-systemd.automountrecover/longhorn.yml: pré-vol sur/mnt/arcodange/longhornAucune dépendance : Pi-hole et step-ca (installés nativement, sur la SD), le datastore k3s, les données de Gitea et de Postgres.
Propositions, par ordre de valeur
prepare_disks.yml. Poser un faitarcodange_hdd_present. Sans disque étiqueté : message, puismeta: end_host(le nœud reste dans les pièces suivantes). Ne jamais formater une partition sans étiquette sauf demande explicite (-e prepare_disks_allow_format=true). Et ne plus liretarget_partitionquand elle n'a pas été posée.data-rootdevient/var/lib/docker. Quand le disque est là,/mnt/arcodange/dockery est monté en bind : entréefstabenbind,nofail,x-systemd.requires-mounts-for=/mnt/arcodange. Un drop-indocker.serviceajouteAfter=etWants=sur ce montage, pasRequires=: sans disque, Docker démarre quand même, sur la SD. Le montage du disque reçoit unx-systemd.device-timeout=court, pour qu'un disque lent soit attendu avant Docker au lieu de se monter par-dessus lui. Ce que fait systemd quand le disque arrive après le délai reste à vérifier sur un Pi.chattr +i /mnt/arcodange, disque démonté, une seule fois). Plus rien ne peut écrire dans le dossier de la SD quand le disque manque : ni Docker, ni unlonghorn-disk.cfgfantôme, ni les caches du runner. Le montage par-dessus reste possible. Ça suppose la proposition 2, sinon Docker ne démarre plus.allowScheduling: falsesur le disque du nœud (nodes.longhorn.io) quandarcodange_hdd_presentest faux.hostPathsur la SD de pi1, ou une image, rend l'ingress indépendant de tout disque externe. Voir aussi #61.Le plus urgent pour la contrainte est la proposition 1 : c'est elle qui empêche aujourd'hui la factory de reconfigurer k3s. Les propositions 2 et 3 protègent la SD et les données.
🤖 Generated with Claude Code