Notre cluster étant opérationnel, nous allons découvrir les mécanismes et les outils pour réaliser une supervision de notre installation. En premier lieu, nous allons découvrir le moyen d'interroger à distance le Docker Swarm. Puis dans un deuxième temps, nous allons utiliser les outils proposés par Centreon.
Docker Remote API
Pour communiquer à distance avec notre cluster, nous allons activer la fonction Docker Remote API. Il existe deux méthodes de connexion avec ou sans certificats. La première, que nous allons décrire, n'est pas à utiliser dans un environnement de production.
Configuration du Remote API
Modifiez le fichier systemd de notre Controller (machine Raspberry). Editez le fichier docker.service :
sudo vi /lib/systemd/system/docker.service
Modifiez la ligne suivante
ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:2375 --containerd=/run/containerd/containerd.sock
Rechargez la configuration
sudo systemctl daemon-reload
Redémarrez Docker
sudo systemctl restart docker
-
Limiter l'accès au port 2375
- On peut restreindre la portée de l'écoute du port 2375. Tout d'abord nous allons binder le port à l'adresse 192.168.1.70
ExecStart=/usr/bin/dockerd -H fd:// -H tcp://192.168.1.70:2375 --containerd=/run/containerd/containerd.sock
Nous allons utiliser iptables pour accepter l'adresse IP du serveur de supervision (IP 192.168.1.250) sur le port 2375sudo iptables -A INPUT -i br0 -p tcp --dport 2375 -s 192.168.1.250 -j ACCEPT
Ensuite nous fermons toutes les autres communications sur le port 2375sudo iptables -A INPUT -i br0 -p tcp --dport 2375 -j DROP
N'oubliez pas de sauvegarder votre configuration après les essais.sudo sh -c 'iptables-save > /etc/iptables/rules.v4'
Vérification de l'accès Remote API
Nous pouvons vérifier l'accès à l'API REST avec une commande curl sur notre raspberry
curl -i http://localhost:2375/info
nous obtiendrons les informations suivantes
Les informations sont au format JSON. En utilisant un navigateur compatible, vous pouvez obtenir un affichage plus lisible.
En installant l'utilitaire JQ, nous pouvons récupérer plus facilement certaines informations. Installons le paquet.
sudo apt-get install jq
En installant l'utilitaire JQ, nous pouvons récupérer plus facilement certaines informations. Installons le paquet. Lancez cette ligne de commande pour récupérer le nom de l'OS installé.
curl -s http://localhost:2375/info | jq -r ' {OS: .OperatingSystem } ' { "OS": "Raspbian GNU/Linux 10 (buster)" }
Pour obtenir seulement le résultat, il faudra rajouter une commande précédée d'un pipe.
curl -s http://localhost:2375/info | jq -r ' {OS: .OperatingSystem } | .OS ' Raspbian GNU/Linux 10 (buster)
Les commandes intéressantes pour superviser sont les suivantes :
curl -i http://192.168.1.70:2375/nodes
curl -i http://192.168.1.70:2375/containers/json
curl -i http://192.168.1.70:2375/services
curl -i http://192.168.1.70:2375/networks
curl -i http://192.168.1.70:2375/swarm
curl -i http://192.168.1.70:2375/volumes
Mais il existe de nombreuses commandes pour créer, modifier et supprimer votre configuration docker. Voir le lien suivant sur les commandes Remote API. Cliquez ensuite sur la bonne version de votre docker.
Supervision de notre Cluster Hat
Maintenant que nous avons notre moyen de nous connecter à distance, nous allons utiliser les outils Centreon pour superviser notre Raspberry. Nous partons du principe que vous avez installé les plugins Centreon.
Pour l'instant, nous utiliserons la ligne de commande. Connectez-vous sur votre serveur Centreon. Identifiez-vous en utilisateur centreon-engine, c'est une bonne pratique pour les fichiers temporaires créés dans le dossier /var/lib/centreon/centplugins.
Pour l'instant, nous utiliserons la ligne de commande. Connectez-vous sur votre serveur Centreon. Identifiez-vous en utilisateur centreon-engine, c'est une bonne pratique pour les fichiers temporaires créés dans le dossier /var/lib/centreon/centplugins.
su - centreon-engine
Avec les plugins récupérés à partir du GitHub, Recherchons le plugin correspondant à Docker.
$ /usr/lib/centreon/plugins/centreon_plugins.pl --list-plugin | grep docker PLUGIN: cloud::docker::restapi::plugin (https://docs.docker.com/reference/api/docker_remote_api/).
Sinon avec les plugins Fatpacked, le binaire correspondant se nomme /usr/lib/centreon/plugins/centreon_docker_restapi.pl. Nous l'utiliserons par défaut.
Listons les modes disponibles.
$ /usr/lib/centreon/plugins/centreon_docker_restapi.pl --plugin=cloud::docker::restapi::plugin --list-mode Plugin Description: Check Docker and containers through its HTTPS Remote API (https://docs.docker.com/reference/api/docker_remote_api/). Requirements: Docker 1.12.0+ and Docker API 1.24+ Global Options: --mode Choose a mode. --dyn-mode Specify a mode with the path (separated by '::'). --list-mode List available modes. --mode-version Check minimal version of mode. If not, unknown error. --version Display plugin version. --custommode Choose a custom mode. --list-custommode List available custom modes. --multiple Multiple custom mode objects (some mode needs it). Modes Available: container-usage list-containers node-status
Nous avons trois modes. commençons par le mode node-status en affichant les options avec l'option help. Voici les options propres à ce mode.
Mode: Check node status. --warning-node-status Set warning threshold for status (Default: -) Can used special variables like: %{display}, %{status}, %{manager_status}. --critical-node-status Set critical threshold for status (Default: '%{status} !~ /ready/ || %{manager_status} !~ /reachable|-/'). Can used special variables like: %{display}, %{status}, %{manager_status}. --warning-* Threshold warning. Can be: 'containers-running', 'containers-paused', 'containers-stopped'. --critical-* Threshold critical. Can be: 'containers-running', 'containers-paused', 'containers-stopped'.,
Nous commençons par cette ligne de commande pour tester le plugin. Nous utiliserons le plugins FatPacked par convention.
/usr/lib/centreon/plugins/centreon_docker_restapi.pl --plugin=cloud::docker::restapi::plugin --mode=node-status --hostname=192.168.1.70 --port='2375' OK: Node '192.168.1.70' Containers Running : 4, Containers Stopped : 0, Containers Paused : 0 | 'containers_running'=4;;;0; 'containers_stopped'=0;;;0; 'containers_paused'=0;;;0;
On peut éventuellement paramétrer des seuils critique et warning.
/usr/lib/centreon/plugins/centreon_docker_restapi.pl --plugin=cloud::docker::restapi::plugin --mode=node-status --hostname=192.168.1.70 --port='2375' --warning-containers-stopped=8 --critical-containers-stopped=10 OK: Node '192.168.1.70' Containers Running : 4, Containers Stopped : 0, Containers Paused : 0 | 'containers_running'=4;;;0; 'containers_stopped'=0;0:8;0:10;0; 'containers_paused'=0;;;0;
Le plugin retourne l'adresse IP du serveur Controller. Il indique le nombre de container en cours, arrêté et suspendu. Dans notre cas, il indique le container du visualisateur tournant sur le Controller et un container arrêté. On peut vérifier sur le raspberry en lançant cette commande.
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 5cb18107494f restapi "./getnbhost.sh" 3 hours ago Up 3 hours restapi b936237f9591 worker2 "./rollon.sh" 3 hours ago Up 3 hours worker2 7f05c438b2c6 worker1 "./rollon.sh" 3 hours ago Up 3 hours worker1 c8843256524d serverweb "nginx -g 'daemon of…" 4 hours ago Up 4 hours 0.0.0.0:8080->80/tcp site
Par contre, les containers créés en service sur les workers (PI Zéro) ne sont pas supervisés. La commande suivante sur le Controller affiche plus d'informations.
pi@controller:~ $ docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION 3zqj6io9py3o3iusmncjnn0ed * cbridge Ready Active Leader 19.03.2 f4v1zechz4dj39n5azne107ki p1 Ready Active 19.03.2 m0bvprgj8xdf17571q4gf7mcu p2 Ready Active 19.03.2 u81dy22keqyneegy6i95dyfeb p3 Ready Active 19.03.2 0zdphfuuxrgc38puen0wenjif p4 Ready Active 19.03.2
Néanmoins, avec la commande verbose, on obtient un peu plus d'information. Juste une information erronée, le Controller est en status Leader, le plugin Centreon indique reachable.
/usr/lib/centreon/plugins/centreon_docker_restapi.pl --plugin=cloud::docker::restapi::plugin --mode=node-status --hostname=192.168.1.70 --port='2375' --verbose OK: Node '192.168.1.70' Containers Running : 1, Containers Stopped : 1, Containers Paused : 0 - All node status are ok | 'containers_running'=1;;;0; 'containers_stopped'=1;;;0; 'containers_paused'=0;;;0; Node '192.168.1.70' Containers Running : 1, Containers Stopped : 1, Containers Paused : 0 Node '192.168.1.70/192.168.1.70' status : ready [manager status: reachable] Node '192.168.1.70/192.168.1.71' status : ready [manager status: -] Node '192.168.1.70/192.168.1.72' status : ready [manager status: -] Node '192.168.1.70/192.168.1.73' status : ready [manager status: -] Node '192.168.1.70/192.168.1.74' status : ready [manager status: -]
Arrêtons maintenant un worker sur le ClusterHat.
pi@controller:~ $ clusterhat off p3
Au bout de quelques secondes, lançons la commande.
/usr/lib/centreon/plugins/centreon_docker_restapi.pl --plugin=cloud::docker::restapi::plugin --mode=node-status --hostname='192.168.1.70' --port='2375' CRITICAL: Node '192.168.1.70/192.168.1.71' status : down [manager status: -] | 'containers_running'=1;;;0; 'containers_stopped'=1;;;0; 'containers_paused'=0;;;0;
Le plugin détecte l'arrêt d'un worker en indiquant l'adresse IP du worker et son statut de manager sans plus de précision. Avec le clusterHat, le statut manager pour les workers n'est pas utile. Les PI Zéro ne sont pas prévus pour cette fonction. Pour obtenir plus d'informations, utilisons l'option —verbose (l'exemple ci dessous a deux workers arrêtés).
/usr/lib/centreon/plugins/centreon_docker_restapi.pl --plugin=cloud::docker::restapi::plugin --mode=node-status --hostname='192.168.1.70' --port='2375' --verbose CRITICAL: Node '192.168.1.70/192.168.1.71' status : down [manager status: -] - Node '192.168.1.70/192.168.1.73' status : down [manager status: -] | 'containers_running'=1;;;0; 'containers_stopped'=1;;;0; 'containers_paused'=0;;;0; Node '192.168.1.70' Containers Running : 1, Containers Stopped : 1, Containers Paused : 0 Node '192.168.1.70/192.168.1.70' status : ready [manager status: reachable] Node '192.168.1.70/192.168.1.71' status : down [manager status: -] Node '192.168.1.70/192.168.1.72' status : ready [manager status: -] Node '192.168.1.70/192.168.1.73' status : down [manager status: -] Node '192.168.1.70/192.168.1.74' status : ready [manager status: -]
Le plugin affiche les deux workers arrêtés.
Réglage des seuils
On peut modifier l'état des seuils, par exemple au lieu d'avoir un état critical pour un worker arrêté mais un état warning. Nous ne vérifions que la donnée status.
$ /usr/lib/centreon/plugins/centreon_docker_restapi.pl --mode=node-status --hostname='192.168.1.70' --port='2375' --warning-node-status='%{status} !~ /ready/' --critical-node-status='-' WARNING: Node '192.168.1.70/192.168.1.71' status : down [manager status: -] - Node '192.168.1.70/192.168.1.73' status : down [manager status: -] | 'containers_running'=1;;;0; 'containers_stopped'=1;;;0; 'containers_paused'=0;;;0; centreon-engine@raspberrypi:~$
Les autres modes
Les deux autres modes sont seulement intéressant pour les containers sur le Controller. Le mode list-containers nous servira à retrouver les bonnes informations de container. exemple :
$ /usr/lib/centreon/plugins/centreon_docker_restapi.pl --plugin=cloud::docker::restapi::plugin --mode=list-containers --hostname='192.168.1.70' --port='2375' --verbose List containers: [id = 22a8a7a34d570f3442a4c8d2dd9cefe1286cb3fb287447553e43f3f5a473ca5d] [name = '/viz.1.t79v5pkqaq1io9vkcspixlwkg'] [node = '192.168.1.70'] [state = 'running'] [id = 58e1454e028a0bfee66c68d0e7006c7a3ee2db59658e22232c8fd6e4551e310d] [name = '/web1'] [node = '192.168.1.70'] [state = 'created']
Seul le deuxième peut servir car le premier container est arrêté. On utilise le champ name pour utiliser le mode container-usage
$ /usr/lib/centreon/plugins/centreon_docker_restapi.pl --plugin=cloud::docker::restapi::plugin --mode=container-usage --hostname='192.168.1.70' --port='2375' --container-name='/viz.1.t79v5pkqaq1io9vkcspixlwkg' OK: Container '22a8a7a34d570f3442a4c8d2dd9cefe1286cb3fb287447553e43f3f5a473ca5d' state : running, CPU Usage : 4.89 %, Memory Total: 926.08 MB Used: 37.61 MB (4.06%) Free: 888.47 MB (95.94%), Read IOPs : 0.00, Write IOPs : 0.00 - All container traffics are ok | 'cpu'=4.89%;;;0;100 'memory_used'=39436288B;;;0;971063296 'read_iops'=0.00iops;;;0; 'write_iops'=0.00iops;;;0; 'traffic_in_22a8a7a34d570f3442a4c8d2dd9cefe1286cb3fb287447553e43f3f5a473ca5d.eth0'=12016.00b/s;;;0; 'traffic_out_22a8a7a34d570f3442a4c8d2dd9cefe1286cb3fb287447553e43f3f5a473ca5d.eth0'=6224.00b/s;;;0; 'traffic_in_22a8a7a34d570f3442a4c8d2dd9cefe1286cb3fb287447553e43f3f5a473ca5d.eth1'=0.00b/s;;;0; 'traffic_out_22a8a7a34d570f3442a4c8d2dd9cefe1286cb3fb287447553e43f3f5a473ca5d.eth1'=0.00b/s;;;0;
On récupère l'utilisation du container en cpu, mémoire et réseau. Comme vous le constatez, certaines métriques et l'affichage du output affiche l'id du container. Ce qui n'est pas du tout pratique. Pour éviter cela, on utilise l'option use-name.
$ /usr/lib/centreon/plugins/centreon_docker_restapi.pl --plugin=cloud::docker::restapi::plugin --mode=container-usage --hostname='192.168.1.70' --port='2375' --container-name='/viz.1.t79v5pkqaq1io9vkcspixlwkg' --use-name OK: Container '/viz.1.t79v5pkqaq1io9vkcspixlwkg' state : running, CPU Usage : 3.91 %, Memory Total: 926.08 MB Used: 42.64 MB (4.60%) Free: 883.44 MB (95.40%), Read IOPs : 0.00, Write IOPs : 0.00 - All container traffics are ok | 'cpu'=3.91%;;;0;100 'memory_used'=44711936B;;;0;971063296 'read_iops'=0.00iops;;;0; 'write_iops'=0.00iops;;;0;
On peut aussi utiliser filtre-name pour éviter le slash et filter-counter pour indiquer juste les métriques concernées pour le counter.
$ /usr/lib/centreon/plugins/centreon_docker_restapi.pl --plugin=cloud::docker::restapi::plugin --mode=container-usage --hostname='192.168.1.70' --port='2375' --filter-name='viz' --use-name --filter-counters='cpu' OK: Container '/viz.1.t79v5pkqaq1io9vkcspixlwkg' CPU Usage : 3.40 % | 'cpu'=3.40%;;;0;100
Autre article sur le clusterhat, le déploiement par Ansible.