Loki – Protokolle sammeln mit dem Prometheus-Ansatz

Gruß, Chabrowiten! In Erwartung des Beginns einer neuen Einschreibung für den Kurs „DevOps-Praktiken und -Tools“ Ich habe eine Übersetzung interessanten Materials für Sie vorbereitet.

Dieser Artikel ist eine kurze Einführung in Loki. Projekt Loki unterstützt von Grafana und zielt auf die zentralisierte Sammlung von Protokollen (von Servern oder Containern) ab.

Die Hauptinspiration für Loki war Prometheus mit der Idee, seine Ansätze auf das Log-Management anzuwenden:

  • Verwenden von Etiketten zum Speichern von Daten
  • geringer Ressourcenverbrauch

Wir werden auf die Prinzipien von Prometheus zurückkommen und einige Beispiele für seine Verwendung im Kontext von Kubernetes geben.

Ein paar Worte zu Prometheus

Um vollständig zu verstehen, wie Loki funktioniert, ist es wichtig, einen Schritt zurückzutreten und Prometheus noch einmal zu betrachten.

Eines der charakteristischen Merkmale von Prometheus ist die Extraktion von Metriken aus Sammelpunkten (über Exporteure) und deren Speicherung in einer TSDB (Time Series Data Base, Zeitreihendatenbank) unter Hinzufügung von Metadaten in Form von Labels.

Warum das notwendig ist

Prometheus hat sich in letzter Zeit zum De-facto-Standard in der Welt der Container und Kubernetes entwickelt: Die Installation ist sehr einfach und ein Kubernetes-Cluster verfügt zunächst über einen Endpunkt für Prometheus. Prometheus kann auch Metriken aus Anwendungen extrahieren, die in einem Container bereitgestellt werden, und dabei bestimmte Labels beibehalten. Daher ist die Anwendungsüberwachung sehr einfach zu implementieren.

Leider gibt es noch keine schlüsselfertige Lösung für die Protokollverwaltung, und Sie müssen selbst eine Lösung finden:

  • verwalteter Cloud-Dienst zur Zentralisierung von Protokollen (AWS, Azure oder Google)
  • Überwachungsdienst „Monitoring as a Service“ (z. B. Datadog)
  • Erstellen Sie Ihren eigenen Protokollsammeldienst.

Für die dritte Option habe ich traditionell Elasticsearch verwendet, obwohl ich damit nicht immer zufrieden war (insbesondere wegen der Schwere und Komplexität der Einrichtung).

Loki wurde so konzipiert, dass es nach folgenden Grundsätzen einfach zu implementieren ist:

  • leicht zu starten sein
  • verbrauchen wenig Ressourcen
  • selbstständig und ohne besondere Wartung arbeiten
  • dienen als Add-on zu Prometheus und helfen bei der Fehlersuche

Diese Einfachheit geht jedoch mit einigen Kompromissen einher. Eine davon besteht darin, den Inhalt nicht zu indizieren. Daher ist die Textsuche nicht sehr effizient oder umfangreich und ermöglicht es Ihnen nicht, Statistiken über den Inhalt des Textes zu führen. Da Loki aber das grep-Äquivalent und die Ergänzung zu Prometheus sein möchte, ist dies kein Nachteil.

Untersuchung des Vorfalls

Um besser zu verstehen, warum Loki keine Indizierung benötigt, kehren wir zu der von den Loki-Entwicklern verwendeten Methode zur Untersuchung von Vorfällen zurück:

Loki – Protokolle sammeln mit dem Prometheus-Ansatz
1 Warnung → 2 Dashboard → 3 Ad-hoc-Abfrage → 4 Protokollaggregation → 5 Verteilte Ablaufverfolgung → 6 Fix!
(1 Warnung → 2 Dashboard → 3 Ad-hoc-Abfrage → 4 Protokollaggregation → 5 Verteilte Ablaufverfolgung → 6 Fix!)

