Loki - zbiranje hlodovine po Prometejevem pristopu

Pozdravljeni, prebivalci Khabrovsk! Na predvečer začetka novega vpisa v tečaj "Prakse in orodja DevOps" Za vas smo pripravili prevod zanimivega gradiva.

Ta članek je kratek uvod v Loki. Projekt Loki podpira Grafana in je namenjen centraliziranemu zbiranju dnevnikov (iz strežnikov ali vsebnikov).

Glavni navdih za Lokija je bil Prometej z idejo o uporabi njegovih pristopov k upravljanju dnevnikov:

  • uporaba oznak za shranjevanje podatkov
  • poraba malo sredstev

Vrnili se bomo k delovanju Prometheusa in podali nekaj primerov njegove uporabe v kontekstu Kubernetesa.

Nekaj ​​besed o Prometeju

Da bi popolnoma razumeli, kako deluje Loki, je pomembno, da stopimo korak nazaj in se spomnimo nekaj o Prometeju.

Ena izmed posebnosti Prometheusa je pridobivanje metrik iz zbirnih mest (preko izvoznikov) in njihovo shranjevanje v TSDB (Time Series Data Base), z dodajanjem metapodatkov v obliki oznak.

Zakaj je to potrebno

Pred kratkim je Prometheus postal de facto standard v svetu vsebnikov in Kubernetesa: njegova namestitev je zelo preprosta, gruča Kubernetes pa ima izvorno končno točko za Prometheus. Prometheus lahko tudi izvleče meritve iz aplikacij, nameščenih v vsebniku, medtem ko shranjuje določene oznake. Zato je nadzor aplikacij zelo enostaven za izvedbo.

Na žalost še vedno ni rešitve za upravljanje dnevnikov na ključ in rešitev morate najti sami:

  • upravljana storitev v oblaku za centralizacijo dnevnikov (AWS, Azure ali Google)
  • storitev spremljanja »nadzor kot storitev« (na primer Datadog)
  • ustvarjanje lastne storitve zbiranja dnevnikov.

Za tretjo možnost sem tradicionalno uporabljal Elasticsearch, kljub temu, da z njim nisem bil vedno zadovoljen (predvsem z njegovo težo in zahtevnostjo konfiguracije).

Loki je bil zasnovan za poenostavitev implementacije v skladu z naslednjimi načeli:

  • biti enostaven za začetek
  • porabijo malo sredstev
  • deluje samostojno brez posebnega vzdrževanja
  • služijo kot dodatek k Prometheusu za pomoč pri preiskavah hroščev

Vendar ta preprostost prihaja na račun nekaterih kompromisov. Eden od njih je, da vsebine ne indeksiramo. Zato iskanje besedila ni zelo učinkovito ali bogato in ne omogoča statistike vsebine besedila. Ker pa Loki želi biti ekvivalent grepu in dopolnitev Prometheusa, to ni slabost.

Preiskava incidenta

Da bi bolje razumeli, zakaj Loki ne potrebuje indeksiranja, se vrnimo k metodi preiskave incidenta, ki so jo uporabili razvijalci Lokija:

Loki - zbiranje hlodovine po Prometejevem pristopu
1 Opozorilo → 2 Nadzorna plošča → 3 Adhoc poizvedba → 4 Združevanje dnevnikov → 5 Porazdeljeno sledenje → 6 Popravi!
(1 Opozorilo → 2 Nadzorna plošča → 3 Adhoc poizvedba → 4 Združevanje dnevnikov → 5 Porazdeljeno sledenje → 6 Popravek!)

Ideja je, da prejmemo nekakšno opozorilo (Slack Notification, SMS itd.) in po tem:

  • poglej nadzorne plošče Grafana
  • poglejte meritve storitve (na primer v Prometheusu)
  • poglejte vnose v dnevnik (na primer v Elasticsearch)
  • mogoče si oglejte porazdeljene sledi (Jaeger, Zipkin itd.)
  • in končno odpraviti prvotno težavo.

