Skip to content

LAB : Exploitation - Prometheus & Grafana sur Docker#

🕘 : 30 minutes

Présentation#

Objectifs#

  • Interprétation de code de deploiement de grafana & prometheus
  • Deploiement des services sur docker

Prerequis#

  • Conaissance Docker
  • Instance docker fonctionnel
  • Editeur de code
  • Utilitaire installé sur la machine: git
  • Avoir un proxy nginx fonctionnel (voir lab deploy reverse proxy sur la section 03-conteneurisation)
  • Faire le lab 2 du stage 7 sur Sonarqube

/!\ Dans ce lab, nous allons nous baser sur le lab SonarQube du stage 7. Merci d'avoir Jenkins, nginx et sonarqube en cours d'exécution.

Déroulement du Lab#

Etape 1: Configuration DNS#

Pour une meileure utilisation du proxy, il faudra modifier notre configuration DNS locale afin de faire les redirections sur la base des FQDNs vers les conteneurs Grafana et Prometheus.

devops@lecloudfacile:~$ vim /etc/hosts

et copier le contenu les DN Grafana et Prometheus ci-dessous:

127.0.0.1 jenkins-dev.lecloudfacile.io quality.lcf.io grafana.lcf.io prometheus.lcf.io 

NB:

  • Il est important de noter que ces résolutions ne sont disponibles qu'en local (sur la machine où le lab est effectué)
  • Si vous êtes sur Windows, l'emplacement du fichier hosts est : C:\windows\system32\drivers\etc\hosts. N'oubliez pas d'éditer le fichier en tant que administrateur.

Etape 2: Recuperation du code#

git clone https://github.com/wingufactory/lecloudfacile-devops-labs.git
cd lecloudfacile-devops-labs/09-exploitation/grafana-prometheus

Etape 3: Analyse du manifeste docker compose#

Dans cette étape, Nous allons commenter l'utilité de chaque instruction du fichier docker-compose.yaml

# Indication de la version de l'API
version: '3.8'

# Création d'un réseau nommé <monitoring> pour l'ensemble des conteneurs qui vont appartenir à la stack.
networks:
  frontend:
    name: frontend
    external: true


# Création d'un volume nommé <prometheus_data>, <grafana-storage> pour la persistance des données. 
volumes:
  prometheus_data: {}
  grafana-storage: {}

