CodeGym /Cours /Docker SELF /Configuration de la surveillance et des logs

Configuration de la surveillance et des logs

Docker SELF
Niveau 24 , Leçon 1
Disponible

7.1 Configuration de la surveillance avec Prometheus

À cette étape, on va voir comment configurer la surveillance et la journalisation pour notre application multi-conteneurs. Ça permettra de suivre l'état et la performance des services, ainsi que de collecter et analyser les logs pour diagnostiquer des problèmes.

Objectif: collecter des métriques des services et les visualiser pour surveiller la performance et l'état de l'application.

Installation et configuration de Prometheus

Dans cet exemple, Prometheus est lancé avec Docker. Ça offre une compatibilité multiplateforme et permet de déployer efficacement la surveillance sur n'importe quel système d'exploitation prenant en charge Docker.

1. Création d'un répertoire pour la configuration de Prometheus :

Terminal

mkdir prometheus
cd prometheus

2. Création d'un fichier de configuration prometheus.yml :

Yaml

global:
  scrape_interval: 15s

scrape_configs:
  - job_name: 'flask-app'
    static_configs:
      - targets: ['backend:5000']
  - job_name: 'node-app'
    static_configs:
      - targets: ['frontend:3000']

3. Création d'un Dockerfile pour Prometheus :

dockerfile

FROM prom/prometheus
COPY prometheus.yml /etc/prometheus/prometheus.yml

4. Ajout de Prometheus dans compose.yaml :

Yaml

version: '3'

services:
  frontend:
    build: ./frontend
    ports:
      - "3000:3000"
    networks:
      - task-network

  backend:
    build: ./backend
    ports:
      - "5000:5000"
    depends_on:
      - database
    networks:
      - task-network
    environment:
      - DATABASE_URL=postgresql://taskuser:taskpassword@database:5432/taskdb

  database:
    image: postgres:13
    environment:
      - POSTGRES_DB=taskdb
      - POSTGRES_USER=taskuser
      - POSTGRES_PASSWORD=taskpassword
    networks:
      - task-network
    volumes:
      - db-data:/var/lib/postgresql/data

  nginx:
    build: ./nginx
    ports:
      - "80:80"
    depends_on:
      - frontend
      - backend
    networks:
      - task-network

  prometheus:
    build: ./prometheus
    ports:
      - "9090:9090"
    networks:
      - task-network

networks:
  task-network:
    driver: bridge

volumes:
  db-data:

7.2 Installation et configuration de Grafana

1. Création d'un répertoire pour la configuration de Grafana :

Terminal

mkdir grafana
cd grafana

2. Création du Dockerfile pour Grafana :

dockerfile

FROM grafana/grafana

3. Ajout de Grafana dans docker-compose.yml :

Yaml

  grafana:
    image: grafana/grafana
    ports:
      - "3033:3000"
    depends_on:
      - prometheus
    networks:
      - task-network

4. Configuration de Grafana pour fonctionner avec Prometheus :

  1. Lancez les conteneurs avec docker compose up.
  2. Rendez-vous sur l'interface web de Grafana à l'adresse http://localhost:3033.
  3. Connectez-vous avec les identifiants par défaut (admin/admin).
  4. Accédez à "Configuration" -> "Data Sources" et ajoutez une nouvelle source de données.
  5. Choisissez "Prometheus" et spécifiez URL http://prometheus:9090.
  6. Sauvegardez la configuration.

Création de tableaux de bord dans Grafana

  1. Création d'un nouveau tableau de bord :
    • Allez dans "Create" -> "Dashboard".
    • Cliquez sur "Add new panel".
    • Dans la section "Query", sélectionnez la source de données Prometheus.
    • Entrez une requête PromQL pour obtenir les métriques. Par exemple, pour surveiller l'utilisation du CPU :
  2. Promql
    
    rate(container_cpu_usage_seconds_total[1m]) 
            
  3. Configuration du panneau (Panel) :
    • Sélectionnez le type de graphique (par exemple, "Graph").
    • Configurez le panneau (par exemple, nom, légende, axes, etc.).
    • Cliquez sur "Apply" pour sauvegarder le panneau.
  4. Création de panneaux supplémentaires :
    • Répétez les étapes pour créer des panneaux supplémentaires pour d'autres métriques comme la mémoire, le réseau et le disque.

7.3 Configuration du ELK Stack

Configuration de la journalisation avec ELK Stack (Elasticsearch, Logstash, Kibana).

Objectif : collecter, stocker et analyser les logs de nos services.

Installation et configuration de Elasticsearch

Ajout de Elasticsearch dans compose.yaml :

Yaml

  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:8.15.0
    environment:
      - discovery.type=single-node
    ports:
      - "9200:9200"
    networks:
      - task-network

Installation et configuration de Logstash

Étape 1. Création du répertoire pour la configuration de Logstash :

Terminal

mkdir logstash
cd logstash

Étape 2. Création du fichier de configuration logstash.conf :

Text

input {
  beats {
    port => 5044
  }
}
filter {
  json {
    source => "message"
  }
}
output {
  elasticsearch {
    hosts => ["elasticsearch:9200"]
    index => "docker-logs-%{+YYYY.MM.dd}"
  }
}

Étape 3. Création du Dockerfile pour Logstash :

dockerfile

FROM docker.elastic.co/logstash/logstash:8.15.0
COPY logstash.conf /usr/share/logstash/pipeline/logstash.conf

Étape 4. Ajout de Logstash dans compose.yaml :

Yaml

  logstash:
    build: ./logstash
    ports:
      - "5044:5044"
    depends_on:
      - elasticsearch
    networks:
      - task-network

Installation et configuration de Kibana

Ajout de Kibana dans compose.yaml :

Yaml

  kibana:
    image: docker.elastic.co/kibana/kibana:8.15.0
    ports:
      - "5601:5601"
    depends_on:
      - elasticsearch
    networks:
      - task-network

Installation de Filebeat pour collecter les logs

Étape 1. Création du répertoire pour la configuration de Filebeat :

Terminal

mkdir filebeat
cd filebeat

Étape 2. Création du fichier de configuration filebeat.yml :

Yaml

filebeat.inputs:
- type: docker
  containers.ids:
    - '*'
processors:
  - add_docker_metadata: ~
output.logstash:
  hosts: ["logstash:5044"]

Étape 3. Création du Dockerfile pour Filebeat :

dockerfile

FROM docker.elastic.co/beats/filebeat:8.15.0
COPY filebeat.yml /usr/share/filebeat/filebeat.yml

Étape 4. Ajout de Filebeat dans compose.yaml :

Yaml

filebeat:
    build: ./filebeat
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock:ro"
    depends_on:
      - logstash
    networks:
      - task-network

7.4 Fichier complet

Fichier complet compose.yaml

Yaml

version: '3'

services:
  frontend:
    build: ./frontend
    ports:
      - "3000:3000"
    networks:
      - task-network
        
  backend:
    build: ./backend
    ports:
      - "5000:5000"
    depends_on:
      - database
    networks:
      - task-network
    environment:
      - DATABASE_URL=postgresql://taskuser:taskpassword@database:5432/taskdb
        
  database:
    image: postgres:13
    environment:
      - POSTGRES_DB=taskdb
      - POSTGRES_USER=taskuser
      - POSTGRES_PASSWORD=taskpassword
    networks:
      - task-network
    volumes:
      - db-data:/var/lib/postgresql/data
        
  nginx:
    build: ./nginx
    ports:
      - "80:80"
    depends_on:
      - frontend
      - backend
    networks:
      - task-network
        
  prometheus:
    build: ./prometheus
    ports:
      - "9090:9090"
    networks:
      - task-network
        
  grafana:
    image: grafana/grafana
    ports:
      - "3033:3000"
    depends_on:
      - prometheus
    networks:
      - task-network
        
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.9.2
    environment:
      - discovery.type=single-node
    ports:
      - "9200:9200"
    networks:
      - task-network
        
  logstash:
    build: ./logstash
    ports:
      - "5044:5044"
    depends_on:
      - elasticsearch
    networks:
      - task-network
        
  kibana:
    image: docker.elastic.co/kibana/kibana:7.9.2
    ports:
      - "5601:5601"
    depends_on:
      - elasticsearch
    networks:
      - task-network
        
  filebeat:
    build: ./filebeat
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock:ro"
    depends_on:
      - logstash
    networks:
      - task-network
        
networks:
  task-network:
    driver: bridge
        
volumes:
  db-data:
Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION