[incident] supervision : le tableau de bord des conteneurs ne voit plus aucun conteneur #203
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
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
g2/enervision#203
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
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?
Symptôme observé
Le tableau de bord Grafana « EnerVision — conteneurs » est vide de bout en bout : « Conteneurs vivants » à 0, « CPU cumulé » à 0, « RAM cumulée » à 0 B, et « No data » sur les quatre panneaux par conteneur. Le compteur du tableau de bord « socle » affiche 0 pour la même raison.
Rien ne signale la panne : les huit cibles Prometheus sont vertes,
ev-cadvisoresthealthy, il répond, et il publie même 2 500 séries — mais toutes portentid="/", le cgroup racine. Aucune ne porte de nom de conteneur, donc les requêtes en{name!=""}ne rendent rien.Journal de
ev-cadvisor, une ligne par conteneur et par minute :Comment le reproduire
https://grafana.g2.enervision/d/enervision-conteneurs/— tout est à zéro.curl -s 127.0.0.1:9101/metrics | grep '^container_last_seen'→ une seule ligne,id="/".docker logs ev-cadvisor→ le rejet ci-dessus pour chacun des vingt conteneurs.Ce qui a été tenté
up, sans erreur de collecte. Ce n'est donc pas un problème de collecte, et c'est ce qui rend la panne silencieuse.--disable_metrics=…,disk,diskIO), au cas où le rejet ne viendrait que de la couche d'écriture : sans effet, les conteneurs restent rejetés.--containerd=…/containerd.sock --containerd-namespace=moby) : les vingt conteneurs remontent, avec CPU, RAM et E/S.Cause trouvée
Le démon de
ml-stagiaire-02est en Docker 29.1.3 et range ses images avec le containerd image store :docker infodonneStorage Driver: overlayfsetdriver-type: io.containerd.snapshotter.v1. Dans ce mode,/var/lib/docker/image/overlayfs/layerdb/n'existe pas — les couches sont chez containerd.cAdvisor v0.52 cherche la couche d'écriture à cet emplacement pour chaque conteneur découvert par l'API Docker, échoue, et écarte le conteneur en entier. Il ne lui reste que le cgroup racine à publier.
Ce n'est pas une régression du dépôt : la pile de supervision n'a pas changé, c'est le démon en dessous.
Correction appliquée
Faire lire containerd à cAdvisor (namespace
moby, socket déjà atteignable par/var/run, déjà monté) et neutraliser son handler Docker, qui prendrait sinon la main sur les mêmes cgroups pour les rejeter.Contrepartie : containerd ne connaît pas les noms Docker —
namedevient l'identifiant de 64 caractères. Un servicenoms-conteneurs(script de bibliothèque standard monté danspython:3.12-alpine, même parti querelais-forge) publiecontainer_nom{name="<id>",nom="ev-grafana"} 1sur127.0.0.1:9102, que les panneaux joignent paron(name) group_left(nom).Critères d'acceptation
curl -s 127.0.0.1:9101/metrics | grep -c '^container_last_seen'rend au moins autant de lignes quedocker ps -q | wc -l, et non plus une seule.ev-api,ev-grafana, …), jamais par un identifiant hexadécimal ; ses quatre stats et ses trois panneaux par conteneur portent des valeurs.docker ps -q | wc -l.127.0.0.1, et son port figure au plan d'adressage dedocs/EXIGENCES-collectives.md§8.tests/ci/test-supervision.shéchoue si cAdvisor reperd sa lecture de containerd, si le job de correspondance disparaît deprometheus.yml, ou si un panneau conteneur revient à une requête sans jointure de nom.Vérification :
bash tests/ci/test-supervision.sh, et le contrôle manuel des critères 1 à 3 sur le serveur.Deux points connus, hors périmètre de ce ticket
:rosur le socket protège le fichier, pas les commandes qu'on y écrit. Il n'appelle qu'une seule route, en lecture (GET /containers/json), et n'écoute que sur la boucle locale.Temps perdu
1 h
Exigence servie : ENF-08 (Observabilité). Épreuve : EC04.