Tukaj, v primeru sklada Grafana + Prometheus + Elasticsearch + Zipkin, boste morali uporabiti štiri različna orodja. Da bi zmanjšali čas, bi bilo lepo, če bi lahko vse te korake izvajali z enim orodjem: Grafana. Omeniti velja, da je ta pristop k raziskovanju implementiran v Grafano od različice 6. Tako je mogoče dostopati do podatkov Prometheus neposredno iz Grafane.

Loki - zbiranje hlodovine po Prometejevem pristopu
Raziskovalni zaslon je razdeljen na Prometheusa in Lokija

Na tem zaslonu si lahko ogledate dnevnike Loki, povezane z meritvami Prometheus, z uporabo koncepta razdeljenega zaslona. Od različice 6.5 vam Grafana omogoča razčlenitev id-ja sledenja v vnosih v dnevnik Loki, da sledite povezavam do vaših priljubljenih porazdeljenih orodij za sledenje (Jaeger).

Lokalni test Loki

Najlažji način za lokalno testiranje Lokija je uporaba docker-compose. Datoteka docker-compose se nahaja v repozitoriju Loki. Repozitorij lahko dobite z naslednjim ukazom git:

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

Nato morate iti v proizvodni imenik:

$ cd production

Po tem lahko dobite najnovejšo različico slik Docker:

$ docker-compose pull

Končno se sklad Loki zažene z naslednjim ukazom:

$ docker-compose up

Loki arhitektura

Tukaj je majhen diagram z arhitekturo Loki:

Loki - zbiranje hlodovine po Prometejevem pristopu
Načela arhitekture Loki

Spletni odjemalec poganja aplikacije na strežniku, Promtail zbira dnevnike in jih pošilja Lokiju, spletni odjemalec Lokiju pošilja tudi metapodatke. Loki vse združi in prenese Grafani.
Loki je izstreljen. Za ogled razpoložljivih komponent zaženite naslednji ukaz:

$ docker ps

V primeru sveže nameščenega Dockerja bi moral ukaz vrniti naslednji rezultat:

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

Vidimo naslednje komponente:

  • Promtail: agent, odgovoren za centralizacijo dnevnikov
  • Grafana: znano orodje za nadzorno ploščo
  • Loki: Demon za centralizacijo podatkov

Kot del klasične infrastrukture (na primer na osnovi virtualnih strojev) mora biti agent Promtail nameščen na vsakem stroju. Grafana in Loki lahko namestite na isti stroj.

Namestitev v Kubernetes

Namestitev komponent Loki na Kubernetes bo naslednja:

  • daemonSet za uvajanje agenta Promtail na vsakem od računalnikov v gruči strežnikov
  • Razmestitev Loki
  • zadnja pa je uvedba Grafana.

Na srečo je Loki na voljo kot paket Helm, kar omogoča preprosto uvajanje.

Namestitev preko Hemla

Heml bi že moral imeti nameščen. Prenesete ga lahko iz repozitorija GitHub projekta. Namestite ga tako, da razpakirate arhiv, ki ustreza vaši arhitekturi, in vanj dodate helm $PATH.

Opomba: različica 3.0.0 programa Helm je bila izdana pred kratkim. Ker je bilo na njem veliko sprememb, bralcu svetujemo, da z uporabo nekoliko počaka..

Dodajanje vira za Helm

Prvi korak je dodajanje repozitorija »loki« z naslednjim ukazom:

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

Po tem lahko iščete pakete z imenom »loki«:

$ helm search loki

Rezultat:

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

Ti paketi imajo naslednje lastnosti:

  • Paket loki/loki ujema se samo s strežnikom Loki
  • Paket loki/fluent-bit vam omogoča, da namestite DaemonSet z uporabo fluent-bin za zbiranje dnevnikov namesto Promtail
  • Paket loki/promtail vsebuje posrednika za zbiranje dnevniških datotek
  • Paket loki/loki-sklad, vam omogoča takojšnjo namestitev Lokija skupaj s Promtailom.

Namestitev Lokija

Če želite uvesti Loki v Kubernetes, zaženite naslednji ukaz v imenskem prostoru »monitoring«:

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

Če želite shraniti na disk, dodajte parameter --set loki.persistence.enabled = true:

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

