Loki - logindsamling ved hjælp af Prometheus-tilgangen

Hej, Habr-folk! I takt med at vi nærmer os starten af en ny batch af kurset „DevOps praksis og værktøjer“ har vi forberedt en oversættelse af et interessant materiale til jer.

Denne artikel er en kort introduktion til Loki. Projektet Loki støttes af Grafana og er rettet mod centraliseret logindsamling (fra servere eller containere).

Den primære inspirationskilde til Loki var Prometheus idéen om at anvende dens tilgange til logstyring:

  • bruge labels til at gemme data
  • forbruge et lille antal ressourcer

Vi vil vende tilbage til principperne bag Prometheus og give nogle eksempler på dens anvendelse i konteksten af Kubernetes.

Et par ord om Prometheus

For helt at forstå, hvordan Loki fungerer, er det vigtigt at tage et skridt tilbage og mindes Prometheus lidt.

En af de karakteristiske egenskaber ved Prometheus er udtrækning af metrics fra indsamlingpunkter (via eksportører) og opbevaring af dem i TSDB (Time Series Data Base) med tilføjelse af metadata i form af labels.

Hvorfor er det nødvendigt

For nylig er Prometheus blevet de facto standarden i container- og Kubernetes-verdenen: installationen er meget enkel, og der findes fra starten et endpoint for Prometheus i Kubernetes-klynger. Prometheus kan også udtrække metrics fra applikationer, der er implementeret i containere, mens bestemte labels opretholdes. Derfor er overvågning af applikationer meget nemt at implementere.

Desværre er der stadig ingen "one-stop" løsning til logstyring, så du må finde en løsning til dig selv:

  • en administreret cloud-tjeneste til centralisering af logs (AWS, Azure eller Google)
  • monitoreringstjeneste "monitoring as a service" (f.eks. Datadog)
  • oprettelse af din egen logindsamlingstjeneste.

For den tredje mulighed har jeg traditionelt brugt Elasticsearch, selvom jeg ikke altid har været tilfreds med det (især dens tunghed og kompleksitet i opsætningen).

Loki blev designet med henblik på at forenkle implementeringen i overensstemmelse med følgende principper:

  • være enkel at starte
  • forbruge få ressourcer
  • arbejde selvstændigt uden nogen særlig vedligeholdelse
  • fungere som et supplement til Prometheus for at hjælpe med fejlfindingsprocessen.

Denne enkelhed opnås dog på bekostning af nogle kompromiser. En af disse er, at indholdet ikke bliver indekseret. Derfor er søgningen i teksten ikke særlig effektiv eller informativ og tillader ikke statistik over tekstindholdet. Men da Loki ønsker at fungere som en ækvivalent til grep og som et supplement til Prometheus, er det ikke en ulempe.

Hændelsesanalyse

For bedre at forstå, hvorfor Loki ikke har brug for indeksering, lad os gå tilbage til metoden til hændelsesanalyse, som udviklerne af Loki anvendte:

Loki - logindsamling ved hjælp af Prometheus-tilgangen
1 Alarm → 2 Dashboard → 3 Adhoc Forespørgsel → 4 Log Aggregation → 5 Distribueret Sporing → 6 Løsning!
(1 Alarm → 2 Dashboard → 3 Adhoc Forespørgsel → 4 Log Aggregation → 5 Distribueret Sporing → 6 Løsning!)

Ideen er, at vi modtager en alarm (Slack Underretning, SMS osv.) og derefter:

  • ser på Grafana dashboards
  • ser på service-metrikker (for eksempel i Prometheus)
  • ser på logoptagelser (for eksempel i Elasticsearch)
  • måske tager et kig på distribuerede spor (Jaeger, Zipkin osv.)
  • og til sidst løser den oprindelige problem.

Her, i tilfælde af stakken Grafana + Prometheus + Elasticsearch + Zipkin, skal vi bruge fire forskellige værktøjer. For at forkorte tiden ville det være godt at have mulighed for at udføre alle disse trin med ét værktøj: Grafana. Det skal bemærkes, at denne tilgang til undersøgelse blev implementeret i Grafana fra version 6. Dermed bliver det muligt at tilgå data fra Prometheus direkte fra Grafana.

