Skalierbares Logging mit Grafana Loki 

Von Patrick Arnold , 15.07.2019, 10:28
Grafana

Was ist Loki? Loki ist ein horizontal, hochverfügbares, mandantenfähiges Log-Aggregationssystem, welches sich an Prometheus orientiert. Eine Besonderheit gegenüber anderen Log-Aggregationssysteme ist, dass Loki die Logs nicht indiziert. Loki ist zu 100% Opensource und der Maincommitter ist aktuell Grafana Labs. Loki befindet sich aktuell noch in einer Alphaversion. 


Im Vergleich zu anderen Log-Aggregationssystemen hat Loki:

 

  • Keine Volltextindizierung der Logs, durch die Speicherung komprimierter und unstrukturierter Logdaten ist Loki einfacher und kostengünstiger zu betreiben.
  • Indiziert und gruppiert Log-Streams mit den gleichen Labeln, die bereits im Prometheus verwendet werden, so ist ein nahtloser Wechsel zwischen Logs und Metriken möglich
  • Besonders gut für die Speicherung von Kubernetes Pod Logdaten. Metadaten wie Pod Labels werden automatisiert gescannt und indiziert
  • Wird nativ von Grafana unterstützt (erst ab Version 6.0) 

 
Loki benötigt aktuell 3 Komponenten um lauffähig zu sein:

 

  • Promtail – Agent, welcher die Logs sammelt und an Loki übermittelt
  • Loki – „Zentralserver“, zuständig für das Speichern der Logs und ausführen der Queries
  • Grafana – Dashboard für die Anzeige der gesammelten Logs und ausgeführten Queries 


Wenn man das ganze zusammenfassen möchte, kann man sagen, dass Loki wie Prometheus ist, nur für Logs anstatt für Metriken und die Daten werden via push anstatt pull gesammelt. 

Installation von Loki Es gibt unterschiedliche Installationsverfahren um Loki zu installieren:

 

  • Helm Chart
  • Docker-Compose
  • Sourcen 

 

Da für das Deployment auf ein Kubernetescluster mittlerweile der „Quasistandard“ Helm ist, werden wir uns in diesem kurzen Artikel damit beschäftigen, wie wir Loki via Helm auf unser Cluster deployen. 

Im ersten Schritt benötigten wir hierfür ein Kubernetes-Cluster. Hierfür provisionieren wir uns ein Cluster auf GCP (Google Cloud Platform). Sollten Sie GCP noch nie verwendet haben, wird ihnen dort ein Testguthaben von 300€ für maximal 12 Monate zur Verfügung gestellt. Um den Aufwand minimal zu halten, provisionieren wir unser Cluster über die Admin Oberfläche. Selbstverständlich wäre auch eine Provisionierung über Terrraform oder den von GCP zur Verfügung gestellten Cloud Deployment Manger möglich, würde jedoch den Rahmen sprengen. 


Nach dem Login/Registrierung bei GCP öffnet sich die Admin-Console auf der wir dann den Reiter Kubernetes-Engine auswählen 

GCP

Hier kann es sein, dass es noch einen Moment dauert, bis die Kubernetes-Engine API für Ihr Konto aktiviert wird. Sollte dies bereits erledigt sein, können wir nun ein Cluster erstellen: 

GKE

 

Für unsere Demo benötigen wir kein sehr großes Cluster und verwenden daher Standard-Instanzen mit nur einer vCPU. Um auf dem Cluster arbeiten zu können, nutzen wir entweder die Google Cloud Shell oder konfigurieren unser lokales kubectl so, dass wir mit dem Cluster sprechen können. Beide Wege werden über einen Klick auf den Verbinden-Button erklärt. 

