Loki - loggsamling med Prometheus-ansatsen

Hej, Habr-lÀsare! Inför starten av den nya kullen av kursen «DevOps metoder och verktyg» har vi förberett en översÀttning av intressant material.

Den hÀr artikeln Àr en kort introduktion till Loki. Projektet Loki stöds av Grafana och syftar till centraliserad insamling av loggar (frÄn servrar eller containrar).

Den huvudsakliga inspirationskÀllan för Loki var Prometheus idén att tillÀmpa dess logik för logghantering:

  • anvĂ€nda etiketter (labels) för att lagra data
  • konsumera lite resurser

Vi kommer att Äterkomma till hur Prometheus fungerar och ge nÄgra exempel pÄ dess anvÀndning i kontexten av Kubernetes.

NÄgra ord om Prometheus

För att fullt ut förstÄ hur Loki fungerar Àr det viktigt att ta ett steg tillbaka och tÀnka pÄ Prometheus.

En av de utmÀrkande egenskaperna hos Prometheus Àr att den hÀmtar metrik frÄn insamlingspunkter (via exporters) och lagrar dem i TSDB (Time Series Data Base, tidsserie-databas) med metadata i form av etiketter.

Varför behövs det?

PÄ senare tid har Prometheus blivit de facto-standard i vÀrlden av containrar och Kubernetes: installationen Àr mycket enkel, och det finns frÄn början en endpoint för Prometheus i Kubernetes-klustret. Prometheus kan ocksÄ hÀmta metrik frÄn applikationer som körs i containrar, samtidigt som vissa etiketter sparas. DÀrför Àr övervakning av applikationer mycket enkelt att genomföra.

TyvÀrr finns det fortfarande ingen "plug and play"-lösning för logghantering, och du mÄste hitta en lösning för dig sjÀlv:

  • en hanterad molntjĂ€nst för centralisering av loggar (AWS, Azure eller Google)
  • en övervakningstjĂ€nst som "övervakning som en tjĂ€nst" (monitoring as a service) (till exempel Datadog)
  • skapa din egen loggsamlartjĂ€nst.

För det tredje alternativet har jag traditionellt anvÀnt Elasticsearch, Àven om jag inte alltid har varit nöjd med det (sÀrskilt dess tyngd och komplexitet vid installation).

Loki har designats för att förenkla implementeringen enligt följande principer:

  • vara lĂ€tt att starta
  • konsumera lite resurser
  • fungera sjĂ€lvstĂ€ndigt utan specialunderhĂ„ll
  • vara ett komplement till Prometheus för att hjĂ€lpa till att undersöka buggar.

Men denna enkelhet uppnÄs pÄ bekostnad av vissa kompromisser. En av dem Àr att inte indexera innehÄllet. DÀrför Àr textbaserad sökning inte sÀrskilt effektiv eller innehÄllsrik och tillÄter inte att vi gör statistik pÄ textinnehÄllet. Men eftersom Loki vill vara ekvivalent med grep och ett komplement till Prometheus Àr detta ingen nackdel.

Incidentutredning

För att bÀttre förstÄ varför Loki inte behöver indexing, lÄt oss gÄ tillbaka till metoden för incidentutredning som utvecklarna av Loki anvÀnde:

Loki - loggsamling med Prometheus-ansatsen
1 Varning → 2 Instrumentpanel → 3 Adhoc FrĂ„ga → 4 Loggaggregation → 5 Distribuerad SpĂ„rning → 6 ÅtgĂ€rda!
(1 Varning → 2 Instrumentpanel → 3 Adhoc FrĂ„ga → 4 Loggaggregation → 5 Distribuerad SpĂ„rning → 6 ÅtgĂ€rdar!)

Tanken Àr att vi fÄr en alert (Slack-notis, SMS osv.) och efter det:

  • tittar pĂ„ Grafana-instrumentpaneler
  • tittar pĂ„ tjĂ€nsternas mĂ€tvĂ€rden (till exempel i Prometheus)
  • tittar pĂ„ loggar (till exempel i Elasticsearch)
  • möjligen kollar pĂ„ distribuerade spĂ„rningar (Jaeger, Zipkin m.fl.)
  • och slutligen Ă„tgĂ€rdar det ursprungliga problemet.

