Monitoring Postgres Cluster with ELK-Stack on Kubernetes

DevOps

Die bisherigen Blogbeiträge der Blogreihe über Kubernetes befassten sich mit der Einführung in Container, Docker und Kubernetes. Im letzten Blogbeitrag haben wir bereits ein lokales Kubernetes Cluster mit drei Knoten aufgesetzt (Anleitung). In diesem Blogbeitrag werden wir dieses nutzen, um mit dem Elastic Stack Log Dateien einer PostgreSQL Instanz zu überwachen.

Elastic Stack

Der Elastic Stack (auch ELK-Stack) setzt sich aus drei Hauptkomponenten zusammen. Auf der untersten Schicht befinden sich die Komponenten, welche Daten (Systemmetriken, Statusinformationen, Log Dateien) an eine zentrale Einheit schicken, die sogenannten data shipper. Diese können entweder das Beats Framework oder Logstash sein. Die zentrale Einheit im Elastic Stack ist Elasticsearch, diese bietet uns Speicher, Such- und Analysefunktionalitäten. Die oberste Schicht im Elastic Stack ist Kibana, mit der die in Elasticsearch gespeicherten Daten visualisiert und in nahezu Echtzeit analysiert werden können. Diese drei Komponenten sind außerdem Open Source.

Benötigen wir noch zusätzliche Monitoring-, Warnungs- und Sicherheits Features gibt es X-Pack. In der kostenlosen BASIC Lizenz des Elastic Stacks erhalten wir mit X-Pack nur die Kern-Sicherheitsfeatures (TLS, Nutzer mit Rollen). Erweiterte Sicherheits Features, wie zum Beispiel LDAP Anbindung, gibt es nur im kostenpflichtigen Paket von X-Pack. Mit der Elastic Cloud wird auch ein cloud-basiertes und verwaltetes Setup der Elastic Stack Komponenten zur Verfügung gestellt. Dieses ist auch nur in einem kostenpflichtigen Abelger erhältich.

Abbildung: Elastic Stack

Elasticsearch

Elasticsearch ist im Elastic Stack die zentrale Einheit. Die Daten werden hier strukturiert, abgelegt und sind über das Visualierungstool Kibana zugreifbar. Elasticsearch ist neben Solr die am weitesten verbreitete Suchmaschine und basiert auf der Bibliothek Apache Lucene, die beispielsweise auch von Twitter verwendet wird.

Daten werden in Elasticsearch unter Dokumente, Typen und Indexe strukturiert. Ein Dokument besteht aus mehreren key-value Feldern. Dokumente desselben Types (gleiche Felder) werden unter einem bestimmten Typ (wie eine collection unter MongoDB) gruppiert. Unter einem Index wird ein dedizierter Dokumenttyp verwaltet. Ein Index kann dabei nur Dokumente eines bestimmten Types verwalten.

Abbildung: Elasticsearch Konzepte

Beats

Neben Logstash bietet uns das Beats Framework mehrere Möglichkeiten Daten in den Elastic Stack zu senden. Beats bietet uns für diverse Anwendungsfälle einen passenden Shipper an, um entweder Systemmetriken, Log Dateien oder Statusinformationen an eine zentralisierte Einheit (Output) zu schicken.

Alle Beats Komponenten verwenden die Bibliothek Libbeat. Diese bietet mit einer API die möglichkeit Daten an einen (oder mehrere) Outputs zu senden. In der folgenden Abbildung sind alle Komponenten im Zusammenspiel dargestellt. Im Vergleich zu Logstash laufen die Beats als leichtgewichtige Agents direkt auf der Instanz, von der die Informationen aus versendet werden. Sie benötigen wenige Hardwareressourcen und können sogar auf Iot-Geräten betrieben werden.

Abbildung: Beats Architektur

Filebeat

Filebeat dient der Überwachung von Log-Verzeichnis. Wie auch andere Beats (Metricbeat, Heartbeat etc.) läuft dieser als Agent direkt auf der Instanz, von der die Daten aus gesendet werden. Die Konzepte, welche Filebeat verwendet, sind: Inputs, Harvester und Spooler.

  • Inputs: Definiert die Liste von Verzeichnissen, die überwacht werden sollen.
  • Harvester: Kümmert sich um das Öffnen/Schließen und Lesen von Dateien. Für jede Datei wird ein Harvester Prozess gestartet.
  • Spooler: Sammelt die gelesenen Zeilen und sendet diese zu den konfigurierten Outputs.

