docker redis elk

Docker, Elk et Redis, première installation

Retour d'expérience sur ma première utilisation de la stack ELK via docker

varnish, nginx, docker, redis, elk, kibana, elasticsearch, logstash

Date de publication : 2015-02-28 16:53:51

L’architecture choisie pour ce premier essai se compose de deux éléments :

Un client (appelé client logstash dans la suite de l'article), qui contient uniquement logstash et qui communiquera des logs d'accès http à un redis.

Un serveur (appelé serveur RELK dans la suite de l'article), qui se compose d'un redis qui sert de tampon, de logstash qui y pioche les données pour les balancer à elasticsearch et enfin kibana pour avoir des jolis graphes.

Installation de docker

La procédure d'installation est détaillée ici
Cette opération est faite sur les deux machines, celle qui recevra le client, et celle qui recevra le serveur. Sur debian, toutes les données docker sont stockées dans /var/lib/docker. Afin de vous éviter la même mésaventure que moi (disque plein), je vous conseille garder quelques Go d'espace disque sous le coude.

Installation et lancement du serveur RELK

Une fois que docker est ok, l'image contenant toute la partie serveur est sur mon repo docker hub.

La commande suivante télécharge l'image et lance le conteneur dans la foulée :

docker run --name relk --restart=always -v /home/data/docker/rel/data:/data -d -p 127.0.0.1:6379:6379 -p 127.0.0.1:9200:9200 petitchevalroux/relk
  • --name permet nommer le conteneur, ici relk.
  • --restart=always permet d'indiquer au démon docker de redemmarrer le conteneur (cf restart-policies)
  • -v /home/data/docker/rel/data:/data permet de stocker les données elasticseach dans le répertoire /home/data/docker/rel/data du la machine hôte.
  • -d indique de lancer le conteneur en étant détaché.

J'ai choisi le port 8081 pour Kibana. Le port 6379 correspond à redis et le 9200 correspond à Elasticsearch. Tous ces ports sont bindés sur 127.0.0.1 pour éviter de les ouvrir sur toutes les interfaces.

A vous de voir comment vous monter votre archi, mais j'ai choisi de faire passer 9200 et le 8081 par un vpn, le 6379 est uniquement ouvert pour les ips des clients logstash.

Configuration iptables pour le serveur RELK

Pour pouvoir établir la connexion du client logstash vers le serveur redis, j'ai ajouté les commandes suivantes dans mon firewall (cf : iptables) :

# On active le routing eth0 => lo
sysctl -w net.ipv4.conf.eth0.route_localnet=1
# On redirige le redis sur le port docker
iptables -t nat -A PREROUTING -i eth0 -s $IP -p tcp --dport 6379 -j DNAT --to-destination 127.0.0.1:6379
# On autorise le trafic entrant correspondant à cette redirection
iptables -A INPUT -p tcp -i eth0 -s $IP --dport 6379 -j ACCEPT
  • eth0 correspond à l'interface public du serveur
  • $IP l'adresse ip du client logstash

Pour pouvoir accéder à kibana et ES voici l'equivalent :

# Activation du routing de tun0 vers la boucle locale
sysctl -w net.ipv4.conf.tun0.route_localnet=1
# On redirige le trafic elasticsearch sur la boucle locale
iptables -t nat -A PREROUTING -i tun0 -p tcp --dport 9200 -j DNAT --to-destination 127.0.0.1:9200
# On accepte les connexions entrantes depuis le VPN
iptables -A INPUT -p tcp -i tun0 --dport 9200 -j ACCEPT
# On redirige le trafic kibana sur la boucle local
iptables -t nat -A PREROUTING -i tun0 -p tcp --dport 8081 -j DNAT --to-destination 127.0.0.1:8081
# On accepte les connexions entrantes depuis le VPN
iptables -A INPUT -p tcp -i tun0 --dport 8081 -j ACCEPT

tun0 étant l'interface de mon VPN.

Une fois ces ports ouverts, on relance le service docker via la commande :

service docker restart

Et on peut vérifier que le conteneur est bien relancé via la commande :

docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8acce2f62600 petitchevalroux/relk:latest "/usr/bin/supervisor 47 hours ago Up 47 hours 127.0.0.1:6379->6379/tcp, 127.0.0.1:9200->9200/tcp relk

Si tout se passe bien vous devez avoir accès aux deux urls suivantes (Attention parfois ES est un peu long à se lancer, patientez un peu) :
<ip>:8081/#/dashboard/file/default.json
<ip>:9200/_plugin/head/
La première est Kibana, la seconde le plugin elasticsearch head qui permet de voir le contenu et les indexes.

Installation et lancement du client logstash

Depuis un serveur distant :

docker run --restart=always -d -v /var/log/nginx:/var/log/nginx --add-host="redis:<ip>" petitchevalroux/logstash

Remplacer <ip> par l'adresse du serveur Redis + Elk
Depuis l'hôte du serveur relk :

docker run --restart=always --name logstash -d -v /var/log/nginx:/var/log/nginx --link relk:redis petitchevalroux/logstash

Le Dashboard Kibana d'analyse des logs http

Entre le début de la redaction et la publication de cet article, Kibana est sortie en version 4... Voici donc quelques graphiques que j'ai réalisé sur la version 3 en attendant un nouvel article.

Le Dashboard complet pour l'analyse de log http contenant :

  • Un graphique montrant l'évolution des différents status http.
  • Un graphique montrant l'évolution de la bande passante consommée.
  • Une carte indiquant la provenance des requêtes http.
  • Un tableau contenant les adresses ips classées par nombre de requêtes.

analyse logs http elk

Quelques zooms des graphiques kibana

Requête http par status :

nombre de requete par status http


La répartition géographique des requêtes :

repartition geographique requetes http


 
 

b1n@sp1n