Loki — colector de log-uri, utilizând abordarea Prometheus

Salutare, comunitate! În anticiparea începerii unui nou curs „Practicile și instrumentele DevOps” v-am pregătit o traducere a unui material interesant.

Acest articol este o introducere scurtă în Loki. Proiectul Loki este susținut de Grafana și are ca scop colectarea centralizată a log-urilor (de pe servere sau containere).

Principala sursă de inspirație pentru Loki a fost Prometheus ideea de a aplica metodele sale de gestionare a log-urilor:

  • utilizarea etichetelor (labels) pentru stocarea datelor
  • consumul redus de resurse

Ne vom întoarce la principiile de funcționare ale Prometheus și vom oferi câteva exemple de utilizare a acestora în contextul Kubernetes.

Câteva cuvinte despre Prometheus

Pentru a înțelege pe deplin cum funcționează Loki, este important să facem un pas înapoi și să ne amintim puțin despre Prometheus.

Una dintre caracteristicile distinctive ale Prometheus este extragerea metricilor din punctele de colectare (prin exportoare) și salvarea acestora în TSDB (Time Series Data Base, baza de date a seriilor temporale) cu adăugarea de metadate sub formă de etichete.

De ce este necesar

În ultima vreme, Prometheus a devenit standardul de facto în lumea containerelor și Kubernetes: instalarea sa este foarte simplă, iar în clusterul Kubernetes există deja un endpoint pentru Prometheus. De asemenea, Prometheus poate extrage metrici din aplicațiile desfășurate în containere, păstrând anumite etichete. Prin urmare, monitorizarea aplicațiilor este foarte ușor de realizat.

Din păcate, nu există încă o soluție „ready to use” pentru gestionarea log-urilor, iar tu trebuie să găsești o soluție pentru tine:

  • un serviciu cloud gestionat pentru centralizarea log-urilor (AWS, Azure sau Google)
  • un serviciu de monitorizare „monitoring as a service” (de exemplu, Datadog)
  • crearea propriului serviciu de colectare a log-urilor.

Pentru a treia opțiune, am folosit în mod tradițional Elasticsearch, deși nu am fost întotdeauna mulțumit de el (în special de dificultatea și complexitatea configurării).

Loki a fost proiectat cu scopul de a simplifica implementarea conform următoarelor principii:

  • să fie ușor de început
  • să consume puține resurse
  • să funcționeze autonom fără întreținere specială
  • să servească drept complement pentru Prometheus în investigarea erorilor

Cu toate acestea, această simplitate este realizată prin anumite compromisuri. Unul dintre ele este neindexarea conținutului. Prin urmare, căutarea în text nu este foarte eficientă sau bogată și nu permite statistici relevante despre conținutul textului. Dar, deoarece Loki dorește să fie echivalentul lui grep și un complement pentru Prometheus, aceasta nu este o deficiență.

Investigarea incidentelor

Pentru a înțelege mai bine de ce Loki nu are nevoie de indexare, să ne întoarcem la metoda de investigare a incidentelor utilizată de dezvoltatorii Loki:

Loki — colector de log-uri, utilizând abordarea Prometheus
1 Alerte → 2 Tabloane de bord → 3 Interogare Adhoc → 4 Agregare de loguri → 5 Trasare distribuită → 6 Reparare!
(1 Alerte → 2 Tabloane de bord → 3 Interogare Adhoc → 4 Agregare de loguri → 5 Trasare distribuită → 6 Reparare!)

Ideea este că primim un anumit alert (Notificare Slack, SMS etc.) și după aceea:

  • ne uităm la tablourile de bord Grafana
  • ne uităm la metricile serviciilor (de exemplu, în Prometheus)
  • ne uităm la înregistrările logurilor (de exemplu, în Elasticsearch)
  • probabil că ne uităm la traseele distribuite (Jaeger, Zipkin etc.)
  • și, în final, remediem problema de bază.

