Comment installer Prometheus à l’aide de Docker sur CentOS 7

Un article de Prometheus, ​​co-créateur Julius Volz

introduction

Prometheus est un système de surveillance open source et une base de données de séries chronologiques. Il aborde de nombreux aspects de la surveillance, tels que la génération et la collecte de métriques, la représentation graphique des données résultantes sur des tableaux de bord et l’alerte sur les anomalies. Pour ce faire, il propose une variété de composants exécutés séparément mais utilisés en combinaison.

Docker vous permet d’encapsuler les processus serveur à l’aide de conteneurs Linux (ou d’autres technologies d’encapsulation) afin de les gérer plus facilement et de les isoler les uns des autres. Pour en savoir plus sur Docker, voir The Docker Ecosystem: Introduction aux composants communs.

Dans ce tutoriel, nous allons apprendre à installer trois composants clés pour utiliser Prometheus sur Docker. Ceux-ci sont:

  • Un serveur Prometheus pour collecter des métriques et les interroger

  • Un exportateur de nœud pour exporter les métriques du système dans un format compatible avec Prometheus

  • Grafana, un constructeur de tableaux de bord graphiques basé sur le Web qui prend en charge Prometheus, entre autres

L’écosystème de Prometheus contient de nombreux autres composants, mais ceux-ci constituent un bon point de départ pour l’utilisation de Prométhée.

Conditions préalables

Pour suivre ce tutoriel, vous aurez besoin de:

Étape 1 - Installation de Prométhée

Cette section explique comment installer le serveur principal Prometheus à l’aide de Docker. Assurez-vous d’installer Docker conformément à la section * Conditions préalables * avant de continuer. Le serveur Prometheus est la pièce maîtresse de l’écosystème Prometheus. Il est chargé de collecter et de stocker les métriques, ainsi que de traiter les requêtes d’expression et de générer des alertes.

Les images de conteneur Docker pour tous les composants Prometheus sont hébergées sous l’organisation * https: //hub.docker.com/u/prom/ [prom] * sur Docker Hub. L’exécution de l’image Docker prom + prometheus + sans autre option démarre le serveur Prometheus avec un exemple de fichier de configuration situé à l’emplacement + + / etc / prometheus / prometheus.yml + `à l’intérieur du conteneur. Il utilise également un Docker data volume monté sur `+ / prometheus + `dans le conteneur pour stocker les données de métriques collectées. Ce répertoire de volumes de données est en réalité un répertoire sur l’hôte créé automatiquement par Docker lors du premier démarrage du conteneur. Les données qu’il contient sont persistantes entre les redémarrages du même conteneur.

Il existe plusieurs manières de remplacer le fichier de configuration par défaut. Par exemple, un système de fichiers hôte peut transmettre un fichier de configuration personnalisé au conteneur en tant que volume de données Docker. Vous pouvez également créer un conteneur Docker dérivé avec votre propre fichier de configuration cuit dans l’image du conteneur. Dans ce tutoriel, nous allons choisir de transmettre un fichier de configuration à partir du système hôte.

Il existe également différents modèles pour organiser le stockage des métriques. Dans ce didacticiel, nous allons utiliser le comportement par défaut de l’image Docker consistant à utiliser un https://www.digitalocean.com/community/tutorials/how-to-work-with-docker-data-volumes-on-ubuntu-14-04 [Volume de données Docker] pour stocker les métriques. Vous pouvez également envisager de créer un conteneur de volume de données si cela répond mieux à vos besoins.

Tout d’abord, créez un fichier de configuration Prometheus minimal sur le système de fichiers hôte à l’adresse + ~ / prometheus.yml +:

nano ~/prometheus.yml

Ajoutez le contenu suivant au fichier (remplacez «++» par l’adresse IP de votre Droplet):

~ / prometheus.yml

# A scrape configuration scraping a Node Exporter and the Prometheus server
# itself.
scrape_configs:
 # Scrape Prometheus itself every 5 seconds.
 - job_name: 'prometheus'
   scrape_interval: 5s
   target_groups:
     - targets: ['localhost:9090']

 # Scrape the Node Exporter every 5 seconds.
 - job_name: 'node'
   scrape_interval: 5s
   target_groups:
     - targets: [':9100']

Cet exemple de configuration fait en sorte que Prometheus gratte des métriques à lui-même (puisque Prometheus expose également des métriques sur lui-même dans un format compatible avec Prometheus), ainsi qu’à partir d’un exportateur de nœud, que nous configurerons plus tard. Alors que Prometheus peut se connecter à lui-même dans son conteneur en utilisant le nom d’hôte + localhost +, il devra supprimer l’exportateur de nœud à l’aide de l’adresse IP externe de votre serveur, car l’exportateur de nœud s’exécutera dans un conteneur séparé avec un espace de noms réseau distinct.

