Loki - prikupljanje trupaca korištenjem Prometejevog pristupa

Pozdrav, Khabrovci! U iščekivanju početka novog upisa za kurs "DevOps prakse i alati" pripremio za vas prijevod zanimljivog materijala.

Ovaj članak je kratak uvod u Lokija. Projekt Loki koju podržava Grafana i ima za cilj centralizirano prikupljanje dnevnika (sa servera ili kontejnera).

Glavna inspiracija za Lokija bila je Prometej sa idejom da primijeni svoje pristupe upravljanju dnevnikom:

  • korištenje naljepnica za pohranjivanje podataka
  • niska potrošnja resursa

Vratićemo se principima Prometeja i dati neke primere njegove upotrebe u kontekstu Kubernetesa.

Nekoliko riječi o Prometeju

Da biste u potpunosti razumjeli kako Loki funkcionira, važno je napraviti korak unatrag i malo se vratiti Prometeju.

Jedna od karakterističnih karakteristika Prometheusa je ekstrakcija metrike iz tačaka prikupljanja (preko eksportera) i njihovo pohranjivanje u TSDB (Baza podataka vremenskih serija, baza podataka vremenskih serija) uz dodavanje metapodataka u obliku oznaka.

Zašto je to potrebno

Nedavno je Prometheus postao de facto standard u svijetu kontejnera i Kubernetesa: njegova instalacija je vrlo jednostavna, a Kubernetes klaster u početku ima krajnju tačku za Prometheus. Prometheus također može izvući metriku iz aplikacija raspoređenih u kontejneru uz održavanje određenih oznaka. Stoga je praćenje aplikacija vrlo lako implementirati.

Nažalost, još uvijek ne postoji rješenje po principu ključ u ruke za upravljanje dnevnikom i morate sami pronaći rješenje:

  • upravljana usluga u oblaku za centralizaciju dnevnika (AWS, Azure ili Google)
  • usluga praćenja "monitoring kao usluga" (na primjer, Datadog)
  • kreiranje vlastite usluge prikupljanja dnevnika.

Za treću opciju, tradicionalno sam koristio Elasticsearch, uprkos činjenici da nisam uvijek bio zadovoljan njime (naročito zbog njegove težine i složenosti podešavanja).

Loki je dizajniran da se lako implementira prema sljedećim principima:

  • biti lak za početak
  • troše malo resursa
  • rade samostalno bez ikakvog posebnog održavanja
  • služe kao dodatak za Prometheus za pomoć u istraživanju grešaka

Međutim, ova jednostavnost dolazi na račun nekih kompromisa. Jedna od njih je da se sadržaj ne indeksira. Stoga pretraživanje teksta nije previše efikasno niti bogato i ne dozvoljava vam da vodite statistiku o sadržaju teksta. Ali budući da Loki želi biti grep ekvivalent i dopuna Prometeju, to nije nedostatak.

Istraga incidenta

Da bismo bolje razumjeli zašto Lokiju nije potrebno indeksiranje, vratimo se na metodu istrage incidenta koju koriste Loki programeri:

Loki - prikupljanje trupaca korištenjem Prometejevog pristupa
1 Upozorenje → 2 Kontrolna tabla → 3 Adhoc upit → 4 Agregacija dnevnika → 5 Distribuirano praćenje → 6 Popravi!
(1 Upozorenje → 2 Kontrolna tabla → 3 Adhoc upit → 4 Agregacija dnevnika → 5 Distribuirano praćenje → 6 Popravi!)

Ideja je da dobijemo neku vrstu upozorenja (Slack Notification, SMS, itd.) i nakon toga:

  • pogledajte Grafana kontrolne table
  • pogledajte metriku usluge (na primjer, u Prometheusu)
  • pogledajte unose u dnevniku (na primjer, u Elasticsearch)
  • možda pogledajte distribuirane tragove (Jaeger, Zipkin, itd.)
  • i konačno riješiti originalni problem.

