Introduction

Dans l'article précédent nous avons vu comment exposer de manière sécurisée nos différents services sur internet, en particulier avec Traefik.

Généralement, il convient de surveiller les flux qui vont et viennent dans ce genre d'outil, c'est pourquoi nous nous attaquerons à la partie "supervision" et nous utiliserons les solutions Prometheus et Grafana.

Prometheus, qu'est-ce que c'est ?

Prometheus est un outil open-source réputé dans le domaine de la supervision et qui permet aussi d'alerter les utilisateurs quand le seuil d'une règle a été atteint (service arrêté, trop de consommation CPU / RAM, manque d'espace disque, etc.). Il a rejoint le CNCF (Cloud Native Computing Foundation) en 2016 et est activement maintenu par la communauté.

La plupart des composants de Prometheus sont en Go, et il est souvent associé avec Alertmanager pour l'envoi des alertes.

Prometheus vient collecter des métriques en fonction du temps qui sont généralement exposées par un serveur ou une application (appelé le plus souvent "exporter") et qui permettent, après analyse, de savoir si celui-ci se comporte correctement ou non.

Il dispose d'une interface graphique où l'on peut visualiser ces mesures et effectuer différents calculs dans le langage PromQL (Prometheus Query Language).

prometheus

L'image ci-dessus montre l'interface de Prometheus qui sera déployé avec Traefik un peu plus loin dans cet article.

Et Grafana alors ?

Grafana est lui aussi un outil open-source, il permet de voir, requêter des données ou même alerter de manière beaucoup plus visuelle que Prometheus. Il fait office de tableau de bord où, dans notre cas, Prometheus sera la source des données.

grafana

Extrait du tableau de bord "Traefik" pour Grafana.

Installation

Avant de commencer

Dans ce qui suivra, le docker-compose utilisé ne comporte que les services Traefik, Prometheus et Grafana. Néanmoins, d'autres services peuvent toujours venir se greffer afin d'être exposé à travers Traefik.

De plus, dans le même ordre d'idée que l'article précédent, il faut plusieurs prérequis :

  • Posséder un serveur ou un raspberry qui est accessible sur internet à travers les ports 80 et 443 (très important pour la génération de certificat via Let's encrypt)
  • Avoir un nom de domaine qui pointe vers votre serveur ou raspberry, et, créer un sous-domaine pour accéder à l'interface de Traefik, Prometheus et Grafana (il y a possibilité de créer un sous domaine par service, mais ce ne sera pas le cas ici)
  • Installer docker et docker-compose sur votre serveur ou raspberry

Il reste néanmoins possible d'exécuter Traefik en local, quelque soit la machine, mais la génération de certificats ne sera pas possible et il faudra accepter le certificat par défaut "TRAEFIK DEFAULT CERT" afin de se connecter aux différents services exposés.

On y va ?

Le code du projet à cloner est disponible ci-dessous via mon compte Github.

https://github.com/axinorm/traefik-monitoring

À la manière de l'article précédent, une fois le projet cloné, il faut configurer quelques variables d'environnement en fonction de votre système d'exploitation et de l'architecture de votre processeur afin de générer le docker-compose.

Le README.md indique comment installer jinja pour générer ce dernier.

Dans le cas d'un raspberry :

export TM_SERV_OS=linux
export TM_SERV_ARCH=arm

Dans le cas d'une machine sur macOS :

export TM_SERV_OS=macos
export TM_SERV_ARCH=x86

Il faut aussi définir le sous-domaine qui sera utilisé pour exposer l'interface web de Traefik, Prometheus et Grafana :

export TM_URL_TRAEFIK=admin.example.com

Si vous êtes en local, le .local est fortement conseillé, une petite ligne est à rajouter sur le fichier /etc/hosts :

127.0.0.1       admin.example.local # Doit correspondre à la valeur de TM_URL_TRAEFIK

Une fois ces trois variables complétées avec ces informations, la commande ci-dessous permet de générer le docker-compose.yml :

python3 generate_compose_file.py

Quelques lignes ont été rajoutées dans le fichier de configuration traefik.yml afin d'ajouter un point d'entrée pour que Prometheus vienne collecter les mesures du service.

entryPoints:
  http:
    address: ":80"
  https:
    address: ":443"
  # Ajout d'un point d'entrée sur le port 8080
  metrics:
    address: ":8080"

# Ajout de la partie métrique qui concerne Prometheus
metrics:
  prometheus:
    # Nom du point d'entrée défini au dessus
    entryPoint: metrics
    # On configure la latence des métriques
    buckets:
      - 0.1
      - 0.3
      - 1.2
      - 5.0
    # Ajout des métriques sur les points d'entrée
    addEntryPointsLabels: true
    # Ajout des services
    addServicesLabels: true

On passe maintenant au fichier de configurarion de Prometheus prometheus.yml, qui possède plusieurs caractéristiques :

global:
  # Temps que prendra prometheus pour réinterroger les urls définies
  scrape_interval:     15s
  # Temps pour recalculer les règles au sein de Prometheus
  evaluation_interval: 15s

rule_files:
  # Fichier de règle
  - 'alert.rules'

scrape_configs:
  # On déclare ici le point d'entrée traefik qui expose les métriques du service
  - job_name: 'traefik'
    scrape_interval: 5s
    static_configs:
      - targets: ['traefik:8080']

Le fichier alert.rules contient une règle qui nous avertira si Prometheus n'est plus capable de récupérer les métriques au point d'entrée indiqué, dans notre cas, c'est l'url traefik:8080.

Pour la partie Grafana, on retrouvera deux dossiers dans grafana/provisioning, le premier dashboards contiendra les tableaux de bord que nous allons mettre en place au sein de notre conteneur. Le second datasources correspond à l'ensemble des sources de données que l'on récupérera, dans notre cas, ce sera Prometheus.

Une information importante dans le datasource.yml :

  access: proxy

Cela permet à Grafana de faire ses appels à travers le conteneur et non pas via la navigateur du client avec l'url http://prometheus:9090 où "prometheus" est le nom du conteneur.

Avec cette configuration, on est pas obligé d'exposer Prometheus via une url externe, même si dans notre cas, c'est ce que l'on fait.

Un fichier .env vient compléter la configuration de grafana :

# Pas d'authentification pour accéder à Grafana
GF_AUTH_ANONYMOUS_ENABLED=true
# Désactive l'authentification par nom d'utilisateur / mot de passe
GF_AUTH_BASIC_ENABLED=false
# Désactive l'authentification par proxy
GF_AUTH_PROXY_ENABLED=false
# Enlève la possibilité aux utilisateurs de s'inscrire
GF_USERS_ALLOW_SIGN_UP=false
# Rajoute un plugin de visualisation pour Grafana
GF_INSTALL_PLUGINS=grafana-piechart-panel
# Indique à Grafana le format de l'url
GF_SERVER_ROOT_URL=%(protocol)s://%(domain)s:%(http_port)s/grafana

Le moment de vérité

Après avoir réalisé les étapes précédentes, il ne reste plus qu'à lancer le docker-compose :

docker-compose up -d

Vous devriez avoir accès à Traefik, Prometheus et Grafana en fonction de ce qui a été mis dans la variable TM_URL_TRAEFIK, en ajoutant le sous-domaine admin et /prometheus, /traefik ou /grafana en fonction du service désiré.

Pour aller plus loin

Maintenant que nous avons notre Traefik opérationnel et nos outils de supervision, il convient de rajouter les services que l'on souhaiterait mettre derrière Traefik et exposer sur internet. On peut par exemple y mettre un blog, un hébergeur de service git (Gitea ?), etc.

De plus, il faudrait aussi superviser les différents services que l'on rajoute en mettant leurs mesures à disposition de Prometheus. On pourrait aussi ajouter Alertmanager afin de diffuser les alertes remontées par Prometheus.

Enfin, on pourrait rajouter une authentification pour accéder à ces données sensibles par nom d'utilisateur / mot de passe voire même par certificat (mtls).

Conclusion

Nous avions vu dans l'article précédent que Traefik était un outil assez simple à mettre oeuvre, il faut dire que rajouter la couche de supervision est loin d'être difficile en plus d'être indispensable si l'on souhaite le mettre dans un contexte de production ou surveiller son usage au quotidien.

Dans un prochain article, nous parlerons authentification afin d'empêcher que tout le monde puisse accéder aux services exposés par Traefik, surtout ceux qui sont "critiques", et sur ce point, la supervision en fait partie.