J’ai eu surprise de voir que ma surveillance ne fonctionnait plus avant hier. Pourtant d’après la capture prise vendredi soir tout semblait fonctionner.
Il y a 2 jours la connexion entre mon conteneur Prometheus et les conteneurs prom-node et cAdvisor situés sur des VM étaient devenu impossible. Toute la configuration reseau est du standard à savoir:
- conteneur avec reseau bridge dédié par défaut avec docker-compose
- VM avec reseau NAT par défaut avec virsh/KVM
Un test avec telnet m’a alors montré que depuis la machine hôte on pouvait joindre les conteneurs sur VM avec l’IP des VM gérée par KVM. Cependant depuis le conteneur sur l’hôte si l’accès à l’hôte lui-même était possible, un telnet vers les IP des VM échouait
Il faut dire que tout le paramètrage réseau mis en place par KVM et docker est un peu mystèrieux pour moi et je fais confiance à ceux qui savent plus que moi paramétrer le réseau…
Solution rapide
Comme depuis l’hôte la connexion vers les conteneurs sur VM NAT est possible alors une solution rapide est d’indiquer à Docker de mettre le conteneur Prometheus dans un réseau de type hôte. Dans le fichier docker-compose.yml au même niveau que image ajouter:
network_mode: "host"
Solution pérenne : le réseau overlay
La solution précédente enlève l’isolation reseau du conteneur Prometheus avec l’hôte et cela me gêne. De plus le conteneur grafana ne pouvait plus accéder à prometheus par son nom. Il fallait le faire passer par l’IP de l’hôte.
Une autre solution serait de mettre le conteneur prometheus dans une VM, car les VM se voient entre-elles par défaut. Un test telnet m’avait montré que les conteneurs d’une VM pouvait via l’IP des autres VM accéder aux conteneurs de ces VM.
Cette autre solution me gêne également car elle fait reposer la connectivité sur un paramétrage réseau géré par virsh/KVM. Idealement on voit aisément que les conteneurs dévolus au monitoring doivent être dans le même réseau et ce réseau doit chevaucher plusieurs démons docker sur des hôtes différents. C’est un réseau overlay !
La mise en place du reseau overlay est une opération un peu complexe car il faut initialiser un neoud swarm maître sur l’hôte de prometheus, créer un réseau overlay dédié au monitoring, sur les hôtes de cAdvisor/prom-node il faut déclarer docker comme membre du swarm et enfin indiquer des les fichiers docker-compose que tous les conteneurs doivent utiliser le reseau overlay précédemment créé. Ici on avait créé un réseau appelé monitoring-net
networks:
default:
external:
name: monitoring-net
Je ne suis pas allé au bout de la solution idéale de l’overlay car en créant seulement le reseau overlay et en y mettant prometheus, tout est retombé en marche. Je suis alors revenu en arrière et tout continue de fonctionner comme vendredi soir…. Je n’aime pas quand les choses tombent en marche. Affaire à suivre en gardant ce billet sous le coude.
Tags: Docker prometheus