# Déclaration liste des services
services:

  # Service grafana

  grafana:

    # Choix de l'image

    image: grafana/grafana-enterprise

    # Nom du comteneur

    container_name: grafana

    # Toujours forcer le rédémarrage du conteneur en cas de problème sauf lorsqu'il est stoppé volontairement

    restart: unless-stopped

    # Declaration du port grafana et du port d'exposition externe

    ports:
      - '3000:3000'

    # Montage du volume pour la persitence des données

    volumes:
      - grafana-storage:/var/lib/grafana

    # Attachement du service au réseau <frontend> 

    networks:
      - frontend


  # --------------------------------------------------------------------------


  # Service node-exporter: il  exposera les métriques que Prometheus pourra ensuite venir chercher.
  # Node Exporter est pour monitorer un système basé sur Linux.
  # Pour les systèmes sous Windows, vous pouvez utiliser Windows Exporter.

  node-exporter:

    # Choix de l'image

    image: prom/node-exporter:latest

    # Nom du comteneur

    container_name: node-exporter

    # Toujours forcer le rédémarrage du conteneur en cas de problème sauf lorsqu'il est stoppé volontairement

    restart: unless-stopped

    # Montage du volume pour la persitence des données en read-only mode
    # Pour le service node-exporter , nous allons monter quelque repertoires (/proc, /sys, /) en mode `ro`  (read-only mode) depuis notre machine local vers le conteneur afin d'assurer le bon fonctionnement du conteneur node-exporter

    volumes:
      - /proc:/host/proc:ro
      - /sys:/host/sys:ro
      - /:/rootfs:ro

    # Specifie les nouveaux repertoires du conteneur dans la configuration

    command:
      - '--path.procfs=/host/proc'
      - '--path.rootfs=/rootfs'
      - '--path.sysfs=/host/sys'
      - '--collector.filesystem.mount-points-exclude=^/(sys|proc|dev|host|etc)($$|/)'

    # Declaration du port grafana et du port d'exposition externe

    ports:
      - 9100:9100

    # Attachement du service au réseau <monitoring> 

    networks:
      - frontend


  # --------------------------------------------------------------------------


  # Service prometheus:

  prometheus:

    # Choix de l'image

    image: prom/prometheus:latest

    # Nom du comteneur

    container_name: prometheus

    # Toujours forcer le rédémarrage du conteneur en cas de problème sauf lorsqu'il est stoppé volontairement

    restart: unless-stopped

    # Montage du volume pour la persitence des données et la configuration de prometheus

    volumes:
      - ./config/prometheus.yml:/etc/prometheus/prometheus.yml
      - prometheus_data:/prometheus

    # Specifie la configuration de prometheus
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'
      - '--storage.tsdb.path=/prometheus'
      - '--web.console.libraries=/etc/prometheus/console_libraries'
      - '--web.console.templates=/etc/prometheus/consoles'
      - '--web.enable-lifecycle'

    # Declaration du port prometheus et du port d'exposition externe

    ports:
      - '9090:9090'

    # Attachement du service au réseau <frontend> 

    networks:
      - frontend


  # --------------------------------------------------------------------------


  #  cadvisor est un utilitaire qui collecte les données d'utilisation des ressources et de performances des conteneurs en cours d'exécution.
  cadvisor:

    # Choix de l'image

    image: gcr.io/cadvisor/cadvisor:v0.47.0

    # Nom du comteneur

    container_name: cadvisor

    # Specifie la configuration de cadvisor

    command:
      - '-port=8098'

    # Montage du volume pour la persitence des données en read-only mode

    volumes:
      - /:/rootfs:ro
      - /var/run:/var/run:ro
      - /sys:/sys:ro
      - /var/lib/docker/:/var/lib/docker:ro
      - /dev/disk/:/dev/disk:ro

   # Permet de monter `/dev/kmsg` comme un device dans le container

   devices:
      - /dev/kmsg

    # configures le service d'image à se creer avec une certaine elevation de privileges comme root par exemple et permet au conteneur de gerer le device `/dev/kmsg`

    privileged: true

    # Toujours forcer le rédémarrage du conteneur en cas de problème sauf lorsqu'il est stoppé volontairement

    restart: unless-stopped

    # Attachement du service au réseau <frontend> 

    networks:
      - frontend

Etape 4: Analyse du fichier de configuration prometheus#

Dans cette étape, nous allons configurer Prometheus pour récupérer les métriques du node-exporter et les envoyer à Grafana.

Nous avons configurer les sections suivantes :

global: paramètres de configuration par défaut de Prometheus global. Dans cet exemple, nous définissons le scrape_interval pour récupérer les métriques des tâches configurées sur 15 secondes. scrape_configs: tâches de récupération définies.

# Definit les paramètres de configuration par défaut de Prometheus
global:

  # Pour récupérer les métriques des Jobs chaque 15 secondes
  scrape_interval: 15s

# Definit les tâches de récupération des metrics.
scrape_configs:

  # Job pour le node-exporter
  - job_name: 'node-exporter'

    # Permet de définir comment joindre le 'node-exporter' via quel port 

    static_configs:
      - targets: ['node-exporter:9100']

  # Job pour le cadvisor

  - job_name: 'cadvisor'

    # Permet de définir comment joindre le 'cadvisor' via quel port 

    static_configs:
      - targets: ['cadvisor:8098']

  - job_name: 'Jenkins'
    metrics_path: /prometheus
    scheme: http
    tls_config:
      insecure_skip_verify: true
    static_configs:
      - targets: ['jenkins:8080']
    basic_auth:
      username: 'admin'
      password: 'passer123'

  - job_name: 'sonarqube'
    metrics_path: /api/prometheus/metrics
    scheme: http
    tls_config:
      insecure_skip_verify: true
    static_configs:
      - targets: ['sonarqube:9000']
    basic_auth:
      username: 'admin'
      password: 'LeCloudFacile123@#'

  - job_name: 'proxy'
    static_configs:
      - targets: ['proxy:80']