Démarrez le conteneur Prometheus Docker avec le fichier de configuration externe:

docker run -d -p 9090:9090 -v ~/prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus -config.file=/etc/prometheus/prometheus.yml -storage.local.path=/prometheus -storage.local.memory-chunks=10000

La première fois que vous exécutez cette commande, l’image Docker sera extraite du hub Docker.

Cette commande est assez longue et contient de nombreuses options de ligne de commande. Voyons cela plus en détail:

  • L’option + -d + démarre le conteneur Prometheus en mode détaché, ce qui signifie que le conteneur sera démarré en arrière-plan et ne sera pas terminé en appuyant sur + CTRL + C +.

  • L’option + -p 9090: 9090 + expose le port Web de Prometheus (9090) et le rend accessible via l’adresse IP externe du système hôte.

  • L’option + -v […​] + monte le fichier de configuration + prometheus.yml + du système de fichiers hôte à l’emplacement du conteneur où Prometheus l’attend (+ / etc / prometheus / prometheus.yml +) .

  • L’option + -config.file + est définie en fonction de l’emplacement du fichier de configuration Prometheus within dans le conteneur.

  • L’option + -storage.local.path configure l’emplacement de stockage des métriques dans le conteneur.

  • Enfin, l’option + -storage.local.memory-chunks + ajuste l’utilisation de la mémoire de Prometheus à la très petite quantité de RAM du système hôte (seulement 512 Mo) et à un petit nombre de séries chronologiques stockées dans ce tutoriel (un peu moins de 1 000). Il demande à Prométhée de ne conserver que 10 000 échantillons en mémoire (environ 10 morceaux par série), au lieu du nombre par défaut de 1048576. * C’est une valeur que vous aurez certainement besoin de régler * lorsque vous exécutez Prometheus sur une machine disposant de plus de RAM et lorsque vous stockez plus de séries chronologiques. Reportez-vous à storage documentation de Prometheus pour plus de détails à ce sujet.

Vous pouvez répertorier tous les conteneurs Docker en cours d’exécution à l’aide de la commande suivante:

docker ps

Par exemple, vous verrez quelque chose de similaire au suivant pour le conteneur Prometheus Docker:

Output of `docker ps`CONTAINER ID        IMAGE                COMMAND                  CREATED             STATUS              PORTS                    NAMES
6a89ac39911e        prom/prometheus      "/bin/prometheus -con"   2 hours ago         Up 2 hours          0.0.0.0:9090->9090/tcp   stoic_pike

En utilisant l’ID de conteneur indiqué dans la sortie + docker ps +, vous pouvez inspecter les journaux du serveur Prometheus en cours d’exécution à l’aide de la commande suivante:

docker logs

Dans notre exemple, la commande serait:

docker logs

Pour savoir où est stocké le volume de stockage des métriques sur le système de fichiers de l’hôte, vous pouvez exécuter les opérations suivantes avec votre:

docker inspect

Cela affichera des informations sur la configuration de votre conteneur, y compris les chemins d’hôte de tous les volumes Docker montés.

Recherchez dans la sortie une section similaire à celle-ci:

Output of `docker inspect ...`...
"Mounts": [
   {
       "Source": "/home/sammy/prometheus.yml",
       "Destination": "/etc/prometheus/prometheus.yml",
       "Mode": "",
       "RW": true
   },
   {
       "Name": "821b0abc470a9c758ff35ed5cff69077423a629566082a605a01d8207d57cd6c",
       "Source": "/var/lib/docker/volumes/821b0abc470a9c758ff35ed5cff69077423a629566082a605a01d8207d57cd6c/_data",
       "Destination": "/prometheus",
       "Driver": "local",
       "Mode": "",
       "RW": true
   }
],
...

Dans cet exemple, les métriques sont stockées dans + / var / lib / docker / volumes / 821b0abc470a9c758ff35ed5cff69077423a629566082a605a01d8207d57cd6c / _data + sur le système hôte. Ce répertoire a été créé automatiquement par Docker lors du premier démarrage du conteneur Prometheus. Il est mappé dans le répertoire + / prometheus + du conteneur. Les données de ce répertoire sont conservées lors des redémarrages du même conteneur. Si vous préférez, vous pouvez également monter un répertoire hôte existant pour stocker les données de métriques. Voir Comment utiliser les volumes de données Docker sur Ubuntu 14.04 pour savoir comment pour y parvenir. Cet article est écrit pour Ubuntu 14.04, mais les commandes du menu fixe et les fichiers de configuration sont les mêmes sous CentOS 7.

