Loki — zbiranje logov z uporabo pristopa Prometheus

Pozdrav, Hubrovcani! Pred začetkom novega tečaja «DevOps prakse in orodja» smo pripravili prevod zanimivega gradiva.

Ta članek je kratko uvod v Loki. Projekt Loki podpira Grafana in je usmerjen na centralizirano zbiranje logov (s strežnikov ali kontejnerjev).

Glavni vir navdiha za Loki je bil Prometheus ideja uporabe njegovih pristopov k upravljanju z logi:

  • uporaba oznak (labels) za shranjevanje podatkov
  • poraba majhne količine virov

O načelih delovanja Prometheusa se bomo še vrnili in prikazali nekaj primerov njegove uporabe v kontekstu Kubernetes.

Nekaj besed o Prometheusu

Da bi popolnoma razumeli, kako deluje Loki, je pomembno narediti korak nazaj in malo spomniti na Prometheus.

Ena od značilnosti Prometheusa je pridobivanje metrik iz zbirnih točk (prek izvoznikov) in shranjevanje teh v TSDB (Time Series Data Base, baza podatkov časovnih vrst) z dodajanjem metapodatkov v obliki oznak.

Zakaj je to potrebno

V zadnjem času je Prometheus postal de facto standard v svetu kontejnerjev in Kubernetes: namestitev je zelo preprosta, v Kubernetes klasterju pa je prvotno prisoten končni točka za Prometheus. Prometheus lahko tudi pridobi metrike iz aplikacij, ki so nameščene v kontejnerju, pri tem pa ohrani določene oznake. Zato je spremljanje aplikacij zelo enostavno za implementacijo.

Na žalost še vedno ni rešitve za upravljanje z logi "iz škatle", zato morate najti rešitev zase:

  • upravljana oblačna storitev za centralizacijo logov (AWS, Azure ali Google)
  • storitev za spremljanje "spremljanje kot storitev" (monitoring as a service) (na primer, Datadog)
  • ustvarjanje svoje storitve zbiranja logov.

Za tretjo možnost sem tradicionalno uporabljal Elasticsearch, čeprav nisem bil vedno zadovoljen z njim (še posebej z njegovo težo in zapletenostjo nastavitve).

Loki je bil zasnovan z namenom poenostavitve implementacije v skladu z naslednjimi načeli:

  • biti enostaven za začetek
  • porabiti malo virov
  • delovati samostojno brez kakršnega koli posebnega vzdrževanja
  • biti dodatek k Prometheusu za pomoč pri preiskovanju napak

Vendar pa ta preprostost dosežemo na račun nekaterih kompromisov. Eden izmed njih je, da se vsebine ne indeksirajo. Zato iskanje po besedilu ni ravno učinkovito ali bogato in ne omogoča statističnih podatkov o vsebini besedila. Ker pa si Loki prizadeva biti ekvivalent grep in dopolnilo k Prometheusu, to ni pomanjkljivost.

Preiskovanje incidentov

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

Loki — zbiranje logov z uporabo pristopa Prometheus
1 Alarm → 2 Nadzorna plošča → 3 Ad-hoc poizvedba → 4 Agregacija zapisov → 5 Distribucijsko sledenje → 6 Popravite!
(1 Alarm → 2 Nadzorna plošča → 3 Ad-hoc poizvedba → 4 Agregacija zapisov → 5 Distribucijsko sledenje → 6 Popravimo!)

Ideja je, da dobimo nek alarm (obvestilo na Slacku, SMS itd.) in nato:

  • pregledamo nadzorne plošče Grafana
  • pregledamo metrike storitev (na primer v Prometheusu)
  • pregledamo zapise logov (na primer v Elasticsearch)
  • morda si ogledamo distribuirane sledi (Jaeger, Zipkin itd.)
  • in nazadnje odpravimo osnovni problem.

Tukaj, v primeru sklopa Grafana + Prometheus + Elasticsearch + Zipkin, bo treba uporabiti štiri različna orodja. Da bi zmanjšali čas, bi bilo dobro, da lahko vse te korake izvedemo z enim orodjem: Grafana. Treba je omeniti, da je tak pristop k raziskovanju uveden v Grafana od različice 6. Tako postane mogoče dostopati do podatkov Prometheus neposredno iz Grafana.

