Skip to content

ELK Stack im Cluster-Betrieb

2017 Mai 26
by Haf

Mit dem ELK Stack bekommt man eine abgestimmte Umgebung um Log-Einträge per Logstash abzuholen, diese in Elasticsearch vorzuhalten und dann per Kibana anzuzeigen. Das Aufsetzen des ELK Stack wird mit den Docker Images von Elastic vereinfacht. Um diese jedoch im Cluster zu nutzen müssen ein paar Anpassungen durchgeführt werden, welche hier dargestellt werden.

Einrichtung

Elastic bietet auf GitHub mehrere Docker Images an:

Mittels docker-compose kann eine Konfiguration aufgesetzt werden, um die gewünschte Cluster-Umgebung aufzusetzen. In diesem Beispiel wird vernachlässigt, dass die einzelnen Container auf unterschiedliche Hosts laufen sollten. Jedoch wird hierfür bei der Konfiguration schon entsprechend Beachtung geschenkt.

Die angestrebte Umgebung sieht wie folgt aus:

ELK Stack Cluster

 

Die Grundgedanken sind:

  • Ein Elasticsearch Client Node dient nur für die reine Koordination und stellt die benötigten Ports (hier: 9200 und 9300) bereit.
  • Ein paar Elasticsearch Master Nodes, welche selbst keine Daten halten.
  • Ein paar Elasticsearch Data Nodes für die reine Datenhaltung.
  • Ein direkter Zugriff ist nur über den Client Node möglich.
  • Kibana und Logstash kennen nur den Client Node und dessen Port.

Die docker-compose Konfiguration sieht wie folgt aus:

 

Zu beachten sind folgende Punkte:

  • Elasticsearch bietet mit Zen ein Discovery Mechanismus an, um neue Nodes zu finden. Dabei müssen alle Hosts angegeben werden. Hier wurde es vereinfacht, da der Service-Name „elasticsearch-master“ verwendet wurde.
  • Container welche skaliert werden sollen, dürfen keinen festen container_name verwenden; da dieser eindeutig sein muss. Beim Start wird hierfür ein Name mit einer Nummer vergeben.
  • Dabei Logstash kann mit einem Unterstrich „_“ im Hostnamen nicht umgehen (https://github.com/logstash-plugins/logstash-output-elasticsearch/pull/363)
  • In logstash.yml und logstash.conf wird der Hostname (elasticsearch-coordinating) aufgenommen.
  • Logstash darf nicht mit dem Master kommunizieren; hierfür ist auch beim Master Node explizit der HTTP Transportweg deaktiviert; andernfalls wird bei der Ermittlung der vorhandenen Nodes auch der Master Node betrachtet.
  • Zu beachten ist, dass für Elasticsearch der virtuelle Adressraum ausreichend groß gewählt wird, um ein möglichen OutOfMemory zu vermeiden: https://www.elastic.co/guide/en/elasticsearch/reference/current/vm-max-map-count.html
  • Standardmäßig wird seit Version 5 Elasticsearch mit X-Pack bereitgestellt (https://www.elastic.co/guide/en/x-pack/5.4/xpack-introduction.html). X-Pack ist eine Erweiterung um Elasticsearch, bzw. auch Kibana, um Funktionen bezüglich Security, Alerting, Monitoring und Reporting bereitzustellen. Dadurch lässt sich standardmäßig schon viele Informationen sammeln und direkt im ELK-Stack bereitstellen. In diesem Beispiel wurde Security deaktiviert; da hier für Logstash Probleme mit der benötigten Rolle auftraten und gesondert gelöst werden muss.
  • Damit die Container sich untereinander finden und Dienste/Ports aus anderen Container verwendet werden können, muss eine Verlinkung her. Der beim links angegebene Name dient als Hostname in dem entsprechenden Docker Container (hier: elasticsearch-coordinating).

Ein

sorgt dafür, dass die Docker Container gestartet werden – das sind neben den Client, Master und ein Data Node auch die Container für Kibana und Logstash.

http://localhost:9200/_cat/health

liefert ein gelben Status zurück, da wir nur einen Data Node verfügen.

Mittels

werden die Master und Data Nodes hochskaliert. Danach liefert ein Healtcheck auch den grünen Status zurück.

Fazit

Mit einfachen Mitteln lässt sich ein ELK Stack im Cluster-Betrieb aufsetzen. Die Skalierung der einzelnen Nodes – hier Master und Data – ist einfach realisierbar, wenn man die wichtigsten Punkte beachtet: Jegliche Kommunikation über einen Client Node und die Verlinkung zwischen den Container soll über symbolische Namen erfolgen.

Alle Dateien sind in Git zu finden: https://bitbucket.org/playsphere/monitoring.git

 

Hilfreiches

  • Aufruf URL für Kibana: http://localhost:5601/
  • Aufruf URL für Elasticsearch: http://localhost:9200/
  • Um mittels einer Shell in ein Docker Container zu gelangen: docker exec -it $ID bash wobei $ID die ID z.B. von docker ps für den relevante Container.

Offen

  • ELK-Stack mit X-Pack Security verwenden, hierfür muss das Problem mit der fehlenden Rolle/Privileg für Logstash gelöst werden.
  • Einsatz von Docker swarm um die Skalierung zu vereinfachen.
Share it!
  •  
  •  
  •  
  •  
  •  
  •  
No comments yet

Leave a Reply

Note: You can use basic XHTML in your comments. Your email address will never be published.

Subscribe to this comment feed via RSS