Vous devriez maintenant pouvoir accéder à votre serveur Prometheus à + ​​http: //: 9090 / +. Assurez-vous qu’il collecte des métriques sur lui-même en sélectionnant + http: //: 9090 / status + et en localisant le point de terminaison + http: // localhost: 9090 / metrics + pour le travail + prometheus + dans * Targets *. section. La colonne * State * de cette cible doit indiquer l’état de la cible sous la forme * HEALTHY *. En revanche, le noeud final + http: // localhost: 9100 / metrics + (exportateur de nœud) doit toujours s’afficher en tant que * UNHEALTHY * car l’exportateur de nœud n’a pas encore été démarré et ne peut donc pas être supprimé:

image: https: //assets.digitalocean.com/articles/prometheus_install_docker/unhealthy.png [La cible de l’exportateur de nœud doit être indiquée comme MAUVAISE]

Pour résumer, Prometheus s’exécute maintenant en tant que conteneur Docker à l’aide du fichier de configuration Prometheus personnalisé + ~ / prometheus.yml +, situé sur le système de fichiers hôte. Le stockage des métriques se trouve dans le répertoire + / prometheus + du conteneur, qui est sauvegardé sur le système hôte par le chemin indiqué par la commande + docker inspect + décrite dans cette section.

Étape 2 - Configuration de l’exportateur de nœud

Dans cette section, nous installerons l’Exportateur de nœuds Prometheus. L’exportateur de nœud est un serveur qui expose les métriques Prometheus sur la machine hôte (nœud) sur laquelle il s’exécute. Cela inclut des métriques sur les systèmes de fichiers de la machine, les périphériques réseau, l’utilisation du processeur, la mémoire, etc.

Notez que l’exécution de l’exportateur de nœuds sur Docker pose certains problèmes, car son objectif principal est d’exposer les mesures relatives à l’hôte sur lequel il est exécuté. Si nous l’exécutons sur Docker sans autre option, l’espacement des noms de ressources de Docker, tel que le système de fichiers et les périphériques réseau, le fera exporter uniquement des métriques sur l’environnement du conteneur, qui seront différentes de l’environnement de l’hôte. Par conséquent, il est généralement recommandé d’exécuter l’exportateur de nœud directement sur le système hôte en dehors de Docker. Toutefois, si vous avez besoin de gérer tous vos processus à l’aide de Docker, nous allons décrire une solution de contournement qui fournit une approximation raisonnable pour l’exportation de métriques d’hôte à partir de Docker.

Pour démarrer l’exportateur de nœud sur le port 9100 à l’aide de Docker:

docker run -d -p 9100:9100 -v "/proc:/host/proc" -v "/sys:/host/sys" -v "/:/rootfs" --net="host" prom/node-exporter -collector.procfs /host/proc -collector.sysfs /host/proc -collector.filesystem.ignored-mount-points "^/(sys|proc|dev|host|etc)($|/)"

Les indicateurs suivants de Docker et d’exportateur de noeud sont utilisés pour fournir une approximation raisonnable des métriques host:

  • Sous Linux, Node Exporter rassemble la plupart de ses métriques des systèmes de fichiers + / proc + et + / sys +. Ces systèmes de fichiers sont montés de l’hôte dans le conteneur situé sous un répertoire + / host +, en utilisant l’indicateur + -v + de Docker.

  • Via les indicateurs + -collector.procfs + et + -collector.sysfs + de l’exportateur de nœuds, nous demandons à l’exportateur de nœuds de rechercher les systèmes de fichiers + / proc + et + / sys + dans un emplacement non standard.

  • Pour signaler les métriques du système de fichiers hôte, nous montons également l’ensemble du système de fichiers racine (+ / +) dans le conteneur (sous + / rootfs +), en utilisant de nouveau l’indicateur + -v + de Docker.

  • Utilisez l’indicateur + -collector.filesystem.ignored-mount-points + de Node Exporter pour ignorer tout autre système de fichiers du conteneur n’appartenant pas au système hôte. Cette option prend une expression régulière de points de montage à exclure des métriques rapportées.

  • En utilisant l’indicateur + - net = host + Docker, nous plaçons le conteneur dans la même pile réseau que l’hôte, de sorte que la lecture de fichiers tels que + / proc / net / dev + donne les mêmes résultats host (la lecture du système de fichiers + / proc + monté depuis l’hôte n’est pas suffisante).