Die Idee ist, dass wir eine Art Benachrichtigung erhalten (Slack-Benachrichtigung, SMS usw.) und danach:

  • Schauen Sie sich die Grafana-Dashboards an
  • Schauen Sie sich Service-Metriken an (zum Beispiel in Prometheus)
  • Schauen Sie sich Protokolleinträge an (z. B. in Elasticsearch)
  • Schauen Sie sich vielleicht die verteilten Spuren an (Jaeger, Zipkin usw.)
  • und schließlich das ursprüngliche Problem beheben.

Hier müssen Sie im Fall des Grafana + Prometheus + Elasticsearch + Zipkin-Stacks vier verschiedene Tools verwenden. Um Zeit zu sparen, wäre es schön, alle diese Schritte mit einem Tool erledigen zu können: Grafana. Es ist erwähnenswert, dass dieser Forschungsansatz in Grafana seit Version 6 implementiert ist. Dadurch wird es möglich, direkt aus Grafana auf Prometheus-Daten zuzugreifen.

Loki – Protokolle sammeln mit dem Prometheus-Ansatz
Der Explorer-Bildschirm ist zwischen Prometheus und Loki aufgeteilt

Auf diesem Bildschirm können Sie Protokolle in Loki im Zusammenhang mit Prometheus-Metriken mithilfe des Split-Screen-Konzepts anzeigen. Seit Version 6.5 können Sie mit Grafana die Trace-ID in Loki-Protokolleinträgen analysieren, um Links zu Ihren bevorzugten verteilten Tracing-Tools (Jaeger) zu folgen.

Lokaler Loki-Test

Der einfachste Weg, Loki lokal zu testen, ist die Verwendung von Docker-Compose. Die Docker-Compose-Datei befindet sich im Loki-Repository. Sie können das Repository mit dem folgenden Befehl abrufen git:

$ git clone https://github.com/grafana/loki.git

Anschließend müssen Sie in das Produktionsverzeichnis wechseln:

$ cd production

Danach können Sie die neuesten Docker-Images erhalten:

$ docker-compose pull

Abschließend wird der Loki-Stack mit folgendem Befehl gestartet:

$ docker-compose up

Loki-Architektur

Hier ist ein kleines Diagramm mit der Loki-Architektur:

Loki – Protokolle sammeln mit dem Prometheus-Ansatz
Loki-Architekturprinzipien

Der Webclient führt Anwendungen auf dem Server aus, Promtail sammelt Protokolle und sendet sie an Loki, der Webclient sendet auch Metadaten an Loki. Loki fasst alles zusammen und gibt es an Grafana weiter.
Loki rennt. Um die verfügbaren Komponenten anzuzeigen, führen Sie den folgenden Befehl aus:

$ docker ps

Bei einem frisch installierten Docker sollte der Befehl folgendes Ergebnis zurückgeben:

IMAGE               PORTS                  NAMES
grafana/promtail:                          production_promtail_1
grafana/grafana: m  0.0.0.0:3000->3000/tcp production_grafana_1
grafana/loki: late  80/tcp,0.0.0.0:3100... production_loki_1

Wir sehen folgende Komponenten:

  • Promtail: Agent, der für die Zentralisierung von Protokollen verantwortlich ist
  • Grafana: das berühmte Dashboard-Tool
  • Loki: Datenzentralisierungs-Daemon

Als Teil einer klassischen Infrastruktur (z. B. auf Basis virtueller Maschinen) muss der Promtail-Agent auf jeder Maschine bereitgestellt werden. Grafana und Loki können auf demselben Computer installiert werden.

Bereitstellung auf Kubernetes

Die Installation von Loki-Komponenten in Kubernetes erfolgt wie folgt:

  • daemonSet, um den Promtail-Agenten auf allen Maschinen im Servercluster bereitzustellen
  • Loki-Bereitstellung
  • und der letzte ist der Einsatz von Grafana.

Glücklicherweise ist Loki als Helm-Paket verfügbar, was die Bereitstellung erleichtert.

Installation über Heml