Aici, în cazul stivei Grafana + Prometheus + Elasticsearch + Zipkin, va trebui să folosim patru instrumente diferite. Pentru a economisi timp, ar fi util să putem realiza toate aceste etape folosind un singur instrument: Grafana. Merită menționat că această abordare a investigației este implementată în Grafana începând cu versiunea 6. Astfel, devine posibil să accedem la datele Prometheus direct din Grafana.

Loki — colector de log-uri, utilizând abordarea Prometheus
Ecranul Explorer este împărțit între Prometheus și Loki

Pe acest ecran, puteți vizualiza logurile în Loki, corelate cu metricile Prometheus, utilizând conceptul de împărțire a ecranului. Începând cu versiunea 6.5, Grafana permite procesarea ID-ului de trasare (trace id) în înregistrările logurilor Loki pentru a naviga către instrumentele dvs. preferate de trasare distribuită (Jaeger).

Testare locală Loki

Cel mai simplu mod de a testa local Loki este să folosești docker-compose. Fișierul docker-compose se află în depozitul Loki. Puteți obține depozitul cu ajutorul următoarei comenzi: git:

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

Apoi, trebuie să mergeți în directorul de producție:

$ cd production

După aceasta, puteți obține cea mai recentă versiune a imaginilor Docker:

$ docker-compose pull

În final, stiva Loki se pornește cu următoarea comandă:

$ docker-compose up

Arhitectura Loki

Iată un mic diagramă cu arhitectura Loki:

Loki — colector de log-uri, utilizând abordarea Prometheus
Principiile arhitecturii Loki

Web client runs applications on the server, Promtail collects logs and sends them to Loki, the web client also sends metadata to Loki. Loki aggregates everything and passes it to Grafana.
Loki is running. To view the available components, execute the following command:

$ docker ps

In the case of a freshly installed Docker, the command should return the following result:

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

We see the following components:

  • Promtail: agent responsible for log centralization
  • Grafana: well-known tool for dashboards
  • Loki: data centralization daemon

In a traditional infrastructure (e.g., based on virtual machines), an agent Promtail must be deployed on each machine. Grafana and Loki can be installed on the same machine.

Deployment in Kubernetes

Installing Loki components in Kubernetes will consist of the following:

  • daemonSet to deploy the Promtail agent on each machine in the server cluster
  • deployment for Loki
  • and finally — deployment of Grafana.

Fortunately, Loki is available as a Helm package, which simplifies its deployment.

Installation via Helm

Helm should already be installed on your machine. It can be downloaded from the project's GitHub repository. It is installed by unpacking the archive corresponding to your architecture and adding helm to $PATH.

Notă: version 3.0.0 Helm was recently released. Since there have been many changes, it is recommended that the reader wait a bit before starting to use it.

Adding a source for Helm

The first step will be to add the 'loki' repository using the following command:

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

After that, you can search for packages with the name 'loki':

$ helm search loki

Rezultatul:

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

These packages have the following functionalities:

  • package loki/loki corresponds only to the Loki server
  • package loki/fluent-bit allows you to deploy DaemonSet using fluent-bit for log collection instead of Promtail
  • package loki/promtail contains the log file collection agent
  • package loki/loki-stack, allows you to deploy Loki along with Promtail at once.

Installing Loki

To deploy Loki in Kubernetes, run the following command in the 'monitoring' namespace:

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

Pentru a salva pe disc, adăugați parametrul --set loki.persistence.enabled = true:

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

Notă: dacă doriți să dezvoltați simultan Grafana, atunci adăugați parametrul --set grafana.enabled = true

Când rulați această comandă, ar trebui să obțineți următoarea ieșire:

ULTIMA CONFIGURARE: Mar, 19 Noi 2019 15:56:54
SPATIU: monitoring
STATUT: CONFIGURAT
RESURSE:
==> v1/ClusterRole
NUME VARSTA
loki-promtail-clusterrole 189z
…
NOTE:
Stiva Loki a fost configurată în clusterul dumneavoastră. Loki poate fi acum adăugat ca o sursă de date în Grafana.
Vezi <a href="http://docs.grafana.org/features/datasources/loki/">http://docs.grafana.org/features/datasources/loki/</a> pentru mai multe detalii.

