Histoire

Il y a plus d'un mois, j'éprouvais toutes sortes de problèmes de réseau à la maison, d'importantes pertes de paquets, des pannes de réseau complètes, etc. Ils étaient fallacieux, imprévisibles et difficiles à diagnostiquer. Je ne savais pas si c’était mon ordinateur de bureau/ordinateur portable, mon téléphone, mon réseau sans fil ou mon fournisseur Internet.  J'ai donc décidé de mettre un Raspberry Pi 3 sur mon réseau avec InfluxDB, telegraf et grafana avec certains moniteurs de réseau en place.

J'ai besoin de données dans le temps car les problèmes que je voyais étaient sporadiques.  Je l’ai utilisé au cours du mois écoulé pour résoudre de nombreux problèmes et désormais, je le peaufine avec une nouvelle configuration sur un Raspberry Pi 3 toujours, mais avec Docker cette fois.

Préface

Ces instructions sont définies pour un Mac et un Pi 2 ou 3 à l’aide de Raspbian 9 Stretch. Cela suppose que vous connaissiez les bases de l'exécution de Linux et d'un Raspberry Pi.  

La configuration initiale

Nous téléchargeons d’abord Etcher et l’image raspbian. Nous l'utilisons pour déposer l'image sur la carte SD utilisée dans le Pi. Nous voulons l'image lite, mais l'image complète peut également fonctionner correctement.

Après avoir démarré vos deux Raspberry Pi 3 et activé SSH, vous pourrez prendre la main via le terminal de votre Mac sur ceux-ci.

Docker

On installe Docker sur RPI avec la simple commande :

pi@raspberrypi:~ $ curl -sSL https://get.docker.com | sh

Puis on vérifie si tout fonctionne avec :

pi@raspberrypi:~ $ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
pi@raspberrypi:~ $

Montons désormais le cluster Swarm.

Création du Cluster Swarm

Un cluster swarm est composé de Managers chargés de l'orchestration du cluster et des Workers qui exécutent vos containers.

- Initialisation du cluster Swarm (la machine ou le cluster swarm sera initialisé deviendra Manager):

docker swarm init --advertise-addr <ip du host>

La commande devrait vous renvoyer quelque chose comme ci-dessous:

pi@raspberrypi:~ $ sudo docker swarm init --advertise-addr 192.168.1.95
Swarm initialized: current node (2bkgolamxq3hj7jt222ws59h4) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-3ycdu75d1l9o7am2puqrceu7bbqabo0n8dihq06fpwwozu2q1z-0ctx6e9jwtzlshjmrymy5eub8 192.168.1.95:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

Sur le deuxième Raspberry Pi branché en réseau en avec SSH activé, il faut saisir :

docker swarm join --token SWMTKN-1-3ycdu75d1l9o7am2puqrceu7bbqabo0n8dihq06fpwwozu2q1z-0ctx6e9jwtzlshjmrymy5eub8 192.168.1.95:2377
This node joined a swarm as a worker.

On vérifie nos noeuds :

pi@raspberrypi:~ $ sudo docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
2bkgolamxq3hj7jt222ws59h4 *   raspberrypi         Ready               Active              Leader              18.09.0
v3s9jmpdq3k6q3wv38wcl8ewj     raspberrypi         Ready               Active                                  18.09.0

Déploiement d'Influx DB

Pour cela, nous utilisons un conteneur pré-construit: https://github.com/hypriot/rpi-influxdb

pi@raspberrypi:~ $ sudo docker run -d --volume=/var/influxdb:/data -p 8086:8086 hypriot/rpi-influxdb
Unable to find image 'hypriot/rpi-influxdb:latest' locally
latest: Pulling from hypriot/rpi-influxdb
4dafb6abed6e: Pull complete
df30b47d7954: Pull complete
0ce100592e45: Pull complete
a0f100c51b3c: Pull complete
9e0908cbe276: Pull complete
d33a04a179ae: Pull complete
10a0b709b88a: Pull complete
82da330ecbf1: Pull complete
553412c7ed8e: Pull complete
54ea67ac1cf6: Pull complete
0450eef22fb5: Pull complete
44b4077e7d98: Pull complete
Digest: sha256:f4c799390a50dacb367c2e007f5b8be8394a4dc04fdcd47fa2ddc8a10424d7b9
Status: Downloaded newer image for hypriot/rpi-influxdb:latest
2309144d187eb4d01e70fd98272984c1811ef430858af372965b76016621ed60

