Loki - samla stockar med hjälp av Prometheus-metoden

Hälsning, Khabrovites! I väntan på start av ny anmälan till kursen "DevOps praxis och verktyg" förberett en översättning av intressant material åt dig.

Den här artikeln är en kort introduktion till Loki. Projekt Loke med stöd av Grafana och syftar till centraliserad insamling av loggar (från servrar eller behållare).

Den främsta inspirationen för Loke var Prometheus med tanken att tillämpa hans tillvägagångssätt för logghantering:

  • använda etiketter för att lagra data
  • låg resursförbrukning

Vi kommer att återkomma till principerna för Prometheus och ge några exempel på dess användning i samband med Kubernetes.

Några ord om Prometheus

För att helt förstå hur Loki fungerar är det viktigt att ta ett steg tillbaka och återbesöka Prometheus lite.

En av de utmärkande egenskaperna hos Prometheus är utvinning av mått från insamlingsställen (via exportörer) och lagring av dem i en TSDB (Time Series Data Base, tidsseriedatabas) med tillägg av metadata i form av etiketter.

Varför behöver du det

Nyligen har Prometheus blivit de facto-standarden i världen av containrar och Kubernetes: installationen är mycket enkel, och ett Kubernetes-kluster har initialt en slutpunkt för Prometheus. Prometheus kan också extrahera mätvärden från applikationer som distribueras i en container samtidigt som specifika etiketter bibehålls. Därför är applikationsövervakning mycket lätt att implementera.

Tyvärr finns det fortfarande ingen nyckelfärdig lösning för logghantering, och du måste hitta en lösning själv:

  • hanterad molntjänst för centralisering av loggar (AWS, Azure eller Google)
  • övervakningstjänst "övervakning som en tjänst" (till exempel Datadog)
  • skapa din egen logginsamlingstjänst.

För det tredje alternativet har jag traditionellt använt Elasticsearch, trots att jag inte alltid var nöjd med det (särskilt dess tyngd och komplexitet i installationen).

Loki designades för att vara lätt att implementera enligt följande principer:

  • vara lätt att starta
  • förbrukar få resurser
  • arbeta självständigt utan särskilt underhåll
  • fungera som ett tillägg till Prometheus för att hjälpa till med felundersökningar

Denna enkelhet kommer dock på bekostnad av vissa kompromisser. En av dem är att inte indexera innehållet. Därför är textsökning inte särskilt effektiv eller rik och låter dig inte föra statistik över innehållet i texten. Men eftersom Loki vill vara grep-motsvarigheten och komplementet till Prometheus är detta ingen nackdel.

Incidentutredning

För att bättre förstå varför Loki inte behöver indexera, låt oss gå tillbaka till incidentundersökningsmetoden som används av Loki-utvecklarna:

Loki - samla stockar med hjälp av Prometheus-metoden
1 Alert → 2 Dashboard → 3 Adhoc Query → 4 Log Aggregation → 5 Distributed Tracing → 6 Fix!
(1 Varning → 2 Dashboard → 3 Adhoc Query → 4 Log Aggregation → 5 Distributed Tracing → 6 Fix!)

Tanken är att vi får någon form av larm (Slack Notification, SMS, etc.) och efter det:

  • titta på Grafanas instrumentpaneler
  • titta på tjänstemått (till exempel i Prometheus)
  • titta på loggposter (till exempel i Elasticsearch)
  • kanske ta en titt på distribuerade spår (Jaeger, Zipkin, etc.)
  • och äntligen fixa det ursprungliga problemet.

Här, i fallet med Grafana + Prometheus + Elasticsearch + Zipkin-stacken, måste du använda fyra olika verktyg. För att spara tid skulle det vara trevligt att kunna göra alla dessa steg med ett verktyg: Grafana. Det är värt att notera att denna metod för forskning har implementerats i Grafana sedan version 6. Därmed blir det möjligt att komma åt Prometheus-data direkt från Grafana.

Loki - samla stockar med hjälp av Prometheus-metoden
Utforskarens skärm delad mellan Prometheus och Loki

Från den här skärmen kan du se loggar i Loki relaterade till Prometheus-mått med hjälp av konceptet med delad skärm. Sedan version 6.5 låter Grafana dig analysera spårnings-id:t i Loki-loggposter för att följa länkar till dina favoritdistribuerade spårningsverktyg (Jaeger).

Loki lokalt test

Det enklaste sättet att testa Loki lokalt är att använda docker-compose. Docker-compose-filen finns i Loki-förvaret. Du kan hämta förvaret med följande kommando git:

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

Sedan måste du byta till produktionskatalogen:

$ cd production

Efter det kan du få de senaste Docker-bilderna:

$ docker-compose pull

Slutligen startas Loki-stacken med följande kommando:

$ docker-compose up

Loki arkitektur

Här är ett litet diagram med Loki-arkitektur:

Loki - samla stockar med hjälp av Prometheus-metoden
Loki arkitekturprinciper

Webbklienten kör applikationer på servern, Promtail samlar in loggar och skickar dem till Loki, webbklienten skickar även metadata till Loki. Loke samlar allt och skickar det till Grafana.
Loke springer. För att se de tillgängliga komponenterna, kör följande kommando:

$ docker ps

I fallet med en nyinstallerad Docker bör kommandot returnera följande utdata:

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öljande komponenter:

  • Promtail: agent ansvarig för att centralisera loggar
  • Grafana: det berömda instrumentpanelsverktyget
  • Loki: datacentraliseringsdemon

