Ubuntu 20.04 & 21.04 – Outils de monitoring avec Telegraf, InfluxDB et Grafana

• Procédure exécutée avec succès le 16 février 2021 à 23h42

Installation de Docker et Grafana

6 - Accéder à Grafana depuis l'extérieur avec Traefik

ⓘ Si vous souhaitez accéder à votre Grafana de l'extérieur (et non seulement via localhost), il est nécessaire de faire pointer votre domaine ou sous-domaine vers l'IP de votre serveur. Pour cela, commencez par modifier les règles DNS dans l'interface administrateur du fournisseur de votre nom de domaine. Les règles à ajouter sont de type « A ».

Si votre serveur est hébergé chez vous, il sera aussi nécessaire de créer une redirection du port 80 et 443 vers votre serveur dans l'interface de configuration de votre box internet (ou routeur).

Traefik est un reverse-proxy open-source et un load-balancer moderne conçu (par un Français) pour faciliter le déploiement des microservices (Docker, Kubernetes, AWS, etc.). Traefik est extrêmement simple à configurer et gère automatiquement vos certificats délivrés par Let's Encrypt. Il les renouvelle 30 jours avant leurs expirations sans action de votre part. De plus, il est capable de charger vos containers dynamiquement sans interruption de service et dispose d'un dashboard affichant l'ensemble de vos routes configurées.

Si vous avez déjà un Traefik sous Docker, vous pouvez vous rendre directement à l'étape 6.4.

6.1 - Création de l'utilisateur traefik

Si vous avez plusieurs containers ou si vous avez pour projet d'en ajouter par la suite, il est préférable d'isoler le container Traefik. Il est recommandé de ne pas le lancer sous votre super-utilisateur et de créer un utilisateur dédié.

  1. Créez un utilisateur traefik :
    sudo adduser traefik
  2. Ajoutez-le au groupe docker :
    sudo adduser traefik docker

6.2 - L'image et réseau Traefik

  1. Connectez-vous sous l'utilisateur traefik :
    su traefik
  2. Déplacez-vous dans le répertoire personnel de cet utilisateur :
    cd
  3. Créez le réseau dédié à Traefik et à l'ensemble de vos containers :
    docker network create traefik_network
  4. Créez le fichier /home/traefik/docker-compose.yml en ajoutant le contenu suivant :
    version: '3.7'
    services:
      traefik:
        image: "traefik:v2.2"
        container_name: "traefik"
        restart: unless-stopped
        networks:
          - traefik_network
        ports:
          - "80:80"
          - "443:443"
        volumes:
          - /var/run/docker.sock:/var/run/docker.sock:ro
          - /home/traefik/traefik.toml:/traefik.toml:ro
          - /home/traefik/acme.json:/acme.json
    
    networks:
      traefik_network:
        external: true
    
    • /var/run/docker.sock:/var/run/docker.sock:ro : précise le socket Unix de votre docker. Laissez cette valeur par défaut.
    • /home/traefik/traefik.toml:/traefik.toml:ro : précise le chemin du fichier de configuration de Traefik. Nous le créerons à l'étape suivante.
    • /home/traefik/acme.json:/acme.json : précise le chemin du fichier contenant les informations relatives à vos certificats.
    • traefik_network : ici nous spécifions le réseau dédié à Traefik. Nous ajouterons aussi le container Grafana dans ce réseau par la suite.

6.3 - Configuration Traefik

