Loki - logboekverzameling met behulp van de Prometheus-aanpak

Groet, inwoners van Khabrovsk! Aan de vooravond van de start van een nieuwe inschrijving voor de opleiding "DevOps-praktijken en tools" Wij hebben een vertaling van interessant materiaal voor u voorbereid.

Dit artikel is een korte introductie tot Loki. Project Loki ondersteund door Grafana en is gericht op het gecentraliseerd verzamelen van logs (van servers of containers).

De belangrijkste inspiratiebron voor Loki was Prometheus met het idee om zijn benaderingen van logbeheer toe te passen:

  • labels gebruiken om gegevens op te slaan
  • verbruik van weinig hulpbronnen

We komen terug op hoe Prometheus werkt en geven enkele voorbeelden van het gebruik ervan in de context van Kubernetes.

Een paar woorden over Prometheus

Om volledig te begrijpen hoe Loki werkt, is het belangrijk om een ​​stap terug te doen en iets over Prometheus te onthouden.

Een van de onderscheidende kenmerken van Prometheus is het extraheren van statistieken uit verzamelpunten (via exporteurs) en het opslaan ervan in TSDB (Time Series Data Base), met toevoeging van metadata in de vorm van labels.

Waarom heb je het nodig?

Onlangs is Prometheus de de facto standaard geworden in de wereld van containers en Kubernetes: de installatie ervan is heel eenvoudig en het Kubernetes-cluster wordt geleverd met een native eindpunt voor Prometheus. Prometheus kan ook statistieken extraheren uit applicaties die in een container zijn geïmplementeerd, terwijl specifieke labels worden opgeslagen. Daarom is applicatiemonitoring zeer eenvoudig te implementeren.

Helaas is er nog steeds geen kant-en-klare oplossing voor logbeheer en moet u zelf een oplossing vinden:

  • beheerde cloudservice voor het centraliseren van logs (AWS, Azure of Google)
  • monitoringdienst “monitoring as a service” (bijvoorbeeld Datadog)
  • het creëren van uw eigen logverzamelingsservice.

Voor de derde optie gebruikte ik traditioneel Elasticsearch, ondanks het feit dat ik er niet altijd blij mee was (vooral de zwaarte en complexiteit van de configuratie).

Loki is ontworpen om de implementatie te vereenvoudigen volgens de volgende principes:

  • wees eenvoudig om te beginnen
  • verbruiken weinig grondstoffen
  • zelfstandig werken zonder speciaal onderhoud
  • dienen als aanvulling op Prometheus om te helpen bij bugonderzoek

Deze eenvoud gaat echter ten koste van enkele compromissen. Eén daarvan is het niet indexeren van de inhoud. Daarom is het zoeken naar tekst niet erg efficiënt of rijk en zijn er geen statistieken over de inhoud van de tekst mogelijk. Maar aangezien Loki het equivalent van grep en een aanvulling op Prometheus wil zijn, is dit geen nadeel.

Incidentenonderzoek

Om beter te begrijpen waarom Loki geen indexering nodig heeft, gaan we terug naar de incidentonderzoeksmethode die de Loki-ontwikkelaars gebruikten:

Loki - logboekverzameling met behulp van de Prometheus-aanpak
1 Waarschuwing → 2 Dashboard → 3 Ad-hocquery → 4 Logboekaggregatie → 5 Gedistribueerde tracering → 6 Fix!
(1 Waarschuwing → 2 Dashboard → 3 Adhoc-query → 4 Logboekaggregatie → 5 Gedistribueerde tracering → 6 Repareren!)

Het idee is dat we een soort waarschuwing ontvangen (Slack Notification, SMS, etc.) en daarna:

  • kijk naar Grafana-dashboards
  • kijk naar servicestatistieken (bijvoorbeeld in Prometheus)
  • bekijk loggegevens (bijvoorbeeld in Elasticsearch)
  • misschien eens kijken naar gedistribueerde sporen (Jaeger, Zipkin, etc.)
  • en uiteindelijk het oorspronkelijke probleem oplossen.

Hier moet je, in het geval van de stapel Grafana + Prometheus + Elasticsearch + Zipkin, vier verschillende tools gebruiken. Om tijd te besparen zou het fijn zijn om al deze stappen met één tool uit te kunnen voeren: Grafana. Het is vermeldenswaard dat deze benadering van onderzoek sinds versie 6 in Grafana is geïmplementeerd. Het wordt dus mogelijk om rechtstreeks vanuit Grafana toegang te krijgen tot Prometheus-gegevens.

Loki - logboekverzameling met behulp van de Prometheus-aanpak
Explorer-scherm verdeeld tussen Prometheus en Loki

Vanuit dit scherm kunt u Loki-logboeken bekijken die verband houden met Prometheus-statistieken met behulp van het gesplitste schermconcept. Sinds versie 6.5 kunt u met Grafana de trace-ID in Loki-logboekvermeldingen parseren om links naar uw favoriete gedistribueerde traceringstools (Jaeger) te volgen.

Lokale Loki-test

De eenvoudigste manier om Loki lokaal te testen is door docker-compose te gebruiken. Het docker-compose-bestand bevindt zich in de Loki-repository. U kunt de repository verkrijgen met behulp van de volgende opdracht git:

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

Vervolgens moet je naar de productiemap gaan:

$ cd production

Hierna kunt u de nieuwste versie van Docker-images verkrijgen:

$ docker-compose pull

Ten slotte wordt de Loki-stack gestart met het volgende commando:

$ docker-compose up

Loki-architectuur

Hier is een klein diagram met de Loki-architectuur:

Loki - logboekverzameling met behulp van de Prometheus-aanpak
Loki-architectuurprincipes

De webclient draait applicaties op de server, Promtail verzamelt logs en stuurt deze naar Loki, de webclient stuurt ook metadata naar Loki. Loki verzamelt alles en verzendt het naar Grafana.
Loki wordt gelanceerd. Voer de volgende opdracht uit om de beschikbare componenten te bekijken:

$ docker ps

In het geval van een vers geïnstalleerde Docker zou de opdracht het volgende resultaat moeten opleveren:

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

We zien de volgende componenten:

  • Promtail: agent verantwoordelijk voor het centraliseren van logs
  • Grafana: een beroemde dashboardtool
  • Loki: Daemon voor gegevenscentralisatie

Als onderdeel van een klassieke infrastructuur (bijvoorbeeld gebaseerd op virtuele machines) moet de Promtail-agent op elke machine worden ingezet. Grafana en Loki kunnen op dezelfde machine worden geïnstalleerd.

Implementatie naar Kubernetes

Het installeren van Loki-componenten op Kubernetes gaat als volgt:

  • daemonSet voor het implementeren van de Promtail-agent op elk van de machines in het servercluster
  • Implementatie Loki
  • en de laatste is de inzet van Grafana.

Gelukkig is Loki verkrijgbaar als Helm-pakket, waardoor het eenvoudig te implementeren is.

Installatie via Heml

Je zou Heml al geïnstalleerd moeten hebben. Het kan worden gedownload vanuit de GitHub-repository van het project. Het wordt geïnstalleerd door het archief dat overeenkomt met uw architectuur uit te pakken en er helm aan toe te voegen $PATH.

Opmerking: versie 3.0.0 van Helm is onlangs uitgebracht. Omdat er veel wijzigingen in zijn aangebracht, wordt de lezer geadviseerd even te wachten voordat hij deze gebruikt..

Een bron voor Helm toevoegen

De eerste stap is het toevoegen van de “loki” repository met behulp van de volgende opdracht:

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

Hierna kunt u zoeken naar pakketten met de naam “loki”:

$ helm search loki

Resultaat:

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...

Deze pakketten hebben de volgende kenmerken:

  • verpakking Loki/loki komt alleen overeen met de Loki-server
  • verpakking loki / vloeiend-bit Hiermee kunt u een DaemonSet implementeren met behulp van fluent-bin om logboeken te verzamelen in plaats van Promtail
  • verpakking loki/promtail bevat een verzamelagent voor logbestanden
  • verpakking loki/loki-stack, kunt u Loki onmiddellijk samen met Promtail inzetten.

Loki installeren

Om Loki in Kubernetes te implementeren, voert u de volgende opdracht uit in de naamruimte “monitoring”:

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

Voeg de parameter toe om op schijf op te slaan --set loki.persistence.enabled = true:

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