Loki — zbiranje logov z uporabo pristopa Prometheus
Zaslon Explorer je razdeljen med Prometheus in Loki

Na tem zaslonu lahko gledate loge v Loki, povezane z metričnimi podatki Prometheus, z uporabo koncepta deljenega zaslona. Od različice 6.5 Grafana omogoča obdelavo identifikatorja sledenja (trace id) v zapisih logov Loki za preusmeritev na vaše najljubše instrumente za distribuirano sledenje (Jaeger).

Lokalno testiranje Loki

Najlažji način lokalnega testiranja Loki je uporaba docker-compose. Datoteka docker-compose se nahaja v repozitoriju Loki. Repozitorij lahko pridobite s spodnjim ukazom git:

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

Nato se morate premakniti v imenik production:

$ cd production

Nato lahko pridobite najnovejšo različico Docker slik:

$ docker-compose pull

Nazadnje se sklad Loki zažene z naslednjim ukazom:

$ docker-compose up

Arhitektura Lokija

Tukaj je majhna shema z arhitekturo Loki:

Loki — zbiranje logov z uporabo pristopa Prometheus
Načela arhitekture Loki

Web klient zažene aplikacije na strežniku, Promtail zbira dnevnike in jih pošilja v Loki, web klient pa prav tako pošilja metapodatke v Loki. Loki vse agregira in prenese v Grafano.
Loki je zagnan. Za ogled obstoječih komponent izvedite naslednji ukaz:

$ docker ps

V primeru sveže nameščenega Dockerja naj ukaz vrne 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 nadzorne plošče
  • Loki: demon za centralizacijo podatkov

V okviru klasične infrastrukture (na primer, na osnovi virtualnih strojev) mora biti agent Promtail nameščen na vsakem računalniku. Grafana in Loki sta lahko nameščena na eni sami napravi.

Uvedba v Kubernetes

Namestitev komponent Loki v Kubernetes bo obsegala naslednje:

  • daemonSet za uvedbo agenta Promtail na vsakem od računalnikov v strežniškem klasterju
  • uvajanje (Deployment) Loki
  • in nazadnje — uvedba Grafane.

Na srečo je Loki na voljo kot Helm paket, kar olajša njegovo uvedbo.

Namestitev preko Helm

Helm bi moral že biti nameščen. Prenesete ga lahko iz GitHub repozitorija projekta. Namesti se z razpakiranjem arhiva, ki ustreza vaši arhitekturi, in dodajanjem helma v $PATH.

Opomba: različica 3.0.0 Helm je bila nedavno izdana. Ker je bilo v njej veliko sprememb, je bralcu priporočljivo, da malo počaka, preden jo začne uporabljati..

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: kot Prometheus, vendar za dnevnike.
loki/loki-stack 0.19.1 v0.4.0 Loki: kot Prometheus, vendar za dnevnike.
loki/fluent-bit 0.0.2  v0.0.1 Uporablja fluent-bit Loki go vtičnik za...
loki/promtail   0.13.1 v0.4.0 Odgovoren za zbiranje dnevnikov in...

Ti paketi imajo naslednje funkcije:

  • paket loki/loki ustreza samo strežniku Loki
  • paket loki/fluent-bit vam omogoča, da uvedete DaemonSet, ki uporablja fluent-bit za zbiranje dnevnikov namesto Promtail
  • paket loki/promtail vsebuje agent za zbiranje dnevniških datotek
  • paket loki/loki-stack, omogoča takojšnje uvajanje Lokija skupaj s Promtail.

Namestitev Lokija

Da uvedete Lokija v Kubernetes, izvedite naslednji ukaz v imenskem prostoru "monitoring":

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

Za shranjevanje 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 istočasno razporediti Grafano, dodajte parameter --set grafana.enabled = true

Ob zagonu te ukazne vrstice bi morali dobiti naslednji izhod:

ZADNJI DEPLAJ: Tor, 19. nov 2019 15:56:54
IMENSKI PROSTOR: monitoring
STATUS: DEPLAJAN
VIRI:
==> v1/ClusterRole
IME STAROST
loki-promtail-clusterrole 189d
…
OPOMBA:
Loki sklad je bil nameščen v vašem grozdu. Loki lahko zdaj dodate kot vir podatkov v Grafano.
Poglejte <a href="http://docs.grafana.org/features/datasources/loki/">http://docs.grafana.org/features/datasources/loki/</a> za več podrobnosti.

