Loki – rąstų rinkimas naudojant Prometėjo metodą

Sveikinu, chabrovskiečiai! Naujos registracijos į kursus pradžios išvakarėse „DevOps praktika ir įrankiai“ Paruošėme jums įdomios medžiagos vertimą.

Šis straipsnis yra trumpas Loki įvadas. Projektas Loki remia Grafana ir yra skirtas centralizuotam žurnalų rinkimui (iš serverių ar konteinerių).

Pagrindinis Loki įkvėpimas buvo Prometėjas su idėja pritaikyti savo metodus žurnalų valdymui:

  • naudojant etiketes duomenims saugoti
  • sunaudoja nedaug išteklių

Grįšime prie „Prometheus“ veikimo ir pateiksime keletą jo naudojimo „Kubernetes“ kontekste pavyzdžių.

Keletas žodžių apie Prometėją

Norint visiškai suprasti, kaip veikia Loki, svarbu žengti žingsnį atgal ir šiek tiek prisiminti apie Prometėją.

Vienas iš išskirtinių Prometheus bruožų yra metrikos ištraukimas iš surinkimo taškų (per eksportuotojus) ir saugojimas TSDB (laiko eilučių duomenų bazėje), pridedant metaduomenis etikečių pavidalu.

Kodėl jums to reikia

Neseniai „Prometheus“ tapo de facto standartu konteinerių ir „Kubernetes“ pasaulyje: jo diegimas yra labai paprastas, o „Kubernetes“ klasteris yra su įprastu „Prometheus“ galutiniu tašku. „Prometheus“ taip pat gali išgauti metriką iš konteineryje įdiegtų programų, saugodama konkrečias etiketes. Todėl programų stebėjimą įgyvendinti labai paprasta.

Deja, vis dar nėra „iki rakto“ žurnalo valdymo sprendimo, todėl sprendimą turite rasti patys:

  • valdoma debesies paslauga, skirta centralizuoti žurnalus (AWS, Azure arba Google)
  • stebėjimo paslauga „stebėjimas kaip paslauga“ (pavyzdžiui, Datadog)
  • sukurti savo žurnalų surinkimo paslaugą.

Trečiajam variantui tradiciškai naudojau Elasticsearch, nepaisant to, kad ne visada buvau juo patenkintas (ypač dėl sunkumo ir konfigūracijos sudėtingumo).

„Loki“ buvo sukurta siekiant supaprastinti įgyvendinimą pagal šiuos principus:

  • būti paprasta pradėti
  • sunaudoja nedaug išteklių
  • dirbti savarankiškai, be jokios specialios priežiūros
  • tarnauja kaip „Prometheus“ priedas, padedantis tirti klaidas

Tačiau šis paprastumas atsiranda tam tikrų kompromisų sąskaita. Vienas iš jų – neindeksuoti turinio. Todėl teksto paieška nėra labai efektyvi ar turtinga ir neleidžia gauti statistikos apie teksto turinį. Bet kadangi Loki nori būti grep atitikmuo ir Prometėjo papildymas, tai nėra trūkumas.

Incidento tyrimas

Norėdami geriau suprasti, kodėl Loki nereikia indeksuoti, grįžkime prie incidentų tyrimo metodo, kurį naudojo Loki kūrėjai:

Loki – rąstų rinkimas naudojant Prometėjo metodą
1 įspėjimas → 2 prietaisų skydelis → 3 adhoc užklausa → 4 žurnalų kaupimas → 5 paskirstytas sekimas → 6 pataisyti!
(1 įspėjimas → 2 prietaisų skydelis → 3 adhoc užklausa → 4 žurnalų kaupimas → 5 paskirstytas sekimas → 6 taisymas!)

Idėja tokia, kad gauname kažkokį perspėjimą (Slack Notification, SMS ir pan.) ir po to:

  • pažiūrėkite į Grafana prietaisų skydelius
  • pažiūrėkite į paslaugų metriką (pavyzdžiui, „Prometheus“)
  • pažiūrėkite į žurnalo įrašus (pvz., Elasticsearch)
  • gal pažiūrėkit į paskirstytus pėdsakus (Jaeger, Zipkin ir kt.)
  • ir galiausiai ištaisyti pradinę problemą.

Čia, „Grafana + Prometheus + Elasticsearch + Zipkin“ krūvos atveju, turėsite naudoti keturis skirtingus įrankius. Norint sutrumpinti laiką, būtų malonu, jei galėtumėte atlikti visus šiuos veiksmus naudodami vieną įrankį: Grafana. Verta paminėti, kad šis požiūris į tyrimus buvo įdiegtas Grafana nuo 6 versijos. Taigi tampa įmanoma prieiti prie Prometheus duomenų tiesiogiai iš Grafana.

Loki – rąstų rinkimas naudojant Prometėjo metodą
„Explorer“ ekranas padalintas tarp „Prometėjo“ ir „Loki“.

Šiame ekrane galite peržiūrėti Loki žurnalus, susijusius su Prometheus metrika, naudodami padalinto ekrano koncepciją. Nuo 6.5 versijos Grafana leidžia analizuoti sekimo ID Loki žurnalo įrašuose, kad galėtumėte sekti nuorodas į mėgstamus paskirstytus sekimo įrankius (Jaeger).

Vietinis Loki testas

Lengviausias būdas išbandyti Loki vietoje yra naudoti docker-compose. „Docker“ kūrimo failas yra „Loki“ saugykloje. Saugyklą galite gauti naudodami šią komandą git:

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

Tada turite eiti į gamybos katalogą:

$ cd production

Po to galite gauti naujausią „Docker“ vaizdų versiją:

$ docker-compose pull

Galiausiai „Loki“ krūva paleidžiama naudojant šią komandą:

$ docker-compose up

Loki architektūra

Čia yra maža diagrama su Loki architektūra:

Loki – rąstų rinkimas naudojant Prometėjo metodą
Loki architektūros principai

Žiniatinklio klientas paleidžia programas serveryje, Promtail renka žurnalus ir siunčia juos į Loki, žiniatinklio klientas taip pat siunčia metaduomenis į Loki. Loki viską sujungia ir perduoda Grafanai.
Loki paleistas. Norėdami peržiūrėti galimus komponentus, paleiskite šią komandą:

$ docker ps

Naujai įdiegto „Docker“ atveju komanda turėtų grąžinti šį 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

Matome šiuos komponentus:

  • Promtail: agentas, atsakingas už žurnalų centralizavimą
  • Grafana: garsus prietaisų skydelio įrankis
  • Loki: duomenų centralizacijos demonas

Kaip klasikinės infrastruktūros dalis (pavyzdžiui, pagrįsta virtualiomis mašinomis), „Promtail“ agentas turi būti įdiegtas kiekviename kompiuteryje. „Grafana“ ir „Loki“ gali būti įdiegti tame pačiame kompiuteryje.

Diegimas Kubernetes

„Loki“ komponentų diegimas „Kubernetes“ bus toks:

  • daemonSet, skirtas diegti Promtail agentą kiekviename serverio klasterio įrenginyje
  • „Loki“ diegimas
  • o paskutinis – Grafanos dislokavimas.

Laimei, „Loki“ galima įsigyti kaip „Helm“ paketą, todėl jį lengva įdiegti.

Diegimas per Heml

Jūs jau turite būti įdiegtas Heml. Jį galima atsisiųsti iš projekto „GitHub“ saugyklos. Jis įdiegiamas išpakavus jūsų architektūrą atitinkantį archyvą ir pridedant vairą $PATH.

Pastaba: Neseniai buvo išleista „Helm“ 3.0.0 versija. Kadangi jame buvo daug pakeitimų, skaitytojui patariama šiek tiek palaukti prieš naudojant..

Pridedamas Helmo šaltinis

Pirmasis žingsnis yra pridėti „loki“ saugyklą naudojant šią komandą:

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

Po to galite ieškoti paketų pavadinimu „loki“:

$ helm search loki

Rezultatas:

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

Šie paketai turi šias funkcijas:

  • paketas loki/loki atitinka tik Loki serverį
  • paketas loki/fluent-bit leidžia įdiegti „DaemonSet“ naudojant „fluent-bin“ žurnalams rinkti, o ne „Promtail“
  • paketas loki/promtail yra žurnalo failų rinkimo agentas
  • paketas loki/loki-stack, leidžia nedelsiant įdiegti „Loki“ kartu su „Promtail“.

„Loki“ diegimas

Norėdami įdiegti „Loki“ į „Kubernetes“, vardų erdvėje „stebėjimas“ paleiskite šią komandą:

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

Norėdami įrašyti į diską, pridėkite parametrą --set loki.persistence.enabled = true:

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