Loki - logindsamling ved hjælp af Prometheus-tilgangen
Explorer-skærmen er opdelt mellem Prometheus og Loki

På denne skærm kan man se logs i Loki, der er relateret til Prometheus-metrikker, ved hjælp af konceptet med delt skærm. Fra version 6.5 tillader Grafana behandling af trace ID i Loki-logoptagelser, så man kan linke til sine foretrukne værktøjer til distribueret sporing (Jaeger).

Lokal test af Loki

Den nemmeste måde at teste Loki lokalt på er at bruge docker-compose. Docker-compose-filen findes i Loki-repositoriet. Du kan få repositoriet med følgende kommando git:

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

Derefter skal du navigere til produktionskataloget:

$ cd production

Derefter kan du hente den nyeste version af Docker-billederne:

$ docker-compose pull

Endelig startes Loki-stakken med følgende kommando:

$ docker-compose up

Loki-arkitektur

Her er et lille diagram med arkitekturen for Loki:

Loki - logindsamling ved hjælp af Prometheus-tilgangen
Arkitekturprincipper for Loki

Webklienten kører applikationer på serveren, Promtail indsamler logs og sender dem til Loki, webklienten sender også metadata til Loki. Loki aggregerer det hele og sender det til Grafana.
Loki er startet. For at se de tilgængelige komponenter skal du udføre følgende kommando:

$ docker ps

I tilfælde af en nyinstallation af Docker skal kommandoen returnere følgende resultat:

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

Vi ser følgende komponenter:

  • Promtail: agenten ansvarlig for centralisering af logs
  • Grafana: et kendt værktøj til dashboards
  • Loki: dæmon til centralisering af data

I en klassisk infrastruktur (f.eks. baseret på virtuelle maskiner) skal der være en Promtail-agent installeret på hver maskine. Grafana og Loki kan installeres på én maskine.

Udrulning i Kubernetes

Installation af Loki-komponenter i Kubernetes vil indebære følgende:

  • daemonSet til udrulning af Promtail-agenten på hver af maskinerne i klyngen af servere
  • udrulning (Deployment) af Loki
  • og til sidst - udrulning af Grafana.

Heldigvis er Loki tilgængelig som en Helm-pakke, hvilket gør udrulningen lettere.

Installation via Helm

Helm skal allerede være installeret på din maskine. Det kan downloades fra projektets GitHub-repository. Det installeres ved at udpakke arkivet, der svarer til din arkitektur, og tilføje helm til $PATH.

Bemærk: version 3.0.0 af Helm blev for nylig udgivet. Da der er mange ændringer i denne version, anbefales det, at læseren venter lidt, før den begynder at bruge den.

Tilføjelse af kilde til Helm

Det første skridt vil være at tilføje 'loki' repository ved hjælp af følgende kommando:

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

Herefter kan du søge efter pakker med navnet 'loki':

$ helm search loki

Resultat:

loki/loki       0.17.2 v0.4.0 Loki: ligesom Prometheus, men for logs.
loki/loki-stack 0.19.1 v0.4.0 Loki: ligesom Prometheus, men for logs.
loki/fluent-bit 0.0.2  v0.0.1 Bruger fluent-bit Loki go plugin til...
loki/promtail   0.13.1 v0.4.0 Ansvarlig for indsamling af logs og...

Disse pakker har følgende funktioner:

  • pakke loki/loki tilsvarer kun Loki-serveren
  • pakke loki/fluent-bit giver dig mulighed for at udrulle DaemonSet ved hjælp af fluent-bit til at indsamle logs i stedet for Promtail
  • pakke loki/promtail indeholder agenten til indsamling af logfiler
  • pakke loki/loki-stack, giver dig mulighed for at udrulle Loki sammen med Promtail.

Installation af Loki

For at udrulle Loki i Kubernetes, udfør følgende kommando i namespaces 'monitoring':

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

For saving to disk, add the parameter --set loki.persistence.enabled = true:

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

Bemærk: If you want to deploy Grafana simultaneously, add the parameter --set grafana.enabled = true

When you run this command, you should get the following output:

SIDSTE UDSENDING: Ti Nov 19 15:56:54 2019
NAVNEOMRÅDE: overvågning
STATUS: UDSENDT
RESSOURCER:
==> v1/ClusterRole
NAVN ALDER
loki-promtail-clusterrole 189d
…
BEMÆRKNINGER:
Loki-stakken er blevet sendt til din klynge. Loki kan nu tilføjes som en datakilde i Grafana.
Se <a href="http://docs.grafana.org/features/datasources/loki/">http://docs.grafana.org/features/datasources/loki/</a> for flere detaljer.

Looking at the status of the pods in the "monitoring" namespace, we can see that everything is deployed:

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

Resultat:

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

All pods are running. Now it's time to do some tests!

Connecting to Grafana

To connect to Grafana under Kubernetes, you need to establish a tunnel to its pod. Below is the command to open port 3000 for the Grafana pod:

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

Another important point is the need to retrieve the Grafana administrator password. The password is stored in the secret loki-grafana i feltet .data.admin-user in base64 format.

To recover it, you need to execute the following command:

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

Use this password together with the default admin account (admin).

Defining the Loki data source in Grafana

First, make sure that the Loki data source is created (Configuration / Datasource).
Here is an example:

Loki - logindsamling ved hjælp af Prometheus-tilgangen
Example configuration of the data source for Loki

By clicking on "Test", you can check the connection to Loki.

Making queries to Loki

Now go to Grafana under the "Explore" section. When receiving logs from containers, Loki adds metadata from Kubernetes. This way, you can view the logs of a specific container.

For example, to select logs from the promtail container, you can use the following query: {container_name = "promtail"}.
Also, do not forget to select the Loki data source.

This query will return the activity of containers in the following format:

Loki - logindsamling ved hjælp af Prometheus-tilgangen
Query result in Grafana

Adding to the dashboard

Starting from Grafana 6.4, you can place log information directly on the dashboard. After this, the user can quickly switch between the number of requests on their site and application traces.

Below is an example of a dashboard that implements this interaction:

Loki - logindsamling ved hjælp af Prometheus-tilgangen
Eksempel på dashboard med Prometheus-metrics og Loki-logs

Fremtiden for Loki

Jeg begyndte at bruge Loki tilbage i maj/juni med version 0.1. I dag er version 1, og endda 1.1 og 1.2, allerede udgivet.

Det må indrømmes, at version 0.1 ikke var særlig stabil. Men 0.3 viste allerede reelle tegn på modenhed, og efterfølgende versioner (0.4, så 1.0) har kun forstærket dette indtryk.

Efter 1.0.0 kan ingen længere have en undskyldning for ikke at bruge dette fantastiske værktøj.

Yderligere forbedringer bør ikke handle om Loki, men snarere om dens integration med fremragende Grafana. Faktisk er der allerede en god integration med dashboards i Grafana 6.4.

Grafana 6.5, der for nylig blev udgivet, forbedrer denne integration endnu mere ved automatisk at genkende indholdet af logs i JSON-format.

Nedenfor i videoen kan du se et lille eksempel på denne mekanisme:

Loki - logindsamling ved hjælp af Prometheus-tilgangen
Brug af Loki-strenge vist i Grafana

Det bliver muligt at bruge et af JSON-felterne til eksempelvis:

  • link til et eksternt værktøj
  • filtrering af logindhold

For eksempel kan du klikke på traceId for at gå til Zipkin eller Jaeger.

Traditionelt venter vi på dine kommentarer og inviterer til det åbne webinar, hvor vi taler om, hvordan DevOps-industrien har udviklet sig i løbet af 2019 og diskuterer mulige udviklingsveje for 2020.

Kilde: habr.com

Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere 🔥 Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere | ProHoster