Ko si ogledamo stanje podov v imenskem prostoru 'monitoring', bomo videli, da so vsi razporejeni:

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

Rezultat:

IME                  PRIPRAVLJEN STATUS    PONOVITVE STAROST
loki-0               1/1    Deluje   0         147m
loki-promtail-9zjvc  1/1    Deluje   0         3h25m
loki-promtail-f6brf  1/1    Deluje   0         11h
loki-promtail-hdcj7  1/1    Deluje   0         3h23m
loki-promtail-jbqhc  1/1    Deluje   0         11h
loki-promtail-mj642  1/1    Deluje   0         62m
loki-promtail-nm64g  1/1    Deluje   0         24m

Vsi podi so zagnani. Zdaj je čas za nekaj testov!

Povezava z Grafano

Da se povežete z Grafano preko Kubernetesa, morate odpreti tunel do njenega poda. Spodaj je ukaz za odprtje vrata 3000 za pod Grafana:

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

Še ena pomembna točka je potreba po obnovitvi gesla za skrbnika Grafane. Geslo se shranjuje v skrivnosti loki-grafana u polju .data.admin-user v formatu base64.

Za obnovitev te informacije morate izvesti naslednji ukaz:

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

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

Določitev vira podatkov Loki v Grafani

Najprej se prepričajte, da je ustvarjen vir podatkov Loki (Konfiguracija / Vir podatkov).
Tukaj je primer:

Loki — zbiranje logov z uporabo pristopa Prometheus
Primer nastavitve vira podatkov za Loki

S klikom na 'Preizkusi' lahko preverite povezavo z Lokijem.

Izvajanje poizvedb z Lokijem

Zdaj se pomaknite v Grafano v razdelek 'Razišči'. Pri prejemanju dnevnikov iz kontejnerjev Loki doda metadata iz Kubernetesa. Tako je mogoče pregledovati dnevnike določenega kontejnerja.

Na primer, za izbiro dnevnikov kontejnerja promtail lahko uporabite naslednji poizvedbeni izraz: {container_name = "promtail"}.
Tudi tukaj ne pozabite izbrati vir podatkov Loki.

Ta poizvedba bo vrnila aktivnost kontejnerjev v naslednji obliki:

Loki — zbiranje logov z uporabo pristopa Prometheus
Rezultat poizvedbe v Grafani

Dodajanje na nadzorno ploščo

Od Grafane 6.4 naprej je mogoče informacije o dnevnikih neposredno dodati na nadzorno ploščo. Po tem se lahko uporabnik hitro preklaplja med številom poizvedb na svoji spletni strani in sledi aplikaciji.

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

Loki — zbiranje logov z uporabo pristopa Prometheus
Vzorec nadzorne plošče s metriko Prometheus in logi Loki

Prihodnost Loki

Loki sem začel uporabljati že maja/junija z različico 0.1. Danes je že na voljo različica 1, pa tudi 1.1 in 1.2.

Treba je priznati, da različica 0.1 ni bila dovolj stabilna. A 0.3 je že pokazala prave znake zrelosti, naslednje različice (0.4, nato 1.0) pa so to prepričanje samo okrepile.

Po 1.0.0 nihče ne more imeti več opravičila, da ne uporablja tega izjemnega orodja.

Nadaljnja izboljšanja bi morala biti osredotočena ne na Loki, temveč na njegovo integracijo s odličnim Grafano. V resnici je v Grafani 6.4 že prišla dobra integracija z nadzornimi ploščami.

Grafana 6.5, ki je bila nedavno izdana, še dodatno izboljšuje to integracijo, saj samodejno prepozna vsebino logov v formatu JSON.

Spodaj v videoposnetku je prikazan majhen primer tega mehanizma:

Loki — zbiranje logov z uporabo pristopa Prometheus
Uporaba niza Loki, prikazanih v Grafani

Možno je uporabiti enega od polj JSON, na primer, za:

  • povezavo na zunanjo orodje
  • filtriranje vsebine logov

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

Tradicionalno pričakujemo vaše komentarje in vas vabimo na odprt webinar, kjer se bomo pogovarjali o tem, kako se je razvijala DevOps industrija v letu 2019 in razpravljali o možnih razvojnih poteh za leto 2020.

Izvor: habr.com

Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki 🔥 Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki | ProHoster