Gruß, Chabrowiten! In Erwartung des Beginns einer neuen Einschreibung für den Kurs
Dieser Artikel ist eine kurze Einführung in Loki. Projekt Loki
Die Hauptinspiration für Loki war
- 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:
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.
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-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:
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:
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:
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:
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
Source: habr.com