Privind starea podurilor în spațiul de nume „monitoring”, vom vedea că totul a fost desfășurat:

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

Rezultatul:

NUME                 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

Toate podurile sunt pornite. Acum este timpul să facem câteva teste!

Conectarea la Grafana

Pentru a te conecta la Grafana prin Kubernetes, trebuie să deschizi un tunel către podul său. Iată comanda pentru a deschide portul 3000 pentru podul Grafana:

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

Un alt aspect important este necesitatea de a recupera parola administratorului Grafana. Parola este stocată în secret loki-grafana în câmpul .data.admin-user în format base64.

Pentru a o recupera, trebuie să executați următoarea comandă:

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

Utilizați această parolă împreună cu contul de administrator implicit (admin).

Definirea sursei de date Loki în Grafana

În primul rând, asigurați-vă că a fost creată o sursă de date Loki (Configuration / Datasource).
Iată un exemplu:

Loki — colector de log-uri, utilizând abordarea Prometheus
Exemplu de configurare a sursei de date pentru Loki

Apăsând pe „Test”, puteți verifica conexiunea cu Loki.

Formulăm cereri către Loki

Acum du-te la Grafana în secțiunea „Explore”. Când primește loguri din containere, Loki adaugă metadate din Kubernetes. Astfel, devine posibil să vezi logurile unui anumit container.

De exemplu, pentru a selecta logurile din containerul promtail, poți folosi următoarea cerere: {container_name = "promtail"}.
Aici, de asemenea, nu uitați să selectați sursa de date Loki.

Această cerere va returna activitatea containerelor în următorul format:

Loki — colector de log-uri, utilizând abordarea Prometheus
Rezultatul cererii în Grafana

Adăugarea pe tabloul de bord

Începând cu Grafana 6.4, este posibil să plasezi informațiile despre loguri direct pe tabloul de bord. După aceea, utilizatorul se va putea deplasa rapid între numărul cererilor de pe site-ul său și trasările aplicației.

Iată un exemplu de tablou de bord care implementează această interacțiune:

Loki — colector de log-uri, utilizând abordarea Prometheus
Exemplu de tablou de bord cu metrici Prometheus și jurnale Loki

Viitorul Loki

Am început să folosesc Loki în mai/iunie cu versiunea 0.1. Astăzi a fost lansată versiunea 1, iar acum avem chiar și 1.1 și 1.2.

Trebuie să recunosc că versiunea 0.1 nu a fost suficient de stabilă. Însă 0.3 a arătat deja semne reale de maturitate, iar versiunile următoare (0.4, apoi 1.0) au întărit această impresie.

După 1.0.0, nimeni nu mai poate găsi o scuză pentru a nu folosi acest instrument minunat.

Îmbunătățirile ulterioare ar trebui să se concentreze nu pe Loki, ci mai degrabă pe integrarea sa cu excelenta Grafana. De fapt, în Grafana 6.4 a apărut deja o integrare bună cu tablourile de bord.

Grafana 6.5, care a fost lansată recent, îmbunătățește și mai mult această integrare, recunoscând automat conținutul jurnalele în format JSON.

Mai jos este un scurt exemplu al acestui mecanism:

Loki — colector de log-uri, utilizând abordarea Prometheus
Utilizarea string-urilor Loki afișate în Grafana

Devine posibil să utilizați unul dintre câmpurile JSON, de exemplu, pentru:

  • linkuri către un instrument extern
  • filtrarea conținutului jurnalelor

De exemplu, puteți face clic pe traceId pentru a naviga la Zipkin sau Jaeger.

Așteptăm tradițional comentariile voastre și vă invităm la webinarul deschis, unde vom discuta despre cum a evoluat industria DevOps în 2019 și vom discuta despre posibilele direcții de dezvoltare pentru 2020.

Sursa: habr.com

Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS 🔥 Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS | ProHoster