Et maintenant, nous avons influxdb qui tourne :

pi@raspberrypi:~ $ sudo docker ps
CONTAINER ID        IMAGE                  COMMAND                  CREATED             STATUS              PORTS                    NAMES
2309144d187e        hypriot/rpi-influxdb   "/usr/bin/entry.sh /…"   5 minutes ago       Up 5 minutes        0.0.0.0:8086->8086/tcp   keen_bose

Nous devons maintenant suivre le reste des instructions pour initialiser la base de données influxdb.

pi@raspberrypi:~ $ sudo docker exec -it 2309144d187e /usr/bin/influx
Connected to http://localhost:8086 version 1.2.2
InfluxDB shell version: 1.2.2
> CREATE DATABASE db1
> SHOW DATABASES
name: databases
name
----
_internal
db1

> USE db1
Using database db1
> CREATE USER root WITH PASSWORD 'passhere' WITH ALL PRIVILEGES
> GRANT ALL PRIVILEGES ON db1 TO root
> SHOW USERS
user admin
---- -----
root true

> exit

Mise en place de Telegraf

Nous allons utiliser telegraf en tant qu’agent local pour collecter des statistiques et des mesures. https://hub.docker.com/r/arm32v7/telegraf/  Nous devons utiliser la version arm32v7.

pi@raspberrypi:~ $ sudo docker run --net=container:2309144d187e arm32v7/telegraf
2019-01-25T14:19:12Z I! Starting Telegraf 1.9.2
2019-01-25T14:19:12Z I! Using config file: /etc/telegraf/telegraf.conf
2019-01-25T14:19:12Z I! Loaded inputs: inputs.processes inputs.swap inputs.system inputs.cpu inputs.disk inputs.diskio inputs.kernel inputs.mem
2019-01-25T14:19:12Z I! Loaded aggregators:
2019-01-25T14:19:12Z I! Loaded processors:
2019-01-25T14:19:12Z I! Loaded outputs: influxdb
2019-01-25T14:19:12Z I! Tags enabled: host=2309144d187e
2019-01-25T14:19:12Z I! [agent] Config: Interval:10s, Quiet:false, Hostname:"2309144d187e", Flush Interval:10s
^C2019-01-25T14:20:27Z I! [agent] Hang on, flushing any cached metrics before shutdown


Générons maintenant un fichier de configuration que nous pouvons monter dans le conteneur.

pi@raspberrypi:~ $ sudo docker run --rm arm32v7/telegraf telegraf config > telegraf.conf

Et nous pouvons le modifier si nécessaire, mais nous ne le ferons pas encore, mais nous pouvons maintenant exécuter le conteneur monté avec le fichier de configuration local.

pi@raspberrypi:~ $ docker run --net=container:2309144d187e -v $PWD/telegraf.conf:/etc/telegraf/telegraf.conf:ro arm32v7/telegraf
2019-01-25T14:21:11Z I! Starting Telegraf 1.9.2
2019-01-25T14:21:11Z I! Using config file: /etc/telegraf/telegraf.conf
2019-01-25T14:21:11Z I! Loaded inputs: inputs.diskio inputs.kernel inputs.mem inputs.processes inputs.swap inputs.system inputs.cpu inputs.disk
2019-01-25T14:21:11Z I! Loaded aggregators:
2019-01-25T14:21:11Z I! Loaded processors:
2019-01-25T14:21:11Z I! Loaded outputs: influxdb
2019-01-25T14:21:11Z I! Tags enabled: host=2309144d187e
2019-01-25T14:21:11Z I! [agent] Config: Interval:10s, Quiet:false, Hostname:"2309144d187e", Flush Interval:10s
^C2019-01-25T15:31:10Z I! [agent] Hang on, flushing any cached metrics before shutdown

Configuration Grafana

Plus récemment, des conteneurs Grafana docker sont désormais disponibles sur le Hub de docker, ce qui facilite considérablement cette tâche.