HÀr, i fallet med Grafana + Prometheus + Elasticsearch + Zipkin, mÄste vi anvÀnda fyra olika verktyg. För att spara tid skulle det vara bra att kunna utföra alla dessa steg med hjÀlp av ett enda verktyg: Grafana. Det Àr vÀrt att notera att detta tillvÀgagÄngssÀtt för utredning har implementerats i Grafana sedan version 6. SÄledes blir det möjligt att komma Ät Prometheus-data direkt frÄn Grafana.

Loki - loggsamling med Prometheus-ansatsen
Explorer-skÀrmen delas mellan Prometheus och Loki

PÄ den hÀr skÀrmen kan man se loggar i Loki, kopplade till Prometheus-mÀtvÀrden, med hjÀlp av konceptet för delad skÀrm. FrÄn och med version 6.5 lÄter Grafana hantera spÄrnings-ID:t (trace id) i loggeinlÀgg frÄn Loki för att lÀnka till dina favoritverktyg för distribuerad spÄrning (Jaeger).

Lokal test av Loki

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

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

DÀrefter mÄste du gÄ till produktionskatalogen:

$ cd production

Efter det kan du fÄ den senaste versionen av Docker-bilder:

$ docker-compose pull

Slutligen startas Loki-stacken med följande kommando:

$ docker-compose up

Arkitektur för Loki

HÀr Àr ett litet diagram över arkitekturen för Loki:

Loki - loggsamling med Prometheus-ansatsen
Arkitekturprinciper för Loki

Webbklienten kör applikationer pÄ servern, Promtail samlar in loggar och skickar dem till Loki, webbklienten skickar ocksÄ metadata till Loki. Loki aggregerar allt och vidarebefordrar till Grafana.
Loki Àr igÄng. För att se de komponenter som finns, kör följande kommando:

$ docker ps

Vid en nyinstallerad Docker bör kommandot returnera följande resultat:

BILD               PORTAR                  NAMN
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 som ansvarar för centralisering av loggar
  • Grafana: ett vĂ€lkĂ€nt verktyg för dashboards
  • Loki: daemon för centralisering av data

Inom en klassisk infrastruktur (till exempel baserad pÄ virtuella maskiner) mÄste varje maskin ha agenten Promtail installerad. Grafana och Loki kan installeras pÄ samma maskin.

Distribution i Kubernetes

Installationen av Loki-komponenter i Kubernetes kommer att bestÄ av följande:

  • daemonSet för att distribuera agenten Promtail pĂ„ varje maskin i serverklustret
  • distribution (Deployment) av Loki
  • och sist — distribution av Grafana.

Lyckligtvis Àr Loki tillgÀnglig som ett Helm-paket, vilket förenklar dess distribution.

Installation via Heml

Heml bör redan vara installerad hos dig. Den kan laddas ner frÄn GitHub-repositoryt för projektet. Den installeras genom att packa upp arkivet motsvarande din arkitektur, och lÀgga till helm i $PATH.

AnmÀrkning: version 3.0.0 av Helm slÀpptes nyligen. Eftersom det gjordes mÄnga förÀndringar, rekommenderas lÀsaren att vÀnta lite innan de börjar anvÀnda den..

TillÀgg av kÀlla för Helm

Första steget Àr att lÀgga till 'loki'-repo med följande kommando:

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

DÀrefter kan man söka efter paket med namnet 'loki':

$ helm search loki

Resultatet:

loki/loki       0.17.2 v0.4.0 Loki: som Prometheus, men för loggar.
loki/loki-stack 0.19.1 v0.4.0 Loki: som Prometheus, men för loggar.
loki/fluent-bit 0.0.2  v0.0.1 AnvÀnder fluent-bit Loki go-plugin för...
loki/promtail   0.13.1 v0.4.0 Ansvarig för att samla loggar och...

Dessa paket har följande funktioner:

  • paketet loki/loki motsvarar endast Loki-servern
  • paketet loki/fluent-bit lĂ„t dig distribuera DaemonSet med fluent-bit för loggsamling istĂ€llet för Promtail
  • paketet loki/promtail innehĂ„ller agenten för loggfilssamling
  • paketet loki/loki-stack, tillĂ„ter att omedelbart distribuera Loki tillsammans med Promtail.

Installation av Loki

För att distribuera Loki i Kubernetes, kör följande kommando i namnutrymmet 'monitoring':

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

För att spara pÄ disk, lÀgg till parametern --set loki.persistence.enabled = true:

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

AnmÀrkning: 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:

SENASTE UTPLACERING: Tis 19 nov 15:56:54 2019
NAMNRYMD: övervakning
STATUS: UTPLACERAD
RESURSER:
==> v1/ClusterRole
NAMN ÅLDER
loki-promtail-clusterrole 189d
…
ANTECKNINGAR:
Loki-stacken har blivit utplacerad i din kluster. Loki kan nu läggas till som en datakälla i Grafana.
Se <a href="http://docs.grafana.org/features/datasources/loki/">http://docs.grafana.org/features/datasources/loki/</a> för mer information.

Genom att titta pÄ statusen för poddar i namnomrÄdet "monitoring" ser vi att allt Àr distribuerat:

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

Resultatet:

NAMN                 KLAR  STATUS   OMSTARTAR  ÅLDER
loki-0               1/1    Kör      0         147m
loki-promtail-9zjvc  1/1    Kör      0         3h25m
loki-promtail-f6brf  1/1    Kör      0         11h
loki-promtail-hdcj7  1/1    Kör      0         3h23m
loki-promtail-jbqhc  1/1    Kör      0         11h
loki-promtail-mj642  1/1    Kör      0         62m
loki-promtail-nm64g  1/1    Kör      0         24m

Alla poddar körs. Nu Àr det dags att göra nÄgra tester!

Anslutning till Grafana

För att ansluta till Grafana via Kubernetes, mÄste du öppna en tunnel till dess pod. HÀr Àr kommandot för att öppna port 3000 för Grafana-poden:

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

En annan viktig punkt Àr behovet av att ÄterstÀlla administratörslösenordet för Grafana. Lösenordet lagras i hemligheten loki-grafana i fÀltet .data.admin-user i base64-format.

För att ÄterstÀlla det, kör följande kommando:

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

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

Definiera datakÀlla för Loki i Grafana

Först, se till att en datakÀlla för Loki har skapats (Konfiguration / Datasource).
HÀr Àr ett exempel:

Loki - loggsamling med Prometheus-ansatsen
Exempel pÄ instÀllning av datakÀlla för Loki

Genom att klicka pÄ "Test" kan du kontrollera anslutningen till Loki.

Gör förfrÄgningar till Loki

Nu gÄr du till Grafana i avsnittet "Explore". NÀr Loki tar emot loggar frÄn containrar lÀgger den till metadata frÄn Kubernetes. DÀrför blir det möjligt att granska loggar frÄn en specifik container.

Till exempel, för att vÀlja loggar frÄn promtail-containern kan du anvÀnda följande förfrÄgan: {container_name = "promtail"}.
Kom ihÄg att ocksÄ vÀlja datakÀlla för Loki.

Denna förfrÄgan kommer att returnera containeraktivitet i följande form:

Loki - loggsamling med Prometheus-ansatsen
Resultatet av förfrÄgan i Grafana

LÀgg till pÄ dashboard

FrÄn och med Grafana 6.4 kan du placera logginformation direkt pÄ dashboarden. Efter detta kommer anvÀndaren snabbt kunna vÀxla mellan antalet förfrÄgningar pÄ sin webbplats och applikationens spÄrningar.

Nedan Àr ett exempel pÄ en dashboard som implementerar denna interaktion:

Loki - loggsamling med Prometheus-ansatsen
Exempel pÄ en instrumentpanel med Prometheus-metriker och Loki-loggar

Framtiden för Loki

Jag började anvÀnda Loki i maj/juni med version 0.1. Idag har version 1 slÀppts, och till och med 1.1 och 1.2.

Vi mÄste erkÀnna att version 0.1 inte var tillrÀckligt stabil. Men 0.3 visade redan verkliga tecken pÄ mognad, och de följande versionerna (0.4, sedan 1.0) förstÀrkte bara det intrycket.

Efter 1.0.0 finns det ingen ursÀkt för att inte anvÀnda detta fantastiska verktyg.

Framtida förbÀttringar bör handla om integrationen av Loki med den utmÀrkta Grafana. Faktum Àr att Grafana 6.4 redan hade en bra integration med instrumentpanelerna.

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

Nedan finns en kort video som visar detta mekanism:

Loki - loggsamling med Prometheus-ansatsen
AnvÀndning av Loki-strÀngar som visas i Grafana

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

  • lĂ€nkar till externa verktyg
  • filtrering av logginnehĂ„ll

Till exempel kan du klicka pÄ traceId för att gÄ till Zipkin eller Jaeger.

Vi ser fram emot era kommentarer och bjuder in till öppen webbinarie, dÀr vi pratar om hur DevOps-industrin utvecklades under 2019 och diskuterar möjliga utvecklingsvÀgar för 2020.

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster