Hej, Habr-folk! I takt med at vi nærmer os starten af en ny batch af kurset har vi forberedt en oversættelse af et interessant materiale til jer.
Denne artikel er en kort introduktion til Loki. Projektet Loki og er rettet mod centraliseret logindsamling (fra servere eller containere).
Den primære inspirationskilde til Loki var 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:

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.

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.gitDerefter skal du navigere til produktionskataloget:
$ cd productionDerefter kan du hente den nyeste version af Docker-billederne:
$ docker-compose pullEndelig startes Loki-stakken med følgende kommando:
$ docker-compose upLoki-arkitektur
Her er et lille diagram med arkitekturen for Loki:

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 psI 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_1Vi 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/chartsHerefter kan du søge efter pakker med navnet 'loki':
$ helm search lokiResultat:
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 monitoringFor saving to disk, add the parameter --set loki.persistence.enabled = true:
$ helm upgrade --install loki loki/loki-stack
--namespace monitoring
--set loki.persistence.enabled=trueBemæ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=lokiResultat:
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 24mAll 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:80Another 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}}'; echoUse 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:

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:

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:

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:

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 , hvor vi taler om, hvordan DevOps-industrien har udviklet sig i løbet af 2019 og diskuterer mulige udviklingsveje for 2020.
Kilde: habr.com