Ovdje, u slučaju Grafana + Prometheus + Elasticsearch + Zipkin stack, morat ćete koristiti četiri različita alata. Da biste uštedjeli vrijeme, bilo bi dobro da sve ove korake možete obaviti jednim alatom: Grafanom. Vrijedi napomenuti da je ovaj pristup istraživanju implementiran u Grafani od verzije 6. Dakle, postaje moguć pristup podacima Prometheusa direktno iz Grafane.

Loki - prikupljanje trupaca korištenjem Prometejevog pristupa
Ekran Explorera podijeljen između Prometeja i Lokija

Na ovom ekranu možete vidjeti zapise u Lokiju koji se odnose na Prometheus metriku koristeći koncept podijeljenog ekrana. Od verzije 6.5, Grafana vam omogućava da raščlanite ID praćenja u Loki log unosima kako biste pratili veze do vaših omiljenih distribuiranih alata za praćenje (Jaeger).

Loki test

Najlakši način za lokalno testiranje Lokija je korištenje docker-compose. Docker-compose datoteka se nalazi u Loki spremištu. Možete dobiti spremište sa sljedećom komandom git:

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

Zatim morate prijeći na proizvodni direktorij:

$ cd production

Nakon toga, možete dobiti najnovije Docker slike:

$ docker-compose pull

Konačno, Loki stack se pokreće sljedećom naredbom:

$ docker-compose up

Loki arhitektura

Evo malog dijagrama Loki arhitekture:

Loki - prikupljanje trupaca korištenjem Prometejevog pristupa
Loki Architecture Principles

Web klijent pokreće aplikacije na serveru, Promtail prikuplja logove i šalje ih Lokiju, web klijent takođe šalje metapodatke Lokiju. Loki sve skuplja i prosljeđuje Grafani.
Loki trči. Da vidite dostupne komponente, pokrenite sljedeću naredbu:

$ docker ps

U slučaju svježe instaliranog Dockera, naredba bi trebala vratiti sljedeći 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 sledeće komponente:

  • Promtail: agent odgovoran za centralizaciju dnevnika
  • Grafana: poznati alat za kontrolnu tablu
  • Loki: demon centralizacije podataka

Kao dio klasične infrastrukture (na primjer, baziran na virtuelnim mašinama), Promtail agent mora biti raspoređen na svakoj mašini. Grafana i Loki se mogu instalirati na istu mašinu.

Postavljanje na Kubernetes

Instaliranje Loki komponenti u Kubernetes će biti kako slijedi:

  • daemonSet za postavljanje Promtail agenta na svaku od mašina u klasteru servera
  • Loki Deployment
  • a posljednja je raspoređivanje Grafane.

Srećom, Loki je dostupan kao Helm paket, što ga čini lakim za implementaciju.

Instalacija preko Heml

Trebalo bi da već imate instaliran Heml. Može se preuzeti sa GitHub repozitorija projekta. Instalira se ekstrahiranjem arhive koja odgovara vašoj arhitekturi i dodavanjem kormila $PATH.

Napomena: verzija 3.0.0 Helma je nedavno objavljena. S obzirom da je u njemu došlo do mnogih izmjena, čitatelju se savjetuje da malo pričeka prije nego što ga počne koristiti..

Dodavanje izvora za Helm

Prvi korak je dodavanje "loki" spremišta sa sljedećom naredbom:

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

Nakon toga možete tražiti pakete pod nazivom “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...

Ovi paketi imaju sljedeće karakteristike:

  • пакет loki/loki odgovara samo Loki serveru
  • пакет loki/fluent-bit omogućava vam da implementirate DaemonSet koristeći fluent-bin za prikupljanje dnevnika umjesto Promtaila
  • пакет loki/promtail sadrži agenta za prikupljanje dnevnika
  • пакет loki/loki-stack, omogućava vam da odmah rasporedite Loki zajedno s Promtailom.

Instaliranje Lokija

Da postavite Loki na Kubernetes, pokrenite sljedeću naredbu u imenskom prostoru "nadgledanje":

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

Za spremanje na disk dodajte opciju --set loki.persistence.enabled = true:

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

Napomena: ako želite istovremeno implementirati Grafanu, dodajte parametar --set grafana.enabled = true