Die nachfolgende Abbildung stellt eine Beispielarchitektur dar, in der das Verzeichnis /var/log/postgresql überwacht wird, indem zwei Log-Dateien liegen. Mit Filebeat können neben der Überwachung von mehreren Verzeichnissen zudem auch mehrere Outputs konfiguriert werden, an die die Events gesendet werden sollen. Möchte man Logstash als Output verwenden, muss auf der Logstash-Seite auch Beats als Input Plugin konfiguriert werden.

Abbildung: Filebeat Architektur

Kibana

Kibana ist ein webbasiertes Analyse- und Visualisierungstool, aus dem Daten, die mit Beats bzw. Logstash, an Elasticsearch gesendet werden können. Graphen oder Statistiken können beispielsweise damit generiert werden. Neben dem Erstellen von Visualierungen, können die Daten auch in nahezu Echtzeit mit diversen Filtern durchsucht werden. Bevor man mit Kibana einen Elasticsearch Index analysieren kann, muss man ein Index Pattern auf Kibana erstellen.

1. Filebeat Index auswählen

Abbildung: Kibana Index auswählen

2. Index Pattern erstellen

Abbildung: Kibana Index erstellen

3. Filebeat Index analysieren

Abbildung: Filebeat Index durchsuchen

PostgreSQL und Filebeat

Um nun Log Dateien meines Postgres Containers in Kibana zu sehen, muss dieser zusammen mit Filebeat bereitgestellt werden. Mit Kubernetes kann dafür das Sidecar Konzept verwendet werden, dies ist eine Möglichkeit, um zwei Container in einem Pod zu betreiben. Mein Postgres und Filebeat Container teilen sich dabei Netzwerk-, Speicher- und Hardressourcen, die sie von ihrem Pod bereitgestellt bekommen. In meiner Konfigurationsdatei für Filebeat (filebeat.yml) konfiguriere ich nun das Verzeichnis, von dem aus die Log Dateien an Elasticsearch gesendet werden sollen. Im Falle von Postgres wäre dies unter /var/log/postgresql möglich.

Abbildung: Kubernetes Sidecar

Automatisiertes Deployment

Nach der Einführung in die wichtigsten Elastic Stack Komponenten und deren Funktionsweise können wir uns nun ein lokales Setup aufbauen. Dieses Setup setzt sich wie folgt zusammen:

  • lokales Kubernetes Cluster mit 3 Knoten
  • Elasticsearch
  • Kibana
  • PostgreSQL + Filebeat Sidecar

Wenn das lokale Kubernetes Cluster funktionsbereit ist (Anleitung) kann man nun Elasticsearch mit Kibana darauf bereitstellen (Anleitung). Sobald auch diese Teile des Elastic Stacks funktionsbereit sind, kann Filebeat die PostgreSQL Logs an Elasticsearch senden (Anleitung).

Für den Zugriff auf Kibana muss man nur noch den Dienst (mit dem Port) von dem Host-System erreichbar machen.

# Name eurer Kibana Deployment Ressource anzeigen
kubectl get pods -n elk-stack
# Port 5601 von eurer Kibana Deployment Ressourcen über euer Host-System erreichbar machen
kubectl port-forward <kibana-deployment-name> 5601:5601 -n elk-stack

Nun kann man Kibana im Browser über localhost erreichen.

Literaturempfehlungen

Im folgenden sind meine Empfehlungen, wenn Ihr euch näher mit dem Elastic Stack beschäftigen möchtet:

Yannic Nevado Autor

Yannic Nevado ist ein Datenbank-Consultant bei der Proventa AG. Seine Schwerpunkte liegen beim Open Source und EDB Postgres. Er arbeitet mit Kunden daran neue Datenbanksysteme einzuführen. Des Weiteren unterstützt er Migrationen von Oracle und DB2  zu Postgres. DevOps mit Containern und Kubernetes gehören außerdem zu seinem Alltag. Gerne teilt er sein neu erlangtes Wissen bei der Postgres User Group Frankfurt weiter.

Tags