Notez que certaines métriques seront toujours différentes de celles d’un exportateur de noeud s’exécutant directement sur l’hôte. Spécifiquement, les métriques rapportées sur l’utilisation du système de fichiers auront un préfixe + / rootfs + dans la valeur de leurs étiquettes + mountpoint +, car nous montons dans le système de fichiers racine sous ce préfixe dans le conteneur. De plus, rien ne garantit que les solutions de contournement décrites seront suffisantes pour les fonctionnalités futures de Node Exporter. Par conséquent, exécutez Node Exporter sur Docker à votre propre discrétion.

Le serveur Prometheus devrait maintenant commencer automatiquement à gratter l’exportateur de nœud. Rendez-vous à la page d’état de votre serveur Prometheus à l’emplacement + http: //: 9090 / status + et vérifiez que la cible + http: //: 9100 / metrics + pour le travail + node + affiche maintenant l’état * HEALTHY * :

image: https: //assets.digitalocean.com/articles/prometheus_install_docker/healthy.png [La cible de l’exportateur de nœud doit être indiquée comme étant saine]

Étape 3 - Mise en place de Grafana

Enfin, nous allons mettre en place Grafana. Grafana est un constructeur de tableaux de bord graphiques qui prend en charge Prometheus en tant que moteur de recherche des données à représenter.

Grafana stocke ses métadonnées de tableau de bord (telles que les tableaux de bord existants et les graphiques qu’ils doivent afficher) dans une base de données configurable basée sur SQL. Grafana prend en charge l’utilisation d’une base de données SQLite3 locale sauvegardée sur fichier ainsi que de serveurs de base de données externes tels que MySQL ou PostgreSQL.

Dans ce tutoriel, nous allons utiliser une base de données SQLite3 sauvegardée par un volume de données Docker. Voir Comment et quand utiliser Sqlite pour plus d’informations.

Lancez Grafana en tant que conteneur Docker avec un mot de passe administrateur (++) de votre choix:

docker run -d -p 3000:3000 -e "GF_SECURITY_ADMIN_PASSWORD=" -v ~/grafana_db:/var/lib/grafana grafana/grafana

Cela téléchargera l’image Grafana Docker à partir du hub Docker et créera un nouveau volume Docker placé à «+ ~ / grafana_db » sur le système hôte et à « / var / lib / grafana » dans le système de fichiers conteneur. Dans le conteneur, Grafana créera et initialisera automatiquement sa base de données SQLite3 sous ` / var / lib / grafana / grafana.db +`.

L’indicateur + -e + permet de transmettre des variables d’environnement au processus lancé dans le conteneur Docker. Ici, nous l’utilisons pour définir la variable d’environnement + GF_SECURITY_ADMIN_PASSWORD + sur le mot de passe de l’administrateur du tableau de bord souhaité, en remplaçant le mot de passe par défaut + admin +. Les variables d’environnement peuvent également être utilisées pour remplacer tout autre paramètre de configuration Grafana. Voir Using variables d’environnement pour plus de détails.

Pour vérifier que Grafana fonctionne correctement, rendez-vous sur + http: //: 3000 / +. Le nom d’utilisateur de l’administrateur est + admin et le mot de passe est celui que vous avez choisi lors du démarrage précédent du conteneur Docker.

image: https: //assets.digitalocean.com/articles/prometheus_install_docker/grafana_login.png [Connectez-vous à Grafana avec le mot de passe choisi]

Une fois connecté, vous devriez voir la vue principale de Grafana:

image: https: //assets.digitalocean.com/articles/prometheus_install_docker/grafana_main.png [Vue principale de Grafana]

Consultez la page Grafana documentation pour en savoir plus sur la mise en route de Grafana. La Prometheus Documentation de Grafana montre également comment utiliser Grafana en association avec Prometheus de manière spécifique.

Conclusion

Toutes nos félicitations! Vous avez configuré un serveur Prometheus, un exportateur de nœud et Grafana, tous à l’aide de Docker. Bien qu’ils fonctionnent actuellement tous sur le même ordinateur, cela n’a qu’un but de démonstration. Dans les installations de production, l’exportateur de nœuds est généralement exécuté sur chaque ordinateur surveillé, sur plusieurs serveurs Prometheus (selon les besoins de l’organisation), ainsi que sur un seul serveur Grafana pour représenter graphiquement les données de ces serveurs.

Pour en savoir plus sur l’utilisation de Prométhée en général, consultez son documentation.