Traefik peut être configuré de différentes manières, nous allons détailler ici, la configuration recommandée par Traefik, à savoir par un fichier statique au format TOML.

  1. Traefik stocke les informations liées au certificat dans un fichier acme.json. Vous devez au préalable créer le fichier et lui attribuer un minimum de permissions :
    touch /home/traefik/acme.json && chmod 600 /home/traefik/acme.json
  2. Créez le fichier de configuration Traefik /home/traefik/traefik.toml en ajoutant les lignes suivantes. L'unique propriété à modifier est l'email :
    [providers.docker]
      endpoint = "unix:///var/run/docker.sock"
      watch = true
      exposedByDefault = false
    
    [entryPoints.web]
      address = ":80"
      [entryPoints.web.http.redirections.entryPoint]
        to = "websecure"
        scheme = "https"
    
    [entryPoints.websecure]
      address = ":443"
    
    [certificatesResolvers.leresolver.acme]
      email = "[email protected]"
      storage = "acme.json"
      [certificatesResolvers.leresolver.acme.httpChallenge]
        entryPoint = "web"
    • [providers.docker] : cette directive permet tout simplement d'activer le support Docker.
    • endpoint = "unix:///var/run/docker.sock" : précise le socket Unix de votre Docker à Traefik. Laissez la valeur par défaut.
    • watch = true : permet de déployer à chaud les containers dès qu'un changement dans la configuration est détectée.
    • exposedByDefault = false : n'expose pas par défaut les containers au monde extérieur. Il est préférable d'activer cette option dans le docker-compose.yml pour chacun des containers dans le cas où, si pour une raison ou une autre, vous ne souhaiteriez plus rendre accessible un container de l'extérieur.
    • [entryPoints.web] et [entryPoints.websecure] : ces directives définissent les points d'entrée de votre Traefik. web et websecure sont purement indicatifs, vous pouvez les nommer autrement mais ils doivent correspondre aux labels que nous définirons plus tard dans le docker-compose.yml. Les propriétés address précisent les ports sur lesquels Traefik « écoute » en fonction du point d'entrée.
    • [entryPoints.web.http.redirections.entryPoint] : force la redirection du port 80 vers le port 443 donc force le HTTP en HTTPS.
    • [certificatesResolvers.[NOM_RESOLVEUR].acme] : nous indiquons ici que nous souhaitons utiliser le protocole ACME (donc le service Let's Encrypt) pour obtenir un certificat. Le nom du résolveur est purement indicatif, il doit simplement correspondre aux labels que nous définirons plus tard dans le docker-compose.yml.
    • storage = "acme.json" : la propriété storage précise à Traefik le fichier (que nous avons créé précédemment) où seront stockées les informations relatives aux certificats. L'erreur commune est d'indiquer le chemin absolu (dans notre cas /home/traefik/acme.json), ici le chemin à renseigner est celui au sein du container Traefik, il faut donc laisser cette valeur par défaut.
    • [certificatesResolvers.[NOM_RESOLVEUR].acme.httpChallenge] : cette directive précise tout simplement par quel point d'entrée (dans notre cas le port 80) Traefik peut obtenir un certificat.
  3. Déplacez-vous dans le répertoire personnel de l'utilisateur traefik et démarrez le container :
    cd
    docker-compose up -d

6.4 - Labels Grafana et réseau Traefik

  1. Connectez-vous sous l'utilisateur grafana et déplacez-vous dans son répertoire personnel :
    su grafana
    cd
  2. Dans votre fichier /home/grafana/docker-compose.yml, ajoutez les lignes en surbrillance en modifiant uniquement la ligne 56 par votre domaine. Le réseau traefik_network est ajouté dans la configuration du container grafana. Enfin, les labels permettant de communiquer avec Traefik sont spécifiés dans le container grafana :
    version: "3"
    services:
      influxdb:
        image: influxdb:latest
        container_name: influxdb
        restart: always
        hostname: influxdb
        networks:
          - lan
        ports:
          - 8086:8086
        environment:
          INFLUX_DB: "telegraf"
          INFLUXDB_USER: "telegraf_user"
          INFLUXDB_USER_PASSWORD: "telegraf_password"
        volumes:
          - influxdb-data:/var/lib/influxdb
    
      telegraf:
        image: telegraf:latest
        depends_on:
          - influxdb
        container_name: telegraf
        restart: always
        networks:
          - lan
        links:
          - influxdb:influxdb
        tty: true
        volumes:
          - /var/run/docker.sock:/var/run/docker.sock
          - /home/grafana/telegraf/telegraf.conf:/etc/telegraf/telegraf.conf
        privileged: true
    
      grafana:
        image: grafana/grafana:latest
        depends_on:
          - influxdb
        container_name: grafana
        restart: always
        ports:
          - 3000:3000
        networks:
          - lan
          - traefik_network
        links:
          - influxdb:influxdb
        environment:
          GF_INSTALL_PLUGINS: "grafana-clock-panel,\
                              grafana-influxdb-08-datasource,\
                              grafana-kairosdb-datasource,\
                              grafana-piechart-panel,\
                              grafana-simple-json-datasource,\
                              grafana-worldmap-panel"
          GF_SECURITY_ADMIN_USER: "grafana_user"
          GF_SECURITY_ADMIN_PASSWORD: "grafana_password"
        volumes:
          - grafana-data:/var/lib/grafana
        labels:
          - "traefik.enable=true"
          - "traefik.docker.network=traefik_network"
          - "traefik.http.routers.grafana.entrypoints=web,websecure"
          - "traefik.http.routers.grafana.rule=Host(`grafana.mondomaine.com`)"
          - "traefik.http.services.grafana.loadbalancer.server.port=80"
          - "traefik.http.routers.grafana.tls=true"
          - "traefik.http.routers.grafana.tls.certresolver=leresolver"
    
    volumes:
      influxdb-data:
      grafana-data:
    
    networks:
      lan:
      traefik_network:
        external: true

    Il est primordial de respecter l'indentation !

    • traefik.enable=true : ce label expose le container au monde extérieur. Il surchage la propriété exposedByDefault de votre fichier /home/traefik/traefik.toml.
    • traefik.docker.network=traefik_network : ce label précise à Traefik quel réseau utilise le container Grafana.
    • traefik.http.routers.[NOM_DU_CONTAINER].entrypoints : chaque règle de routage spécifique à un container doit être spécifiée par un nom, ici nous utilisons tout simplement le nom du container. Le label entrypoints précise que les requêtes entrantes sur les points d'entrée web (port 80) et websecure (port 443) seront transmises au container.
    • traefik.http.routers.[NOM_DU_CONTAINER].rule=Host(`grafana.mondomaine.com}`) : ici nous précisons une règle, toute requête arrivant sur http://grafana.mondomaine.com sera transmise au container grafana.
    • traefik.http.services.[NOM_DU_CONTAINER].loadbalancer.server.port=[PORT] : ici nous précisons le port du container sur lequel les requêtes doivent être transmises.
    • traefik.http.routers.[NOM_DU_CONTAINER].tls : active le support SSL/TLS.
    • traefik.http.routers.[NOM_DU_CONTAINER].tls.certresolver : précise le résolveur et donc les certificats à utiliser.
  3. Déplacez-vous dans le répertoire personnel de l'utilisateur grafana et démarrez le container :
    cd
    docker-compose up -d

Il est nécessaire de patienter 2 à 3min avant d'accéder à votre Grafana, le temps que Traefik génère vos certificats SSL/TLS.

6.5 - (Facultatif) URL de type http://www.mondomaine.com/grafana

Si l'URL d'accès à votre Grafana n'est pas la racine de votre domaine (http://www.mondomaine.com/grafana par exemple), il est nécessaire de le préciser dans la configuration du container grafana.

  • Ajoutez la ligne suivante dans votre fichier /home/grafana/docker-compose.yml et modifiez l'URL en fonction de votre configuration :
    version: "3"
    services:
      influxdb:
        image: influxdb:latest
        container_name: influxdb
        restart: always
        hostname: influxdb
        networks:
          - lan
        ports:
          - 8086:8086
        environment:
          INFLUX_DB: "telegraf"
          INFLUXDB_USER: "telegraf_user"
          INFLUXDB_USER_PASSWORD: "telegraf_password"
        volumes:
          - influxdb-data:/var/lib/influxdb
    
      telegraf:
        image: telegraf:latest
        depends_on:
          - influxdb
        container_name: telegraf
        restart: always
        networks:
          - lan
        links:
          - influxdb:influxdb
        tty: true
        volumes:
          - /var/run/docker.sock:/var/run/docker.sock
          - /home/grafana/telegraf/telegraf.conf:/etc/telegraf/telegraf.conf
        privileged: true
    
      grafana:
        image: grafana/grafana:latest
        depends_on:
          - influxdb
        container_name: grafana
        restart: always
        ports:
          - 3000:3000
        networks:
          - lan
          - traefik_network
        links:
          - influxdb:influxdb
        environment:
          GF_INSTALL_PLUGINS: "grafana-clock-panel,\
                              grafana-influxdb-08-datasource,\
                              grafana-kairosdb-datasource,\
                              grafana-piechart-panel,\
                              grafana-simple-json-datasource,\
                              grafana-worldmap-panel"
          GF_SECURITY_ADMIN_USER: "grafana_user"
          GF_SECURITY_ADMIN_PASSWORD: "grafana_password"
          GF_SERVER_ROOT_URL: "http://www.mondomaine.com/grafana"
        volumes:
          - grafana-data:/var/lib/grafana
        labels:
          - "traefik.enable=true"
          - "traefik.docker.network=traefik_network"
          - "traefik.http.routers.grafana.entrypoints=web,websecure"
          - "traefik.http.routers.grafana.rule=Host(`www.mondomaine.com/grafana`)"
          - "traefik.http.services.grafana.loadbalancer.server.port=3000"
          - "traefik.http.routers.grafana.tls=true"
          - "traefik.http.routers.grafana.tls.certresolver=leresolver"
    
    volumes:
      influxdb-data:
      grafana-data:
    
    networks:
      lan:
      traefik_network:
        external: true
  • Redémarrez les containers :
    docker-compose restart

Suite et fin du tutoriel ➔

Testé sur
Ubuntu Server 20.04 LTS
Auteur
Edouard WATTECAMPS

4 réflexions au sujet de “Ubuntu 20.04 & 21.04 – Outils de monitoring avec Telegraf, InfluxDB et Grafana”

Laisser un commentaire