Kada pokrenete ovu naredbu, trebali biste dobiti sljedeći izlaz:

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.

Gledajući stanje podova u imenskom prostoru "nadgledanje", možemo vidjeti da je sve raspoređeno:

$ 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

Sve mahune rade. Sada je vrijeme da uradite neke testove!

Povezivanje na Grafanu

Da biste se povezali na Grafanu pod Kubernetesom, morate otvoriti tunel do njenog pod-a. Slijedi naredba za otvaranje porta 3000 za Grafana pod:

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

Još jedna važna stvar je potreba za oporavkom Grafana administratorske lozinke. Lozinka se čuva u tajnosti loki-grafana na terenu .data.admin-user u base64 formatu.

Da biste ga vratili, morate pokrenuti sljedeću naredbu:

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

Koristite ovu lozinku zajedno sa podrazumevanim administratorskim nalogom (admin).

Loki definicija izvora podataka u Grafani

Prije svega, provjerite je li izvor podataka Loki (Konfiguracija / Izvor podataka) kreiran.
Evo primjera:

Loki - prikupljanje trupaca korištenjem Prometejevog pristupa
Primjer postavljanja izvora podataka za Loki

Klikom na “Test” možete testirati vezu sa Lokijem.

Upućivanje zahtjeva Lokiju

Sada idite na Grafanu i idite na odjeljak "Istraži". Kada prima dnevnike iz kontejnera, Loki dodaje metapodatke iz Kubernetesa. Tako postaje moguće pregledati dnevnike određenog kontejnera.

Na primjer, da odaberete dnevnike kontejnera promtail, možete koristiti sljedeći upit: {container_name = "promtail"}.
Ne zaboravite i ovdje odabrati Loki izvor podataka.

Ovaj upit će vratiti aktivnost kontejnera na sljedeći način:

Loki - prikupljanje trupaca korištenjem Prometejevog pristupa
Rezultat upita u Grafani

Dodavanje na kontrolnu tablu

Počevši od Grafane 6.4, moguće je staviti podatke dnevnika direktno na kontrolnu tablu. Nakon toga, korisnik će moći brzo prelaziti između broja zahtjeva na svojoj web stranici i praćenja aplikacija.

Ispod je primjer kontrolne ploče koja implementira ovu interakciju:

Loki - prikupljanje trupaca korištenjem Prometejevog pristupa
Uzorak kontrolne ploče s Prometheus metrikom i Loki zapisnicima

Budućnost Lokija

Počeo sam koristiti Loki još u svibnju/lipnju sa verzijom 0.1. Danas je već objavljena verzija 1, pa čak i 1.1 i 1.2.

Mora se priznati da verzija 0.1 nije bila dovoljno stabilna. Ali 0.3 je već pokazivao stvarne znake zrelosti, a sljedeće verzije (0.4, zatim 1.0) su samo pojačale ovaj utisak.

Nakon 1.0.0, niko ne može imati izgovor da ne koristi ovu divnu alatku.

Dalja poboljšanja ne bi se trebala odnositi na Loki, već na njegovu integraciju s odličnom Grafanom. U stvari, Grafana 6.4 već ima dobru integraciju sa kontrolnim tablama.

Grafana 6.5, koja je nedavno objavljena, dodatno poboljšava ovu integraciju automatskim prepoznavanjem sadržaja dnevnika u JSON formatu.

Video ispod prikazuje mali primjer ovog mehanizma:

Loki - prikupljanje trupaca korištenjem Prometejevog pristupa
Korištenje Loki nizova prikazanih u Grafani

Postaje moguće koristiti jedno od JSON polja, na primjer, za:

  • veze do vanjskog alata
  • filtriranje sadržaja dnevnika

Na primjer, možete kliknuti na traceId da biste otišli na Zipkin ili Jaeger.

Kao i obično, radujemo se vašim komentarima i pozivamo vas otvoreni webinar, gdje ćemo razgovarati o tome kako se DevOps industrija razvijala tokom 2019. i razgovarati o mogućim putevima razvoja za 2020. godinu.

izvor: www.habr.com