supervision : le tableau de bord des conteneurs ne voyait plus un seul conteneur (#203) #204
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!204
Loading…
Reference in a new issue
No description provided.
Delete branch "gabriel/203-conteneurs-invisibles"
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 #203.
Ce qui n'allait pas
Le tableau de bord « EnerVision — conteneurs » était vide de bout en bout, et rien ne le signalait : cible
cadvisorverte, conteneurhealthy, 2 500 séries publiées — mais toutes portantid="/", le cgroup racine. Les requêtes en{name!=""}ne rendaient donc rien, ici comme sur le compteur « conteneurs vivants » du tableau « socle ».La cause n'est pas dans le dépôt : le démon de
ml-stagiaire-02est passé au containerd image store (Docker 29.1.3,Storage Driver: overlayfs,driver-type: io.containerd.snapshotter.v1). La couche d'écriture d'un conteneur n'est plus sous/var/lib/docker/image/; cAdvisor v0.52 ne la trouve pas et écarte chaque conteneur en entier au lieu de publier ce qu'il en sait.Ce qui a été essayé avant d'en arriver là
--disable_metrics=…,disk,diskIO)--containerd-namespace=moby)Ce que fait cette demande
noms-conteneurs(127.0.0.1:9102) : containerd ne connaît pas les noms Docker,namedevient un identifiant de 64 caractères. Le service publiecontainer_nom{name="<id>",nom="ev-grafana"} 1, que les panneaux joignent paron(name) group_left(nom). Même parti querelais-forge: bibliothèque standard, monté dans l'image Python officielle.conteneurs.jsongroupent désormais parnom.tests/ci/test-supervision.shtient le remède en place : lecture de containerd, présence du service, job de collecte, écoute bornée, compilation du script, et aucun panneau regroupant encore par(name).Ce qu'il faut savoir avant de fusionner
ml-stagiaire-02avec un cAdvisor de test hors pile, sur un port séparé (supprimé depuis) — la pile de production n'a pas été touchée. Les critères 1 à 3 du ticket se contrôlent au déploiement suivant.noms-conteneursparle au démon Docker, il en a donc tous les pouvoirs : le:rosur le socket protège le fichier, pas les commandes qu'on y écrit. Il n'appelle qu'une route, en lecture (GET /containers/json), et n'écoute que sur la boucle locale. À dire tel quel si la question vient au jury.Vérification
Éprouvé en local : le script rend bien le format d'exposition attendu contre un faux démon, échappe les guillemets d'un nom, ignore un conteneur sans nom, et reste debout si le démon se tait.
Panne silencieuse : la cible `cadvisor` était `up`, le conteneur `healthy`, et il publiait bien 2 500 séries — mais toutes portaient `id="/"`, le cgroup racine. Aucune ne portait de nom de conteneur, donc les requêtes en `{name!=""}` des tableaux de bord « conteneurs » et « socle » ne rendaient rien : quatre stats à zéro et « No data » partout. La cause n'est pas dans le dépôt. Le démon de ml-stagiaire-02 est passé au containerd image store (Docker 29 : `Storage Driver: overlayfs`, `io.containerd.snapshotter.v1`) : la couche d'écriture d'un conteneur n'est plus sous /var/lib/docker/image/, cAdvisor v0.52 ne la trouve pas, et il écarte chaque conteneur en entier plutôt que de publier ce qu'il en sait. Son journal le disait, une ligne par conteneur et par minute. Deux pistes essayées et écartées : monter en version — v0.52.1 est la dernière publiée — et couper les métriques de disque, qui ne change rien. Reste la lecture directe de containerd, dans le namespace `moby` où Docker range ses conteneurs. Son handler Docker doit être neutralisé au passage, sans quoi il reprend la main sur les mêmes cgroups pour les rejeter. Ce que ça coûte : containerd ne connaît pas les noms Docker, `name` devient un identifiant de 64 caractères. D'où `noms-conteneurs`, qui publie la correspondance identifiant -> nom lisible que les panneaux joignent par `on(name) group_left(nom)`. Même parti que le relais d'alertes : un fichier de bibliothèque standard monté dans l'image Python officielle, écoute bornée à la boucle locale. Il parle au démon Docker et en a donc tous les pouvoirs, mais n'appelle qu'une route, en lecture. Le banc tient désormais le remède en place : la lecture de containerd, la présence du service, le job de collecte, et le fait qu'aucun panneau ne regroupe plus par (name). Aucun contrôle n'aurait attrapé la panne à l'exécution — c'est ce que le manuel documente maintenant, avec le contrôle qui la révèle en une commande. Les panneaux réseau par conteneur restent presque vides, et c'est attendu : nos piles tournent en réseau hôte et n'ont pas de compteurs réseau propres. Leur description le dit désormais au lecteur.