https://hub.docker.com/r/fg2it/grafana-armhf/

pi@raspberrypi:~ $ sudo docker run -i -p 3000:3000 --name grafana fg2it/grafana-armhf:v4.1.2
Unable to find image 'fg2it/grafana-armhf:v4.1.2' locally
v4.1.2: Pulling from fg2it/grafana-armhf

Nous pouvons maintenant tester en tapant sur le noeud final Grafana et en vous connectant avec admin: admin  

Voila

Pousser le tout en one-shot

Jusqu'à présent, nous avons maîtrisé les bases du démarrage des trois packages logiciels pour s'assurer que tout fonctionnait bien, mais nous devons maintenant les reconfigurer pour fonctionner ensemble et démarrer automatiquement au démarrage. Après cela, nous pouvons commencer à personnaliser notre configuration.

Tout d'abord, nous devons arrêter tous les conteneurs que nous avons en cours d'exécution. Les premières étapes consistaient simplement à s'assurer que tout fonctionnait bien.

pi@raspberrypi:~ $ sudo docker ps
CONTAINER ID        IMAGE                  COMMAND                  CREATED             STATUS              PORTS                    NAMES
2309144d187e        hypriot/rpi-influxdb   "/usr/bin/entry.sh /…"   About an hour ago   Up About an hour    0.0.0.0:8086->8086/tcp   keen_bose
pi@raspberrypi:~ $ sudo docker stop 2309144d187e
2309144d187e

Comme nous ne prévoyons que d’exécuter la surveillance sur ce pi, nous ne pouvons utiliser que la mise en réseau des hôtes Docker.  Démarrez influxdb en utilisant le réseau hôte.

pi@raspberrypi:~ $ sudo docker run --rm -d --name=influxdb --net=host --volume=/var/influxdb:/data hypriot/rpi-influxdb
fa3985ce565b677d3702aefc65364a76fa14d8c31efe7f7ec013e398d343f801

Et lancer telegraf :

pi@raspberrypi:~ $ sudo docker run --rm -d --net=host --name telegraf -v $PWD/telegraf.conf:/etc/telegraf/telegraf.conf:ro arm32v7/telegraf
7e53a3d3659f465ed7fc3e736b988ec3c40ee3d8032ca040628bf78077b04370

Commençons par créer un stockage persistant pour grafana :

pi@raspberrypi:~ $ sudo docker run -d -v /var/lib/grafana --name grafana-storage busybox:latest
Unable to find image 'busybox:latest' locally
latest: Pulling from library/busybox
c79064c22828: Pull complete
Digest: sha256:7964ad52e396a6e045c39b5a44438424ac52e12e4d5a25d94895f2058cb863a0
Status: Downloaded newer image for busybox:latest
6f074dd138ae3dd4e5e4dd864b9a7fc605990086d1816121076f3ebe62a14704

Et puis exécutez grafana avec le stockage persistant :

pi@raspberrypi:~ $ sudo docker run --rm -d --net=host --name grafana --volumes-from grafana-storage fg2it/grafana-armhf:v4.1.2
docker: Error response from daemon: Conflict. The container name "/grafana" is already in use by container "225ce383870644adb46106b9177b28b42f22f6b81731404cf0972c8dd6861a73". You have to remove (or rename) that container to be able to reuse that name.
See 'docker run --help'.
pi@raspberrypi:~ $ sudo docker rm 225ce383870644adb46106b9177b28b42f22f6b81731404cf0972c8dd6861a73
225ce383870644adb46106b9177b28b42f22f6b81731404cf0972c8dd6861a73

Vous constaterez le message d'erreur nous annonçant que le containeur Grafana est déjà existant et doit être supprimé, on le supprime donc avec docker rm puis on relance la commande initiale :

pi@raspberrypi:~ $ sudo docker run --rm -d --net=host --name grafana --volumes-from grafana-storage fg2it/grafana-armhf:v4.1.2
2b40cdc0ba96ae59e2719b4456e2e403671feb9c603aa9e4b476d1f054956e9c

Et ça fonctionne :)

Vérifier l'installation

Avant de procéder à la surveillance, nous devons vérifier que l’installation fonctionne.  D'abord, nous pouvons suivre tous les journaux du menu fixe.

pi@raspberrypi:~ $ docker logs influxdb
=> Starting InfluxDB ...
=> No database need to be pre-created
exec influxd -config=${CONFIG_FILE}

 8888888           .d888 888                   8888888b.  888888b.
   888            d88P"  888                   888  "Y88b 888  "88b
   888            888    888                   888    888 888  .88P
   888   88888b.  888888 888 888  888 888  888 888    888 8888888K.
   888   888 "88b 888    888 888  888  Y8bd8P' 888    888 888  "Y88b
   888   888  888 888    888 888  888   X88K   888    888 888    888
   888   888  888 888    888 Y88b 888 .d8""8b. 888  .d88P 888   d88P
 8888888 888  888 888    888  "Y88888 888  888 8888888P"  8888888P"

[I] 2019-01-25T15:32:31Z InfluxDB starting, version 1.2.2, branch master, commit 1bcf3ae74c6b9c4897dab68d513d056277eb24f7
[I] 2019-01-25T15:32:31Z Go version go1.7.4, GOMAXPROCS set to 4
[I] 2019-01-25T15:32:31Z Using configuration at: /etc/influxdb/influxdb.conf
[I] 2019-01-25T15:32:31Z Using data dir: /data/data service=store
[I] 2019-01-25T15:32:31Z reading file /data/wal/telegraf/autogen/2/_00001.wal, size 1131622 engine=tsm1 service=cacheloader
[I] 2019-01-25T15:32:31Z reading file /data/wal/_internal/monitor/1/_00001.wal, size 1491198 engine=tsm1 service=cacheloader
[I] 2019-01-25T15:32:32Z reading file /data/wal/telegraf/autogen/2/_00002.wal, size 0 engine=tsm1 service=cacheloader
[I] 2019-01-25T15:32:32Z /data/data/telegraf/autogen/2 database index loaded in 3.440354ms service=shard
[I] 2019-01-25T15:32:32Z /data/data/telegraf/autogen/2 opened in 921.022242ms service=store
[I] 2019-01-25T15:32:32Z reading file /data/wal/_internal/monitor/1/_00002.wal, size 0 engine=tsm1 service=cacheloader
[I] 2019-01-25T15:32:32Z /data/data/_internal/monitor/1 database index loaded in 4.144154ms service=shard
[I] 2019-01-25T15:32:32Z /data/data/_internal/monitor/1 opened in 1.385708635s service=store
[I] 2019-01-25T15:32:32Z opened service service=subscriber
[I] 2019-01-25T15:32:32Z Starting monitor system service=monitor
[I] 2019-01-25T15:32:32Z 'build' registered for diagnostics monitoring service=monitor
[I] 2019-01-25T15:32:32Z 'runtime' registered for diagnostics monitoring service=monitor
[I] 2019-01-25T15:32:32Z 'network' registered for diagnostics monitoring service=monitor
[I] 2019-01-25T15:32:32Z 'system' registered for diagnostics monitoring service=monitor
[I] 2019-01-25T15:32:32Z Starting precreation service with check interval of 10m0s, advance period of 30m0s service=shard-precreation
[I] 2019-01-25T15:32:32Z Starting snapshot service service=snapshot
[I] 2019-01-25T15:32:32Z Storing statistics in database '_internal' retention policy 'monitor', at interval 10s service=monitor
[I] 2019-01-25T15:32:32Z Starting continuous query service service=continuous_querier
[I] 2019-01-25T15:32:32Z Starting HTTP service service=httpd
[I] 2019-01-25T15:32:32Z Authentication enabled:false service=httpd
[I] 2019-01-25T15:32:32Z Listening on HTTP:[::]:8086 service=httpd
[I] 2019-01-25T15:32:32Z Starting retention policy enforcement service with check interval of 30m0s service=retention
[I] 2019-01-25T15:32:32Z Sending usage statistics to usage.influxdata.com
[I] 2019-01-25T15:32:32Z Listening for signals
[I] 2019-01-25T15:32:40Z CREATE DATABASE telegraf service=query
[httpd] ::1 - - [25/Jan/2019:15:32:40 +0000] "POST /query HTTP/1.1" 200 62 "-" "Telegraf/1.9.2" 732ee841-20b6-11e9-8001-000000000000 5992
[httpd] ::1 - - [25/Jan/2019:15:33:00 +0000] "POST /write?db=telegraf HTTP/1.1" 204 0 "-" "Telegraf/1.9.2" 7f1a6535-20b6-11e9-8002-000000000000 103488
[httpd] ::1 - - [25/Jan/2019:15:33:10 +0000] "POST /write?db=telegraf HTTP/1.1" 204 0 "-" "Telegraf/1.9.2" 851079a6-20b6-11e9-8003-000000000000 28068
[httpd] ::1 - - [25/Jan/2019:15:33:20 +0000] "POST /write?db=telegraf HTTP/1.1" 204 0 "-" "Telegraf/1.9.2" 8b054296-20b6-11e9-8004-000000000000 33049
[httpd] ::1 - - [25/Jan/2019:15:33:30 +0000] "POST /write?db=telegraf HTTP/1.1" 204 0 "-" "Telegraf/1.9.2" 90fbb1c7-20b6-11e9-8005-000000000000 43655

Telegraf

pi@raspberrypi:~ $ docker logs telegraf
2019-01-25T15:32:39Z I! Starting Telegraf 1.9.2
2019-01-25T15:32:39Z I! Using config file: /etc/telegraf/telegraf.conf
2019-01-25T15:32:40Z I! Loaded inputs: inputs.processes inputs.swap inputs.system inputs.cpu inputs.disk inputs.diskio inputs.kernel inputs.mem
2019-01-25T15:32:40Z I! Loaded aggregators:
2019-01-25T15:32:40Z I! Loaded processors:
2019-01-25T15:32:40Z I! Loaded outputs: influxdb
2019-01-25T15:32:40Z I! Tags enabled: host=raspberrypi
2019-01-25T15:32:40Z I! [agent] Config: Interval:10s, Quiet:false, Hostname:"raspberrypi", Flush Interval:10s

Grafana

pi@raspberrypi:~ $ docker logs grafana
t=2019-01-25T15:33:30+0000 lvl=info msg="Starting Grafana" logger=main version=4.1.2 commit=v4.1.2 compiled=2017-02-13T12:13:31+0000
t=2019-01-25T15:33:30+0000 lvl=info msg="Config loaded from" logger=settings file=/usr/share/grafana/conf/defaults.ini
t=2019-01-25T15:33:30+0000 lvl=info msg="Config loaded from" logger=settings file=/etc/grafana/grafana.ini
t=2019-01-25T15:33:30+0000 lvl=info msg="Config overriden from command line" logger=settings arg="default.paths.data=/var/lib/grafana"
t=2019-01-25T15:33:30+0000 lvl=info msg="Config overriden from command line" logger=settings arg="default.paths.logs=/var/log/grafana"
t=2019-01-25T15:33:30+0000 lvl=info msg="Config overriden from command line" logger=settings arg="default.paths.plugins=/var/lib/grafana/plugins"

Si tout va bien, nous pouvons alors paramétrer Grafana. Il existe d’autres tests que nous pouvons exécuter ici pour vérifier et je pourrais les ajouter plus tard.

Configuration de la source de données Grafana

Lors du chargement de grafana à l'adresse http://<ip>:3000, la page d'accueil s'affiche à nouveau et nous pouvons passer à la configuration d'une source de données de base influx.

Avec la configuration de la source de données, nous pouvons maintenant configurer un nouveau tableau de bord. Pour tester les choses, nous allons représenter graphiquement les performances du Pi lui-même, puis ajouter nos graphiques de surveillance de réseau.  En appuyant sur le bouton Modifier du titre du panneau, nous pouvons le modifier.

Résumé

Nous avons maintenant une surveillance en place et une configuration de tableau de bord pour l’examiner au besoin. Pour environ 50 $, nous avons maintenant une solution de surveillance flexible qui peut être connectée à peu près n'importe où sur votre réseau pour vous donner un autre aperçu des performances du réseau.

Maintenant, chaque fois que j'ai un problème de réseau, je peux charger ces graphiques pour avoir l’opinion de Pi sur ce qui se passe.