Sie sollten Heml bereits installiert haben. Es kann aus dem GitHub-Repository des Projekts heruntergeladen werden. Die Installation erfolgt durch Extrahieren des für Ihre Architektur geeigneten Archivs und Hinzufügen von helm $PATH.

Hinweis: Version 3.0.0 von Helm wurde kürzlich veröffentlicht. Da es viele Änderungen darin gab, wird dem Leser empfohlen, etwas zu warten, bevor er mit der Nutzung beginnt..

Quelle für Helm hinzufügen

Der erste Schritt besteht darin, das „loki“-Repository mit dem folgenden Befehl hinzuzufügen:

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

Danach können Sie nach Paketen mit dem Namen „loki“ suchen:

$ helm search loki

Ergebnis:

loki/loki       0.17.2 v0.4.0 Loki: like Prometheus, but for logs.
loki/loki-stack 0.19.1 v0.4.0 Loki: like Prometheus, but for logs.
loki/fluent-bit 0.0.2  v0.0.1 Uses fluent-bit Loki go plugin for...
loki/promtail   0.13.1 v0.4.0 Responsible for gathering logs and...

Diese Pakete verfügen über die folgenden Funktionen:

  • Paket Loki/Loki passt nur zum Loki-Server
  • Paket loki/fluent-bit ermöglicht Ihnen die Bereitstellung von DaemonSet mithilfe von Fluent-Bin zum Sammeln von Protokollen anstelle von Promtail
  • Paket loki/promtail enthält einen Protokollsammlungsagenten
  • Paket loki/loki-stack, ermöglicht Ihnen die sofortige Bereitstellung von Loki zusammen mit Promtail.

Loki installieren

Um Loki auf Kubernetes bereitzustellen, führen Sie den folgenden Befehl im Namespace „monitoring“ aus:

$ helm upgrade --install loki loki/loki-stack --namespace monitoring

Um auf der Festplatte zu speichern, fügen Sie die Option hinzu --set loki.persistence.enabled = true:

$ helm upgrade --install loki loki/loki-stack 
              --namespace monitoring 
              --set loki.persistence.enabled=true

Hinweis: Wenn Sie gleichzeitig Grafana bereitstellen möchten, fügen Sie den Parameter hinzu --set grafana.enabled = true

Wenn Sie diesen Befehl ausführen, sollten Sie die folgende Ausgabe erhalten:

LAST DEPLOYED: Tue Nov 19 15:56:54 2019
NAMESPACE: monitoring
STATUS: DEPLOYED
RESOURCES:
==> v1/ClusterRole
NAME AGE
loki-promtail-clusterrole 189d
…
NOTES:
The Loki stack has been deployed to your cluster. Loki can now be added as a datasource in Grafana.
See <a href="http://docs.grafana.org/features/datasources/loki/">http://docs.grafana.org/features/datasources/loki/</a> for more details.

Wenn wir uns den Status der Pods im „Monitoring“-Namespace ansehen, können wir sehen, dass alles bereitgestellt ist:

$ kubectl -n monitoring get pods -l release=loki

Ergebnis:

NAME                 READY  STATUS   RESTARTS  AGE
loki-0               1/1    Running  0         147m
loki-promtail-9zjvc  1/1    Running  0         3h25m
loki-promtail-f6brf  1/1    Running  0         11h
loki-promtail-hdcj7  1/1    Running  0         3h23m
loki-promtail-jbqhc  1/1    Running  0         11h
loki-promtail-mj642  1/1    Running  0         62m
loki-promtail-nm64g  1/1    Running  0         24m

Alle Pods laufen. Jetzt ist es an der Zeit, einige Tests durchzuführen!

Verbindung zu Grafana herstellen

Um eine Verbindung zu Grafana unter Kubernetes herzustellen, müssen Sie einen Tunnel zu seinem Pod öffnen. Im Folgenden finden Sie den Befehl zum Öffnen von Port 3000 für einen Grafana-Pod:

$ kubectl -n port-forward monitoring svc/loki-grafana 3000:80

Ein weiterer wichtiger Punkt ist die Notwendigkeit, das Grafana-Administratorkennwort wiederherzustellen. Das Passwort wird geheim gehalten loki-grafana im Bereich .data.admin-user im Base64-Format.

Um es wiederherzustellen, müssen Sie den folgenden Befehl ausführen:

$ kubectl -n monitoring get secret loki-grafana 
 --template '{{index .data "admin-password" | base64decode}}'; echo

Verwenden Sie dieses Passwort in Verbindung mit dem Standardadministratorkonto (admin).

Loki-Datenquellendefinition in Grafana

Stellen Sie zunächst sicher, dass die Loki-Datenquelle (Konfiguration/Datenquelle) erstellt ist.
Hier ist ein Beispiel:

Loki – Protokolle sammeln mit dem Prometheus-Ansatz
Ein Beispiel für die Einrichtung einer Datenquelle für Loki

Durch Klicken auf „Testen“ können Sie die Verbindung mit Loki testen.

Bitten an Loki richten

Gehen Sie nun zu Grafana und gehen Sie zum Abschnitt „Erkunden“. Beim Empfang von Protokollen aus Containern fügt Loki Metadaten von Kubernetes hinzu. Dadurch wird es möglich, die Protokolle eines bestimmten Containers anzuzeigen.

Um beispielsweise Promtail-Containerprotokolle auszuwählen, können Sie die folgende Abfrage verwenden: {container_name = "promtail"}.
Vergessen Sie nicht, auch hier die Loki-Datenquelle auszuwählen.

Diese Abfrage gibt die Containeraktivität wie folgt zurück:

Loki – Protokolle sammeln mit dem Prometheus-Ansatz
Abfrageergebnis in Grafana

Zum Dashboard hinzufügen

Ab Grafana 6.4 ist es möglich, Protokollinformationen direkt auf dem Dashboard abzulegen. Danach kann der Benutzer schnell zwischen der Anzahl der Anfragen auf seiner Website und den Anwendungsverfolgungen wechseln.

Nachfolgend finden Sie ein Beispiel-Dashboard, das diese Interaktion implementiert:

Loki – Protokolle sammeln mit dem Prometheus-Ansatz
Beispiel-Dashboard mit Prometheus-Metriken und Loki-Protokollen

Die Zukunft von Loki

Ich habe im Mai/Juni mit der Version 0.1 angefangen, Loki zu verwenden. Version 1 wurde heute bereits veröffentlicht, außerdem 1.1 und 1.2.

Man muss zugeben, dass Version 0.1 nicht stabil genug war. Aber bereits 0.3 zeigte echte Reifezeichen und die nächsten Versionen (0.4, dann 1.0) verstärkten diesen Eindruck nur noch.

Nach 1.0.0 kann sich niemand mehr entschuldigen, dieses wunderbare Tool nicht zu verwenden.

Bei weiteren Verbesserungen sollte es nicht um Loki gehen, sondern vielmehr um seine Integration mit dem hervorragenden Grafana. Tatsächlich verfügt Grafana 6.4 bereits über eine gute Integration mit Dashboards.

Das kürzlich veröffentlichte Grafana 6.5 verbessert diese Integration weiter, indem es den Inhalt von Protokollen im JSON-Format automatisch erkennt.

Das folgende Video zeigt ein kleines Beispiel für diesen Mechanismus:

Loki – Protokolle sammeln mit dem Prometheus-Ansatz
Verwendung von in Grafana gerenderten Loki-Strings

Es wird möglich, eines der JSON-Felder beispielsweise für Folgendes zu verwenden:

  • Links zu einem externen Tool
  • Protokollinhaltsfilterung

Sie können beispielsweise auf „traceId“ klicken, um zu Zipkin oder Jaeger zu gelangen.

Wie immer freuen wir uns über Ihre Kommentare und laden Sie herzlich dazu ein offenes Webinar, wo wir darüber sprechen werden, wie sich die DevOps-Branche im Jahr 2019 entwickelt hat und mögliche Entwicklungspfade für 2020 diskutieren.

Source: habr.com