Pastaba: jei norite tuo pačiu metu įdiegti „Grafana“, pridėkite parametrą --set grafana.enabled = true

Vykdydami šią komandą turėtumėte gauti šią išvestį:

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.

Žvelgdami į ankšties būseną „stebėjimo“ vardų erdvėje, matome, kad viskas yra įdiegta:

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

Rezultatas:

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

Visos ankštys veikia. Dabar laikas atlikti keletą testų!

Prisijungimas prie Grafana

Norėdami prisijungti prie „Grafana“ pagal „Kubernetes“, turite atidaryti tunelį prie jos angos. Žemiau yra komanda atidaryti 3000 prievadą Grafana pod:

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

Kitas svarbus dalykas yra būtinybė atkurti Grafana administratoriaus slaptažodį. Slaptažodis laikomas paslaptyje loki-grafana lauke .data.admin-user base64 formatu.

Norėdami jį atkurti, turite paleisti šią komandą:

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

Naudokite šį slaptažodį kartu su numatyta administratoriaus paskyra (admin).

Loki duomenų šaltinio apibrėžimas Grafana

Pirmiausia įsitikinkite, kad Loki duomenų šaltinis buvo sukurtas (Konfigūracija/Duomenų šaltinis).
Štai pavyzdys:

Loki – rąstų rinkimas naudojant Prometėjo metodą
Loki duomenų šaltinio nustatymo pavyzdys

Spustelėję „Test“ galite patikrinti ryšį su Loki.

Prašymų pateikimas Lokiui

Dabar eikite į Grafana į skyrių „Naršyti“. Gavęs žurnalus iš konteinerių, Loki prideda metaduomenis iš Kubernetes. Taigi atsiranda galimybė peržiūrėti konkretaus konteinerio žurnalus.

Pavyzdžiui, norėdami pasirinkti reklamavimo konteinerio žurnalus, galite naudoti šią užklausą: {container_name = "promtail"}.
Čia taip pat nepamirškite pasirinkti Loki duomenų šaltinio.

Ši užklausa grąžins konteinerio veiklą taip:

Loki – rąstų rinkimas naudojant Prometėjo metodą
Užklausos rezultatas Grafana

Pridėti prie prietaisų skydelio

Pradedant nuo „Grafana 6.4“, žurnalo informaciją galite patalpinti tiesiai prietaisų skydelyje. Po to vartotojas galės greitai perjungti užklausų skaičių savo svetainėje ir programos pėdsakus.

Toliau pateikiamas informacijos suvestinės, kuri įgyvendina šią sąveiką, pavyzdys:

Loki – rąstų rinkimas naudojant Prometėjo metodą
Pavyzdinis prietaisų skydelis su Prometheus metrika ir Loki žurnalais

Lokio ateitis

Aš pradėjau naudoti Loki gegužės / birželio mėn. su 0.1 versija. Šiandien jau buvo išleista 1 ir net 1.1 ir 1.2 versija.

Reikia pripažinti, kad 0.1 versija nebuvo pakankamai stabili. Bet 0.3 jau rodė tikrus brandos ženklus, o vėlesnės versijos (0.4, paskui 1.0) šį įspūdį tik sustiprino.

Po 1.0.0 niekas negali turėti pasiteisinimo nenaudoti šio nuostabaus įrankio.

Tolesni patobulinimai turėtų būti susiję ne su „Loki“, o su jo integravimu su puikia „Grafana“. Tiesą sakant, „Grafana 6.4“ jau turi gerą integraciją su prietaisų skydeliais.

Neseniai išleista „Grafana 6.5“ dar labiau pagerina šią integraciją automatiškai atpažindama žurnalo turinį JSON formatu.

Toliau pateiktame vaizdo įraše parodytas nedidelis šio mechanizmo pavyzdys:

Loki – rąstų rinkimas naudojant Prometėjo metodą
Naudojant Grafana atskleistas Loki stygas

Galima naudoti vieną iš JSON laukų, pavyzdžiui:

  • nuorodos į išorinį įrankį
  • žurnalo turinio filtravimas

Pavyzdžiui, galite spustelėti traceId, kad patektumėte į Zipkin arba Jaeger.

Kaip įprasta, laukiame jūsų komentarų ir kviečiame tai padaryti atviras webinaras, kuriame kalbėsime apie tai, kaip DevOps pramonė vystėsi 2019 m., ir aptarsime galimus plėtros kelius 2020 m.

Šaltinis: www.habr.com