infra : les conteneurs relisent les fichiers du dépôt à chaque déploiement (#176) #177
No reviewers
Labels
No labels
Compat/Breaking
EC01
EC02
EC03
EC04
EC05
EC06
Kind/BDD
Kind/Back
Kind/Bug
Kind/CICD
Kind/Cloud
Kind/Contenu
Kind/Data
Kind/Documentation
Kind/Enhancement
Kind/Feature
Kind/Front
Kind/IA
Kind/Infra
Kind/Monitoring
Kind/Security
Kind/Testing
Portée/Post-jury
Priority
Critical
Priority
High
Priority
Low
Priority
Medium
Reviewed
Confirmed
Reviewed
Duplicate
Reviewed
Invalid
Reviewed
Won't Fix
Status
Abandoned
Status
Blocked
Status
Need More Info
ops/alerte
No milestone
No project
No assignees
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
g2/enervision!177
Loading…
Reference in a new issue
No description provided.
Delete branch "lenaic/176-montages-fichiers"
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?
Ferme #176, sauf le tableau de bord Grafana, qui reste à faire et que je dis à la fin.
Le défaut
Un montage de fichier unique suit l'inode, pas le chemin. Git n'édite jamais un fichier en place : il en écrit un neuf et le renomme. Après un déploiement, le conteneur garde donc l'ancien contenu, et rien ne le signale.
Deux pannes en deux jours, même cause :
blackboxétait dans le fichier côté hôte, absent côté conteneur, et la cinquième alerte du #42 n'avait aucune donnée sur laquelle se déclencher.Ce que ça change
1. La boucle des piles passe
recreate: always. Les piles àbuild: trueétaient déjà recréées par effet de bord de la reconstruction ; le réglage rend la règle explicite et uniforme. Après un déploiement, chaque conteneur exécute les fichiers qui sont dans le dépôt, sans exception.Coût mesuré : quelques secondes d'interruption par pile. Les volumes nommés survivent, le TSDB comme les données PostgreSQL.
2. Notre propre API entre dans les cibles blackbox. Elle en était absente parce que
prometheus.ymlest antérieur à la pileapi, alors que c'est la latence que l'ENF-04 chiffre à 400 ms p95. Sondée sur son écoute directe et non par Caddy, pour mesurer le service et non le proxy.3. Le manuel dit comment reconnaître le cas en deux commandes : le compte diffère entre le fichier de l'hôte et celui que le conteneur lit.
Preuve
Le correctif manuel a déjà été appliqué hier soir pour rétablir la sonde, et l'effet est mesuré :
Cette demande fait en sorte que ça n'ait plus à être fait à la main.
Le banc du rôle garde le réglage, et il est éprouvé en rouge : retirer la ligne
recreate: alwaysle fait échouer sur l'assertion visée.Ce que ça ne fait pas
Le troisième critère du #176, un tableau de bord Grafana montrant disponibilité et latence des sondes, n'est pas ici. Les séries existent maintenant,
probe_successetprobe_duration_seconds; il reste à les afficher. C'est du provisioning Grafana, donc plutôt le terrain de Gabriel, et ça se fait sans toucher à cette demande.Le diagnostic est bon :
./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml:roest bien un montage de FICHIER, git renomme au lieu d'éditer en place, le conteneur garde l'ancien inode. Etrecreate: alwaysrépare au passage quelque chose que la demande ne mentionne pas et qui est plus grave que la configuration : la pileapimonte../../../services/api:/opt/api:roet lance uvicorn sans rechargement, donc jusqu'ici un déploiement ne mettait jamais le nouveau code d'API en service. Ça, c'est un vrai gain.Mais le réglage est posé sur les cinq piles d'un coup, et c'est là que ça coince.
1. Chaque fusion dans develop recrée le conteneur PostgreSQL de production
app_stacksvautpostgres, minio, mlflow, api, supervision. Aucune des trois premières n'a le défaut qu'on répare :et son commentaire dit déjà, en capitales : « UN SEUL MONTAGE, ET DE RÉPERTOIRE — jamais quatre montages de fichiers. Un montage de FICHIER ne suit pas un remplacement par renommage ». Il donne même les deux inodes mesurés sur la machine. Le projet connaissait donc la cause ET le remède avant cette demande ; la base est déjà à l'abri, et elle sera pourtant redémarrée à chaque fusion.
Le coût n'est pas nul : la relève tourne à la minute, la zone argent à
:00, la zone or à:17et:27, les recommandations à:37. Un déploiement tombe forcément au milieu d'une passe. « Quelques secondes d'interruption par pile » n'est pas faux, mais c'est cinq piles, dont la base, à chaque fusion, pour un défaut qui n'en concerne que deux.app_stacksporte déjàbuildetenvpar pile. Unrecreateau même endroit — vrai pourapietsupervision, faux pourpostgres— garde tout le bénéfice sans bouger la base.2. Le remède d'un mot est dans le dépôt et n'est pas appliqué
Le répertoire
infra/compose/supervision/prometheus/ne contient qu'un seul fichier,prometheus.yml. Donc :ferme la cause pour de bon, sans recréer quoi que ce soit, et c'est exactement ce que la pile
postgresrecommande en capitales depuis avant cette demande.3. Sans ça, une promesse du fichier reste fausse
La composition porte toujours :
Ce commentaire n'a jamais été vrai avec un montage de fichier — le rechargement relit l'inode monté, c'est-à-dire l'ancien — et il reste faux après cette demande. Le nouveau runbook envoie d'ailleurs l'exploitant sur
--force-recreate, ce qui en est l'aveu. Soit on monte le répertoire et le commentaire redevient vrai, soit on retire le drapeau et le commentaire.4.
recreate: alwaysrejoue l'amorçage MinIO à chaque déploiementinfra/compose/docker-compose.ymlmonte./minio/init-buckets.sh:/init/init-buckets.sh:ro(montage de fichier, donc concerné) sur un conteneurrestart: "no". Le recréer à chaque passage le relance à chaque déploiement. C'est probablement idempotent, mais c'est un changement de comportement que la demande ne dit pas.5. Le contrôle porte sur le texte, pas sur le comportement
- "'recreate: always' in code_piles"rougirait surrecreate: "always", qui est le même réglage. C'est la même famille que ce que la #174 corrige à côté.Sur le reste : la cible blackbox
http://127.0.0.1:8000/healthest juste — les conteneurs de supervision sont ennetwork_mode: hostet l'API écoute bien sur127.0.0.1:8000de la même machine. Le runbook est clair et les deux commandes de diagnostic sont les bonnes.Ce que je demanderais avant fusion : le
recreatepar pile (point 1) et le montage de répertoire pour Prometheus (point 2). Les deux tiennent en trois lignes et retirent la seule chose qui me gêne, une base de production redémarrée par une fusion.Retour de Gabriel en relecture, et il a raison sur le point qui compte. recreate: always sur les cinq piles recréait le conteneur PostgreSQL DE PRODUCTION à chaque fusion. Or postgres ne porte que des montages de répertoire et de volume : sa composition le dit déjà en capitales, avec les deux inodes mesurés. Il n'a pas le défaut qu'on répare, et le couper pendant que la relève tourne à la minute, la zone argent à :00, la zone or à :17 et :27 et les recommandations à :37, c'est tomber au milieu d'une passe à chaque déploiement. Le drapeau vit maintenant dans app_stacks, à côté de build et env : api vrai monte services/api en lecture seule et lance uvicorn sans rechargement : sans recréation, un déploiement ne mettait jamais le nouveau code d'API en service supervision vrai monte le fichier de règles d'alerte de Grafana postgres faux montages de répertoire, déjà à l'abri minio faux monte init-buckets.sh sur un conteneur restart: no ; le recréer le RELANCE à chaque déploiement mlflow faux reconstruite de toute façon par build: true Et le remède d'un mot, que Gabriel a relevé et qui était dans le dépôt depuis avant cette demande : prometheus/ et blackbox/ sont montés en RÉPERTOIRES. Chacun ne contient qu'un fichier, le montage est strictement équivalent, la cause disparaît sans recréer quoi que ce soit. --web.enable-lifecycle redevient vrai : son commentaire promettait un rechargement à chaud qui relisait l'ancien inode. Le contrôle du banc porte sur le drapeau et non sur un littéral : il cherchait « recreate: always » et aurait rougi sur « recreate: "always" », qui est le même réglage. C'est la faute même que la #174 corrige à côté. Éprouvé en rouge sur trois défauts réintroduits un par un : postgres remis en recréation, l'API privée de la sienne, et la tâche qui ignore le drapeau. ansible-lint profil production, yamllint propre, trois playbooks valides, banc du rôle 16 contrôles, dix bancs verts.Tu as raison sur le point 1, et c'est le seul qui comptait. Corrigé dans
06d0d6f, avec le 2 qui va avec.1. Le drapeau vit maintenant dans
app_stacksTon argument sur la cadence est le bon : relève à la minute, argent à
:00, or à:17et:27, recommandations à:37. Un déploiement tombe forcément au milieu d'une passe, et couper la base pour un défaut qu'elle n'a pas était une bêtise. Tes points 4 et 5 tombent avec.Tu m'apprends au passage que la pile
apimonteservices/apien lecture seule sans rechargement : je n'avais pas vu que le déploiement ne mettait jamais le nouveau code d'API en service. C'est le vrai gain de cette demande, et il est maintenant écrit dedans.2. Le montage de répertoire, et j'ai étendu à blackbox
Chaque répertoire ne contient qu'un fichier, le montage est strictement équivalent, et la cause disparaît sans recréer quoi que ce soit.
blackbox.ymlavait exactement le même défaut, juste au-dessus dans le fichier.Ton point 3 tombe avec :
--web.enable-lifecycleredevient vrai, un rechargement à chaud relit enfin le bon fichier. Le runbook ne renvoie plus sur--force-recreatecomme remède permanent.5. Le contrôle porte sur le drapeau, plus sur un littéral
'item.item.recreate' in code_piles, plus les trois piles vérifiées dansapp_stacks. Tu as raison que chercherrecreate: alwaysaurait rougi surrecreate: "always": c'est la faute même que la #174 corrige à côté, je l'ai refaite en la corrigeant ailleurs.Éprouvé en rouge sur trois défauts réintroduits un par un : postgres remis en recréation, l'API privée de la sienne, la tâche qui ignore le drapeau.
Ce que je ne traite pas
La pile
postgresconnaissait la cause et le remède avant cette demande, et son commentaire le dit mieux que le mien. Je n'y touche pas.ansible-lint profil production, yamllint propre, banc du rôle à 16 contrôles, dix bancs verts.
New commits pushed, approval review dismissed automatically according to repository settings