Som en del av en klassisk infrastruktur (till exempel baserad på virtuella maskiner) måste Promtail-agenten distribueras på varje dator. Grafana och Loki kan installeras på samma maskin.

Distribution till Kubernetes

Att installera Loki-komponenter i Kubernetes kommer att vara som följer:

  • daemonSet för att distribuera Promtail-agenten på var och en av datorerna i serverklustret
  • Loki-utbyggnad
  • och den sista är utplaceringen av Grafana.

Lyckligtvis finns Loki tillgängligt som ett Helm-paket, vilket gör det enkelt att distribuera.

Installation via Heml

Du bör redan ha Heml installerat. Det kan laddas ner från projektets GitHub-förråd. Den installeras genom att extrahera arkivet som är lämpligt för din arkitektur och lägga till rodret $PATH.

Notera: version 3.0.0 av Helm släpptes nyligen. Eftersom det har skett många förändringar i den, rekommenderas läsaren att vänta lite innan du börjar använda den..

Lägger till källa för Helm

Det första steget är att lägga till "loki"-förvaret med följande kommando:

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

Efter det kan du söka efter paket med namnet "loki":

$ helm search loki

Resultat:

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

Dessa paket har följande funktioner:

  • paket loki/loki matchar bara Loki-servern
  • paket loki/flytande-bit låter dig distribuera DaemonSet med hjälp av fluent-bin för att samla in loggar istället för Promtail
  • paket loki/promtail innehåller en logginsamlingsagent
  • paket loki/loki-stack, låter dig omedelbart distribuera Loki tillsammans med Promtail.

Installerar Loki

För att distribuera Loki till Kubernetes, kör följande kommando i namnutrymmet "övervakning":

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

Lägg till alternativet för att spara på disk --set loki.persistence.enabled = true:

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

Notera: om du vill distribuera Grafana samtidigt, lägg till parametern --set grafana.enabled = true

När du kör det här kommandot bör du få följande utdata:

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.

När vi tittar på tillståndet för poddarna i namnutrymmet "övervakning" kan vi se att allt är utplacerat:

$ 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

Alla kapslar är igång. Nu är det dags att göra några tester!

Ansluter till Grafana

För att ansluta till Grafana under Kubernetes måste du öppna en tunnel till dess pod. Följande är kommandot för att öppna port 3000 för en Grafana-pod:

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

En annan viktig punkt är behovet av att återställa Grafanas administratörslösenord. Lösenordet hålls hemligt loki-grafana i fält .data.admin-user i base64-format.

För att återställa det måste du köra följande kommando:

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

Använd detta lösenord tillsammans med standardadministratörskontot (admin).

Loki datakälla definition i Grafana

Först och främst, se till att Loki-datakällan (konfiguration / datakälla) har skapats.
Här är ett exempel:

Loki - samla stockar med hjälp av Prometheus-metoden
Ett exempel på att sätta upp en datakälla för Loki

Genom att klicka på "Testa" kan du testa kopplingen med Loki.

Gör förfrågningar till Loke

Gå nu till Grafana och gå till avsnittet "Utforska". När Loki tar emot loggar från behållare lägger Loki till metadata från Kubernetes. Därmed blir det möjligt att se loggarna för en specifik behållare.

Till exempel, för att välja promtail containerloggar, kan du använda följande fråga: {container_name = "promtail"}.
Glöm inte att välja Loki-datakällan här också.

Den här frågan returnerar behållaraktivitet enligt följande:

Loki - samla stockar med hjälp av Prometheus-metoden
Frågeresultat i Grafana

Lägger till i instrumentpanelen

Från och med Grafana 6.4 är det möjligt att lägga logginformation direkt på instrumentpanelen. Därefter kommer användaren snabbt att kunna växla mellan antalet förfrågningar på sin webbplats till applikationsspårningar.

Nedan är ett exempel på en instrumentpanel som implementerar denna interaktion:

Loki - samla stockar med hjälp av Prometheus-metoden
Exempel på instrumentpanel med Prometheus-mått och Loki-loggar

Lokis framtid

Jag började använda Loki redan i maj/juni med version 0.1. Version 1 har redan släppts idag, och även 1.1 och 1.2.

Det måste erkännas att version 0.1 inte var tillräckligt stabil. Men 0.3 visade redan riktiga tecken på mognad, och nästa versioner (0.4, sedan 1.0) förstärkte bara detta intryck.

Efter 1.0.0 kan ingen ha en ursäkt att inte använda detta underbara verktyg.

Ytterligare förbättringar bör inte handla om Loki, utan snarare dess integration med den utmärkta Grafana. Faktum är att Grafana 6.4 redan har bra integration med instrumentpaneler.

Grafana 6.5, som släpptes nyligen, förbättrar denna integration ytterligare genom att automatiskt känna igen innehållet i loggar i JSON-format.

Videon nedan visar ett litet exempel på denna mekanism:

Loki - samla stockar med hjälp av Prometheus-metoden
Använder Loki-strängar renderade i Grafana

Det blir möjligt att använda ett av JSON-fälten, till exempel för att:

  • länkar till ett externt verktyg
  • logginnehållsfiltrering

Du kan till exempel klicka på traceId för att gå till Zipkin eller Jaeger.

Som vanligt ser vi fram emot dina kommentarer och bjuder in dig till öppet webbseminarium, där vi kommer att prata om hur DevOps-branschen har utvecklats under 2019 och diskutera möjliga utvecklingsvägar för 2020.

Källa: will.com