Opomba: če želite sočasno namestiti Grafano, dodajte parameter --set grafana.enabled = true

Ko zaženete ta ukaz, bi morali dobiti naslednji rezultat:

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.

Če pogledamo stanje podov v imenskem prostoru »monitoring«, lahko vidimo, da je vse razporejeno:

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

Rezultat:

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

Vse stroke tečejo. Zdaj je čas za nekaj testov!

Povezovanje z Grafano

Če se želite povezati z Grafano pod Kubernetesom, morate odpreti tunel do njenega sklopa. Spodaj je ukaz za odpiranje vrat 3000 za Grafana pod:

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

Druga pomembna točka je potreba po obnovitvi skrbniškega gesla Grafana. Geslo je tajno loki-grafana na terenu .data.admin-user v formatu base64.

Če ga želite obnoviti, morate zagnati naslednji ukaz:

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

Uporabite to geslo v povezavi s privzetim skrbniškim računom (admin).

Definiranje vira podatkov Loki v Grafani

Najprej se prepričajte, da je bil vir podatkov Loki ustvarjen (Configuration/Datasource).
Tu je primer:

Loki - zbiranje hlodovine po Prometejevem pristopu
Primer nastavitve vira podatkov za Loki

S klikom na “Test” lahko preverite povezavo z Loki.

Pošiljanje prošenj Lokiju

Zdaj pojdite na Grafana v razdelek »Razišči«. Ko prejema dnevnike iz vsebnikov, Loki doda metapodatke iz Kubernetesa. Tako postane možen ogled dnevnikov določenega vsebnika.

Če želite na primer izbrati dnevnike vsebnika promtail, lahko uporabite naslednjo poizvedbo: {container_name = "promtail"}.
Tukaj tudi ne pozabite izbrati vira podatkov Loki.

Ta poizvedba bo vrnila dejavnost vsebnika na naslednji način:

Loki - zbiranje hlodovine po Prometejevem pristopu
Rezultat poizvedbe v Grafani

Dodaj na nadzorno ploščo

Od različice Grafana 6.4 naprej lahko podatke o dnevniku postavite neposredno na nadzorno ploščo. Po tem bo uporabnik lahko hitro preklapljal med številom zahtev na svojem spletnem mestu in sledmi aplikacije.

Spodaj je primer nadzorne plošče, ki izvaja to interakcijo:

Loki - zbiranje hlodovine po Prometejevem pristopu
Vzorčna nadzorna plošča z meritvami Prometheus in dnevniki Loki

Prihodnost Lokija

Loki sem začel uporabljati maja/junija z različico 0.1. Danes je že izdana različica 1 in celo 1.1 in 1.2.

Treba je priznati, da različica 0.1 ni bila dovolj stabilna. Toda 0.3 je že kazal prave znake zrelosti in naslednje različice (0.4, nato 1.0) so ta vtis le še utrdile.

Po različici 1.0.0 nihče ne more imeti izgovora, da ne bi uporabil tega čudovitega orodja.

Nadaljnje izboljšave ne bi smele biti povezane z Lokijem, temveč njegovo integracijo z odlično Grafano. Pravzaprav ima Grafana 6.4 že dobro integracijo z nadzornimi ploščami.

Grafana 6.5, ki je bila izdana pred kratkim, dodatno izboljšuje to integracijo s samodejnim prepoznavanjem vsebine dnevnika v formatu JSON.

Spodnji video prikazuje majhen primer tega mehanizma:

Loki - zbiranje hlodovine po Prometejevem pristopu
Uporaba Lokijevih strun, izpostavljenih v Grafani

Eno od polj JSON je mogoče uporabiti na primer za:

  • povezave do zunanjega orodja
  • filtriranje vsebine dnevnika

Na primer, lahko kliknete na traceId, da odprete Zipkin ali Jaeger.

Kot običajno se veselimo vaših komentarjev in vas vabimo k odprt webinar, kjer bomo govorili o tem, kako se je industrija DevOps razvijala v letu 2019 in razpravljali o možnih razvojnih poteh za leto 2020.

Vir: www.habr.com