< Home

Une stack ELK from scratch avec Docker

Ou comment déployer une architecture de monitoring en quelques minutes.

Mo-ni-to-rer.

En quelques années, le monitoring est devenu une activité indispensable dans le monde de l’IT. Qu’il soit technique ou fonctionnel, qu’il fournisse des métriques, charts, ou autres KPI, le monitoring de son système est devenu un must-have.

Dans la suite de l’article, nous allons voir comment déployer une architecture de monitoring à partir de zéro, en quelques minutes, grâce à Docker.

La stack.

Pour commencer, nous nous appuyerons sur la stack ELK qui, en quelques années, est devenue une alternative crédible aux autres solutions de monitoring (Splunk, solutions SAAS…).

Elle se compose des éléments suivants:

  • E comme Elasticsearch, le moteur d’indexation, de recherche & d’analytics,
  • L comme Logstash, un ETL permettant de récupérer les données dans des sources hétérogènes, les transformer et les envoyer vers Elasticsearch,
  • K comme Kibana, un IHM de visualisation et de générations de tableaux de bord interactifs

Nous ajouterons également :

  • R comme *Redis, *utilisé comme broker en amont, qui servira de buffer en cas de latence du système, tout en évitant un engorgement trop important en cas de pic,
  • C comme Curator, un outil de management des indexs
  • **B *comme *Beats, sondes à installer côté client afin d’envoyer les logs/métriques à notre stack

Stack de monitoringNotre stack de monitoring

Déploiement.

Nous utiliserons des conteneurs Docker pour chacun des composants de notre stack.

L’ensemble des services et des interactions sont décrites dans un fichier docker-compose.yml:

version: "2"
services:
# brocker
redis:
image: redis:3.2.6
container_name: redis
ports:
- 6379:6379
volumes:
- redis-data:/data
networks:
- logging
# index, search & agregation
elasticsearch:
image: elasticsearch:5.1.2
container_name: elastic
environment:
- ES_JAVA_OPTS=-Xms1g -Xmx1g
ports:
- 9200:9200
- 9300:9300
volumes:
- $PWD/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
- "es-data:/usr/share/elasticsearch/data"
networks:
- logging
# UI
kibana:
image: kibana:5.1.2
container_name: kibana
ports:
- 5601:5601
volumes:
- $PWD/kibana/config/kibana.yml:/etc/kibana/kibana.yml
networks:
- logging
depends_on:
- elasticsearch
# indexer
logstash:
image: logstash:5.1.2
container_name: logstash
command: logstash -f /config/
environment:
- JAVA_OPTS=-Xms1g -Xmx1g
volumes:
- $PWD/logstash/config:/config
networks:
- logging
depends_on:
- elasticsearch
- redis
volumes:
es-data:
driver: local
redis-data:
driver: local
networks:
logging:
driver: bridge
view raw docker-compose.yml hosted with ❤ by GitHub

Pour chacun des services, on va définir si besoin les ports à exposer ou les volumes à utiliser (notamment les fichiers de configuration). Un exemple de configuration viable est disponible sur mon compte github : docker_elk_stack.

Hello, world

En se basant sur ce repository, nous allons déployer une stack fonctionnelle:

# clone repo & build images
git clone [https://github.com/d3rwan/docker_elk_stack](https://github.com/d3rwan/docker_elk_stack)
cd docker_elk_stack
docker-compose build

# run (daemon)
docker-compose up -d

# show logs
docker-compose logs

Une fois les différents composants démarrés, vous devriez pouvoir accéder à l’interface Kibana (port 5601).

Puis nous allons lancer un example d’application web (site HTML statique exposé par Nginx, ainsi qu’une sonde FileBeat permettant l’envoi des logs vers notre stack ELK)

# build image
docker build ./webapp -t dockerelkstack_webapp

# run (daemon)
docker run --network dockerelkstack_logging --link redis:redis -p 80:80 -d --name webapp dockerelkstack_webapp

# show logs
docker logs webapp

Une fois notre composant démarré, vous devriez pouvoir accéder à l’application web (port 80).

Exemple d’application webExemple d’application web (source: https://github.com/sbilly/joli-admin)

Après avoir navigué quelques minutes, en retournant sur l’IHM de Kibana, un index *logstash *est à présent disponible.

Configuration pattern d'indexKibana : écran de configuration d’un pattern d’index (ici, l’index logstash est détecté)

Après avoir crée notre pattern d’index, nous pouvons à présent naviguer dans les logs de notre application web (onglet Discover), créer des visualisations (onglet Visualize) et des tableaux de bord (onglet Dashboard)

Kibana: données brutesKibana: Visualisation brute des logs de notre application web

Kibana: tableau de bord analytiqueKibana: Tableau de bord analytique

And… voilà! Nous avons donc mis en place, en quelques minutes seulement, une stack de supervision opérationnelle.