Loki - Sammeln von Protokollen nach dem Prometheus-Ansatz

Gruß, Chabrowiten! Im Vorgriff auf den Start eines neuen Sets für den DevOps Practices and Tools- Kurs haben wir für Sie eine Übersetzung von interessantem Material vorbereitet.





Dieser Artikel ist eine kurze Einführung in Loki. Das Loki-Projekt wird von Grafana unterstützt und zielt darauf ab, Protokolle (von Servern oder Containern) zentral zu sammeln.

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

  • Verwendung von Etiketten (Etiketten) zur Datenspeicherung
  • 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 zu verstehen, wie Loki funktioniert, ist es wichtig, einen Schritt zurückzutreten und sich ein wenig an Prometheus zu erinnern.

Eines der charakteristischen Merkmale von Prometheus ist die Extraktion von Metriken aus Sammelstellen (über Exporteure) und deren Speicherung in der TSDB (Zeitreihendatenbank, Zeitreihendatenbank) unter Hinzufügung von Metadaten in Form von Beschriftungen.

Warum ist es notwendig?


In letzter Zeit ist Prometheus zum De-facto-Standard in der Welt der Container und Kubernetes geworden: Die Installation ist sehr einfach, und der Kubernetes-Cluster verfügt zunächst über einen Endpunkt für Prometheus. Prometheus kann auch Metriken aus Anwendungen abrufen, die in einem Container bereitgestellt werden, wobei bestimmte Tags beibehalten werden. Daher ist die Überwachung von Anwendungen sehr einfach zu implementieren.

Leider gibt es immer noch keine schlüsselfertige Lösung für die Verwaltung von Protokollen, und Sie müssen eine Lösung für sich selbst finden:

  • verwalteter Cloud-Dienst zur Zentralisierung von Protokollen (AWS, Azure oder Google)
  • Überwachung als Dienstüberwachungsdienst (z. B. Datadog)
  • Erstellen eines eigenen Protokollsammlungsdienstes.

Bei der dritten Option habe ich traditionell Elasticsearch verwendet, obwohl ich nicht immer damit zufrieden war (insbesondere mit der Schwere und Komplexität der Einstellungen).

Loki wurde entwickelt, um die Implementierung gemäß den folgenden Prinzipien zu vereinfachen:

  • Seien Sie einfach, um loszulegen
  • verbrauchen wenige Ressourcen
  • Arbeiten Sie unabhängig und ohne besondere Wartung
  • Ergänzen Sie Prometheus, um Fehler zu untersuchen

Diese Einfachheit wird jedoch durch einige Kompromisse erreicht. Eine davon ist, Inhalte nicht zu indizieren. Daher ist die Textsuche nicht sehr effektiv oder umfangreich und erlaubt keine Statistiken über den Inhalt des Textes. Aber da Loki das Äquivalent von grep sein und den Prometheus ergänzen möchte, ist dies kein Fehler.

Vorfalluntersuchung


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 Korrektur!
(1 Warnung → 2 Dashboards → 3 Ad-hoc-Abfrage → 4 Protokollaggregation → 5 verteilte Ablaufverfolgung → 6 Korrektur!)


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

  • Grafana
  • (, Prometheus)
  • (, Elasticsearch)
  • , (Jaeger, Zipkin .)
  • , , .

Hier müssen Sie im Fall des Stapels Grafana + Prometheus + Elasticsearch + Zipkin vier verschiedene Werkzeuge verwenden. Um die Zeit zu verkürzen, wäre es schön, alle diese Schritte mit einem Werkzeug ausführen zu können: Grafana. Es ist erwähnenswert, dass dieser Forschungsansatz seit Version 6 in Grafana implementiert ist. Auf diese Weise kann direkt von Grafana aus auf Prometheus-Daten zugegriffen werden.


Aufgeteilter Explorer-Bildschirm zwischen Prometheus und Loki

Auf diesem Bildschirm können Sie Loki-Protokolle anzeigen, die sich auf Prometheus-Metriken beziehen, indem Sie das Split-Screen-Konzept verwenden. Ab Version 6.5 können Sie mit Grafana die Trace-ID in den Loki-Protokolleinträgen verarbeiten, um den Links zu Ihren bevorzugten verteilten Tracking-Tools (Jaeger) zu folgen.

Loki Lokaler 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


Dann müssen Sie in das Produktionsverzeichnis gehen:

$ cd production

Danach können Sie die neueste Version der Docker-Images herunterladen:

$ docker-compose pull

Schließlich wird der Loki-Stack mit dem folgenden Befehl gestartet:

$ docker-compose up

Loki Architektur


Hier ist ein kleines Diagramm mit der Loki-Architektur:


Prinzipien der Loki-Architektur Der

Web-Client startet Anwendungen auf dem Server, Promtail sammelt Protokolle und sendet sie an Loki, der Web-Client sendet auch Metadaten an Loki. Loki aggregiert alles und überträgt es an Grafana.
Loki ist am Laufen. Führen Sie den folgenden Befehl aus, um die verfügbaren Komponenten anzuzeigen:

$ docker ps


Bei einem frisch installierten Docker sollte der Befehl das folgende 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 die folgenden Komponenten:

  • Promtail: Agent zum Zentralisieren von Protokollen
  • Grafana: Ein berühmtes Dashboard-Tool
  • Loki: ein Datenzentralisierungs-Daemon

Im Rahmen einer klassischen Infrastruktur (z. B. basierend auf virtuellen Maschinen) muss auf jeder Maschine ein Promtail-Agent bereitgestellt werden. Grafana und Loki können auf demselben Computer installiert werden.

Kubernetes-Bereitstellung


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

  • daemonSet zum Bereitstellen des Promtail-Agenten auf jedem Computer in einem Servercluster
  • Bereitstellung Loki
  • und schließlich der Einsatz von Grafana.

Glücklicherweise ist Loki als Helm-Paket erhältlich, was die Bereitstellung vereinfacht.

Installation über Helm


Helm sollte bereits installiert sein. Es kann aus dem GitHub-Repository des Projekts heruntergeladen werden. Die Installation erfolgt durch Entpacken des Archivs, das Ihrer Architektur entspricht, und Hinzufügen eines Helms $PATH.

Hinweis: Helm Version 3.0.0 wurde kürzlich veröffentlicht. Da es viele Änderungen gab, wird dem Leser empfohlen, ein wenig zu warten, bevor er es zuerst verwendet .


Hinzufügen einer Quelle für Helm


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

$ helm add loki https://grafana.imtqy.com/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 haben die folgenden Funktionen:

  • Das loki / loki- Paket entspricht nur dem Loki-Server
  • Mit dem loki / fluent -bit- Paket können Sie DaemonSet mithilfe von fluent-bin bereitstellen, um Protokolle anstelle von Promtail zu sammeln
  • Das Paket loki / promtail enthält eine Protokolldatei für den Sammlungsagenten
  • Mit dem loki / loki-stack- Paket können Sie Loki sofort zusammen mit Promtail bereitstellen.

Loki Installation


Führen Sie den folgenden Befehl im Namespace "Überwachung" aus, um Loki für Kubernetes bereitzustellen:

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

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

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

Hinweis: Wenn Sie Grafana gleichzeitig 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 Herde im Namespace "Überwachung" ansehen, werden wir feststellen, dass alles erweitert 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 Zeit, einige Tests durchzuführen!

Stellen Sie eine Verbindung zu Grafana her


Um unter Kubernetes eine Verbindung zu Grafana herzustellen, müssen Sie einen Tunnel nach unten öffnen. Das Folgende ist der Befehl zum Öffnen von Port 3000 für den Grafana-Herd:

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

Ein weiterer wichtiger Punkt ist die Notwendigkeit, das Grafana-Administratorkennwort wiederherzustellen. Das Passwort wird loki-grafanain einem Feld .data.admin-userim Base64-Format geheim gehalten .

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 Kennwort mit dem Standardadministratorkonto (admin).

Definieren einer Loki-Datenquelle in Grafana


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


Beispiel für das Einrichten einer Datenquelle für Loki

Durch Klicken auf „Test“ können Sie die Verbindung mit Loki überprüfen.

Anfragen an Loki


Gehen Sie nun zu Grafanas Abschnitt "Erkunden". Beim Empfang von Protokollen aus Containern fügt Loki Metadaten von Kubernetes hinzu. Auf diese Weise können die Protokolle eines bestimmten Containers angezeigt werden.

: Zum Beispiel wird das folgende Abfrage-Promtail verwendet, um die Containerprotokolle auszuwählen {container_name = "promtail"}.
Stellen Sie außerdem sicher, dass Sie hier Ihre Loki-Datenquelle auswählen.

Diese Anforderung gibt die Aktivität der Container wie folgt zurück:


Das Ergebnis der Anforderung in Grafana

Hinzufügen zum Dashboard


Ab Grafana 6.4 können Sie Informationen zu den Protokollen direkt in das Dashboard einfügen. Danach kann der Benutzer schnell zwischen der Anzahl der Anforderungen auf seiner Site und den Anwendungsspuren wechseln.

Das folgende Beispiel zeigt ein Dashboard, das diese Interaktion implementiert: Ein


Beispiel für ein Dashboard mit Prometheus-Metriken und Loki-Protokollen

Zukünftige Loki


Ich habe im Mai / Juni mit Version 0.1 angefangen, Loki zu verwenden. Heute ist bereits Version 1 veröffentlicht, sogar 1.1 und 1.2.

Zugegebenermaßen war Version 0.1 nicht stabil genug. Aber 0,3 zeigte bereits echte Anzeichen von Reife, und die nächsten Versionen (0,4, dann 1,0) verstärkten diesen Eindruck nur.

Nach 1.0.0 kann niemand mehr Ausreden haben, dieses wunderbare Tool nicht zu benutzen.

Weitere Verbesserungen sollten nicht Loki betreffen, sondern dessen Integration mit dem hervorragenden Grafana. Grafana 6.4 lässt sich bereits gut in Dashboards integrieren.

Grafana 6.5, das kürzlich veröffentlicht wurde, verbessert diese Integration weiter, indem der Inhalt von Protokollen im JSON-Format automatisch erkannt wird.

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


Verwenden von in Grafana angezeigten Loki-Zeichenfolgen

Es wird möglich, eines der JSON-Felder zu verwenden, z.

  • externe Tool-Links
  • Filtern von Protokollinhalten

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

Traditionell warten wir auf Ihre Kommentare und laden Sie zu einem offenen Webinar ein , in dem wir über die Entwicklung der DevOps-Branche im Jahr 2019 sprechen und mögliche Entwicklungspfade für 2020 erörtern.

Source: https://habr.com/ru/post/undefined/


All Articles