Im nächsten Schritt möchten wir nun Loki mithilfe des vorgefertigten Helm-Charts installieren. Hierfür muss der Package Manager Helm installiert sein. (eine Beschreibung für die Installation: https://helm.sh/docs/using_helm/) Ist diese Voraussetzung erfüllt, fügen wir das Loki-Helm-Repo hinzu: 

 

$ helm repo add loki https://grafana.github.io/loki/charts

$ helm repo update

 

Nun nehmen wir die eigentliche Installation vor, dafür gibt es zwei unterschiedliche Modis. Einmal mit den Default-Values und einmal mit einer Custom-Config: 

 

Default-Config: $ helm upgrade --install loki loki/loki-stack 
 
Custom Config: $ helm upgrade --install loki loki/loki-stack --set "key1=val1,key2=val2,..." 

 

Im nächsten Schritt installieren wir Prometheus um auch unsere Metriken direkt sammeln zu können: 

 

$ helm install stable/prometheus-operator --name prometheus-operator --namespace monitoring

 

Bei der Installation von Prometheus wird implizit ein Grafana mit installiert, welches wir auch für Loki nutzen können. Für den Zugriff auf unsere Grafana UI nutzen wir das port-forwarding auf unsere eigene Maschine: 


$ kubectl port-forward $(kubectl get  pods --selector=app=grafana -n  monitoring -output=jsonpath="{.items..tadata.name}") -n monitoring 5000:3000

 

Wenn wir nun localhost:5000 aufrufen, sehen wir die Grafana Login Page. Mit dem User „admin“ & dem Passwort „prom-operator“ können wir uns einloggen. Um nun auf unsere Logging-Informationen zugreifen zu können, müssen wir in Grafana eine neue Datasource einrichten. Hierfür klicken wir am Start-Dashboard auf das Symbol „Create your first data source“ und wählen aus der Liste Loki aus. Da wir unseren aktuellen Loki-Server im default-namespace installiert haben, müssen wir folgende URL eingeben um uns gegen den Server zu verbinden: http://loki.default:3100. 

Data sources

 

Nachdem wir uns gegen den Loki Server verbunden haben wählen wir im Menü „Explore“ aus. Hier ist es nun wichtig, dass im Datasource Auswahlfenster Loki ausgewählt ist. Nun kann man aus unterschiedlichen Labels wählen um die aktuellen Applikationslogs zu sehen: 

 

Data

 

Fazit

Dank der einheitlichen Integration haben wir nun unsere Metrikdaten über Prometheus in Grafana und unsere Logginginformationen über Loki. Die Installation der beiden Plattformen ist schnell & einfach erfolgt und wir müssen nicht zwsichen unterschiedlichen Stacks wechseln um all unsere Applikationsdaten einsehen zu können. Eine Integration in andere Ökosysteme findet bereits nach und nach statt, so gibt es bereits ein Loki-Plugin für Fluentd (würde dann promtail ersetzen) und auch die ersten Überlegungen, wie man Loki in Istio integrieren könnte. 


 

 

Kommentare

Christian Niehoff 30.07.2019, 09:59:27

Hallo zusammen,

habt ihr schon mal versucht Loki unter Istio zum Laufen zu bekommen?

Ich scheitere nämlich und es scheint, als wenn das noch kein anderer versucht hat :-)

Viele Grüße,
Chris

Hallo Chris,

was wir aktuell in einer Demo-Umgebung am Laufen haben ist ein Kubernetes-Cluster mit Istio und Loki. Wobei man dazusagen muss, dass die Loki- und Istio-Komponenten in getrennten Namespaces laufen. Der Loki-Namespace hat aktuell auch kein istio-injection-Label, somit ist die Auto-Injection von Envoys deaktiviert. Von den Anwendungen und Istio-Komponenten werden dann mit Hilfe von Promtail die Logs abgeholt.

Viele Grüße

Patrick

Neuen Kommentar schreiben

Ich habe die Datenschutzhinweise zur Kenntnis genommen. Ich stimme zu, dass meine Angaben und Daten zur Beantwortung meiner Anfrage elektronisch erhoben und gespeichert werden.