Etape 5: Mise à jour de la configuration du proxy#

Les répertoires lecloudfacile-devops-labs/nginx-proxy/conf.d/grafana et lecloudfacile-devops-labs/nginx-proxy/conf.d/prometheus dovent contenir la configuration du proxy nginx pour la gestion des requêtes entrantes en ce concerne l'application moodboard. Elle permettra dans notre cas de rediriger le trafic vers le bon conteneur. Nous aurons un fichier de conf par application que nous voulons exposer.

  • Option 1 : Création des fichiers de configurations à partir des templates
devops@lecloudfacile:~$ cd lecloudfacile-devops-labs/nginx-proxy/
devops@lecloudfacile:~$ cp conf.d/grafana/grafana.scratch..conf.template conf.d/grafana.conf
devops@lecloudfacile:~$ cp conf.d/moodboard/prometheus.scratch..conf.template  conf.d/prometheus.conf
  • Options 2 : Création fichiers de configurations from scratch

  • Créer un fichier conf.d/grafana/grafana.conf pour l'accès à Grafana

    ```yaml server { listen 80; server_name grafana.lcf.io;

      location / {
          proxy_pass http://grafana:3000;
          proxy_set_header Host $host;
          proxy_set_header X-Real-IP $remote_addr;
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
          proxy_set_header X-Forwarded-Proto $scheme;
      }
    

    } ```

  • Créer un fichier conf.d/prometheus/prometheus.conf pour l'accès l'interface de pro;o

    ```yaml server { listen 80; server_name prometheus.lcf.io;

      location / {
          proxy_pass http://prometheus:9090;
          proxy_set_header Host $host;
          proxy_set_header X-Real-IP $remote_addr;
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
          proxy_set_header X-Forwarded-Proto $scheme;
      }
    

    }

    ```

Etape 6: Execution des services#

A ce stade, toutes les configurations sont finalisées. Il ne reste plus qu'à démarrer les services grafana et prometheus

  • Démarrage des services

La commande ci-dessous permet de démarrer tous les services en arrière-plan.

docker compose up -d
  • Affichage des conteneurs
docker ps

NB: Certains containers peuvent échouer au démarrage.

Etape 7: Recharge de la configuration du proxy#

Il faudra recharger la configuration du proxy pour prendre en compte les modifications apportées.

devops@lecloudfacile:~$ docker exec -ti proxy nginx -s reload

Etape 8: Configuration de Sonarqube#

Par défaut, Sonarqube n'embarque pas le plugin prometheus permettant l'envoi des metrics vers Prometheus. Pour ce faire, merci d'utiliser la commande suivante pour copier le plugin dans le conteneur SonarQube.

docker cp config/sonar-prometheus-exporter-1.0.0-SNAPSHOT.jar sonarqube:/opt/sonarqube/extensions/plugins

Une fois le copie effectué merci de redemarrer SonarQube.

docker restart sonarqube

Pour vérifier si les metrics remontent aller sur: http://quality.lcf.io/api/prometheus/metrics

Etape 9: Configuration de jenkins#

/!\ Installation plugin prometheus et redemarrage le serveur jenkins

Une fois le serveur redémarré, vérifier que jenkins peut remonter les metrics : http://jenkins-dev.lecloudfacile.io/prometheus

Etape 10: Configuration des dashboards grafana et prometheus#

Aller sur votre navigateur et taper le lien suivant: http://grafana.lcf.io pour joindre le dashboard grafana et http://prometheus.lcf.io pour celui de prometheus.

Etape 11: Configuration Grafana#

  1. Une fois connectée, configurer le datasource pour qu'il pointe sur prometheus
  2. Le repertoire grafana-prometheus/dashboards contient des dashboards préconfigurés.
  3. Importer les dashboards dans Grafana