Opmerking: als u Grafana tegelijkertijd wilt implementeren, voegt u de parameter toe --set grafana.enabled = true

Wanneer u deze opdracht uitvoert, zou u de volgende uitvoer moeten krijgen:

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.

Als we naar de status van de pods in de naamruimte ‘monitoring’ kijken, kunnen we zien dat alles is geïmplementeerd:

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

Resultaat:

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 zijn actief. Nu is het tijd om wat tests te doen!

Verbinding maken met Grafana

Om verbinding te maken met Grafana onder Kubernetes, moet je een tunnel naar de pod openen. Hieronder vindt u de opdracht om poort 3000 te openen voor de Grafana-pod:

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

Een ander belangrijk punt is de noodzaak om het Grafana-beheerderswachtwoord te herstellen. Het wachtwoord wordt geheim gehouden loki-grafana in het veld .data.admin-user in base64-formaat.

Om het te herstellen, moet u de volgende opdracht uitvoeren:

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

Gebruik dit wachtwoord in combinatie met het standaard beheerdersaccount (admin).

Een Loki-gegevensbron definiëren in Grafana

Zorg er allereerst voor dat de Loki-gegevensbron is aangemaakt (Configuratie/Gegevensbron).
Hier is een voorbeeld:

Loki - logboekverzameling met behulp van de Prometheus-aanpak
Voorbeeld van het opzetten van een gegevensbron voor Loki

Door op “Test” te klikken, kunt u de verbinding met Loki controleren.

Verzoeken indienen bij Loki

Ga nu naar Grafana naar het gedeelte "Verkennen". Bij het ontvangen van logs van containers voegt Loki metadata van Kubernetes toe. Zo wordt het mogelijk om de logs van een specifieke container te bekijken.

Als u bijvoorbeeld de Promtail-containerlogboeken wilt selecteren, kunt u de volgende query gebruiken: {container_name = "promtail"}.
Vergeet ook niet om hier de Loki-gegevensbron te selecteren.

Deze query retourneert de containeractiviteit als volgt:

Loki - logboekverzameling met behulp van de Prometheus-aanpak
Queryresultaat in Grafana

Toevoegen aan dashboard

Vanaf Grafana 6.4 kunt u loginformatie rechtstreeks op het dashboard plaatsen. Hierna kan de gebruiker snel schakelen tussen het aantal verzoeken op zijn site en applicatiesporen.

Hieronder ziet u een voorbeeld van een dashboard dat deze interactie implementeert:

Loki - logboekverzameling met behulp van de Prometheus-aanpak
Voorbeelddashboard met Prometheus-statistieken en Loki-logboeken

Toekomst van Loki

Ik begon Loki in mei/juni te gebruiken met versie 0.1. Vandaag zijn versie 1, en zelfs 1.1 en 1.2 al uitgebracht.

Toegegeven moet worden dat versie 0.1 niet stabiel genoeg was. Maar 0.3 vertoonde al echte tekenen van volwassenheid, en daaropvolgende versies (0.4, daarna 1.0) versterkten deze indruk alleen maar.

Na 1.0.0 heeft niemand nog een excuus om deze prachtige tool niet te gebruiken.

Verdere verbeteringen zouden niet over Loki moeten gaan, maar eerder over de integratie ervan met de uitstekende Grafana. Grafana 6.4 heeft zelfs al een goede integratie met dashboards.

Grafana 6.5, die onlangs is uitgebracht, verbetert deze integratie verder door automatisch de loginhoud in JSON-formaat te herkennen.

De onderstaande video toont een klein voorbeeld van dit mechanisme:

Loki - logboekverzameling met behulp van de Prometheus-aanpak
Met behulp van Loki-strings weergegeven in Grafana

Het wordt mogelijk om één van de JSON-velden te gebruiken voor bijvoorbeeld:

  • links naar externe tool
  • loginhoud filteren

U kunt bijvoorbeeld op traceId klikken om naar Zipkin of Jaeger te gaan.

Zoals gewoonlijk kijken wij uit naar uw opmerkingen en nodigen wij u graag uit webinar openen, waar we zullen praten over hoe de DevOps-industrie zich in 2019 heeft ontwikkeld en mogelijke ontwikkelingspaden voor 2020 zullen bespreken.

Bron: www.habr.com