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
Notre stack de monitoring
Déploiement.
Nous utiliserons des conteneurs Docker pour chacun des composants de notre stack.
- Elasticsearch, dans sa version 5.1.2,
- Logstash, dans sa version 5.1.2,
- Kibana, dans sa version 5.1.2,
- Redis, dans sa version 3.2.6,
- Curator, dans sa version 4.0.4
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 |
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 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.
Kibana : é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: Visualisation brute des logs de notre application web
Kibana: Tableau de bord analytique
And… voilà! Nous avons donc mis en place, en quelques minutes seulement, une stack de supervision opérationnelle.