Loki - zber logov pomocou prístupu Prometheus

Pozdravte, obyvatelia Chabrovska! V predvečer začiatku nového zápisu do kurzu "Postupy a nástroje DevOps" Pripravili sme pre vás preklad zaujímavého materiálu.

Tento článok je krátkym úvodom do Lokiho. Projekt Loki podporuje Grafana a je zameraný na centralizovaný zber protokolov (zo serverov alebo kontajnerov).

Hlavnou inšpiráciou pre Lokiho bol Prometheus s myšlienkou uplatniť jeho prístupy k správe protokolov:

  • používanie štítkov na ukladanie údajov
  • spotreba malého množstva zdrojov

Vrátime sa k tomu, ako Prometheus funguje a uvedieme niekoľko príkladov jeho použitia v kontexte Kubernetes.

Pár slov o Prometheovi

Aby ste úplne pochopili, ako Loki funguje, je dôležité urobiť krok späť a zapamätať si niečo o Prometheovi.

Jednou z charakteristických čŕt Prometheus je extrakcia metrík zo zberných miest (prostredníctvom exportérov) a ich ukladanie do TSDB (Time Series Data Base) s pridaním metadát vo forme štítkov.

Prečo to potrebujete

V poslednej dobe sa Prometheus stal de facto štandardom vo svete kontajnerov a Kubernetes: jeho inštalácia je veľmi jednoduchá a klaster Kubernetes prichádza s natívnym koncovým bodom pre Prometheus. Prometheus môže tiež extrahovať metriky z aplikácií nasadených v kontajneri pri ukladaní konkrétnych štítkov. Preto je implementácia monitorovania aplikácií veľmi jednoduchá.

Bohužiaľ, stále neexistuje riešenie na kľúč pre správu protokolov a riešenie si musíte nájsť sami:

  • spravovaná cloudová služba na centralizáciu protokolov (AWS, Azure alebo Google)
  • monitorovacia služba „monitorovanie ako služba“ (napríklad Datadog)
  • vytvorenie vlastnej služby zberu protokolov.

Pre tretiu možnosť som už tradične použil Elasticsearch, napriek tomu, že som s ním nebol vždy spokojný (najmä jeho ťažkosť a zložitosť konfigurácie).

Loki bol navrhnutý tak, aby zjednodušil implementáciu podľa nasledujúcich princípov:

  • byť jednoduché začať
  • spotrebúvajú málo zdrojov
  • pracovať samostatne bez špeciálnej údržby
  • slúži ako doplnok k Prometheus na pomoc pri vyšetrovaní chýb

Táto jednoduchosť však ide na úkor niektorých kompromisov. Jedným z nich je neindexovať obsah. Textové vyhľadávanie preto nie je veľmi efektívne ani bohaté a neumožňuje štatistiku obsahu textu. Ale keďže Loki chce byť ekvivalentom grepu a doplnkom Promethea, nie je to nevýhoda.

Vyšetrovanie incidentov

Aby sme lepšie pochopili, prečo Loki nepotrebuje indexovanie, vráťme sa k metóde vyšetrovania incidentov, ktorú vývojári Loki použili:

Loki - zber logov pomocou prístupu Prometheus
1 Upozornenie → 2 Ovládací panel → 3 Adhoc dotaz → 4 Agregácia denníka → 5 Distribuované sledovanie → 6 Oprava!
(1 Upozornenie → 2 Dashboard → 3 Adhoc dotaz → 4 Agregácia protokolov → 5 Distribuované sledovanie → 6 Oprava!)

Ide o to, že dostaneme nejaký druh upozornenia (Slack Notification, SMS atď.) a potom:

  • pozrite sa na prístrojové dosky Grafana
  • pozrite sa na metriky služieb (napríklad v Prometheus)
  • pozrite si záznamy denníka (napríklad v Elasticsearch)
  • možno sa pozrite na distribuované stopy (Jaeger, Zipkin atď.)
  • a konečne vyriešiť pôvodný problém.

Tu v prípade zásobníka Grafana + Prometheus + Elasticsearch + Zipkin budete musieť použiť štyri rôzne nástroje. Ak chcete skrátiť čas, bolo by pekné, keby ste mohli vykonávať všetky tieto kroky pomocou jedného nástroja: Grafana. Stojí za zmienku, že tento prístup k výskumu je implementovaný v Grafane od verzie 6. Takto je možné pristupovať k údajom Prometheus priamo z Grafany.

Loki - zber logov pomocou prístupu Prometheus
Obrazovka Prieskumníka rozdelená medzi Promethea a Lokiho

Na tejto obrazovke si môžete prezerať denníky Loki súvisiace s metrikami Prometheus pomocou konceptu rozdelenej obrazovky. Od verzie 6.5 vám Grafana umožňuje analyzovať ID sledovania v záznamoch denníka Loki a sledovať odkazy na vaše obľúbené distribuované nástroje na sledovanie (Jaeger).

Loki test

Najjednoduchší spôsob, ako otestovať Loki lokálne, je použiť docker-compose. Súbor docker-compose sa nachádza v úložisku Loki. Úložisko môžete získať pomocou nasledujúceho príkazu git:

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

Potom musíte prejsť do výrobného adresára:

$ cd production

Potom môžete získať najnovšiu verziu obrázkov Docker:

$ docker-compose pull

Nakoniec sa Loki stack spustí nasledujúcim príkazom:

$ docker-compose up

Loki architektúra

Tu je malý diagram s architektúrou Loki:

Loki - zber logov pomocou prístupu Prometheus
Princípy architektúry Loki

Webový klient spúšťa aplikácie na serveri, Promtail zbiera logy a posiela ich Lokimu, webový klient posiela Lokimu aj metadáta. Loki všetko agreguje a prenáša do Grafany.
Loki je spustený. Ak chcete zobraziť dostupné komponenty, spustite nasledujúci príkaz:

$ docker ps

V prípade čerstvo nainštalovaného Dockera by mal príkaz vrátiť nasledujúci výsledok:

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

Vidíme nasledujúce komponenty:

  • Promtail: agent zodpovedný za centralizáciu protokolov
  • Grafana: slávny nástroj palubnej dosky
  • Loki: Démon centralizácie údajov

V rámci klasickej infraštruktúry (napríklad založenej na virtuálnych strojoch) musí byť na každom stroji nasadený agent Promtail. Grafana a Loki je možné nainštalovať na rovnaký stroj.

Nasadenie do Kubernetes

Inštalácia komponentov Loki na Kubernetes bude nasledovná:

  • daemonSet na nasadenie agenta Promtail na každom z počítačov v klastri serverov
  • Nasadenie Loki
  • a poslednou je nasadenie Grafana.

Našťastie je Loki k dispozícii ako balík Helm, čo uľahčuje jeho nasadenie.

Inštalácia cez Heml

Už by ste mali mať nainštalovaný Heml. Dá sa stiahnuť z úložiska GitHub projektu. Inštaluje sa rozbalením archívu zodpovedajúceho vašej architektúre a pridaním kormidla $PATH.

Poznámka: Verzia 3.0.0 Helm bola vydaná nedávno. Keďže došlo k mnohým zmenám, čitateľovi sa odporúča chvíľu počkať, kým ho použije..

Pridanie zdroja pre Helm

Prvým krokom je pridanie úložiska „loki“ pomocou nasledujúceho príkazu:

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

Potom môžete vyhľadať balíčky s názvom „loki“:

$ helm search loki

Výsledok:

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

Tieto balíčky majú nasledujúce vlastnosti:

  • balenia loki/loki zodpovedá iba serveru Loki
  • balenia loki/fluent-bit umožňuje nasadiť DaemonSet pomocou fluent-bin na zhromažďovanie protokolov namiesto Promtail
  • balenia loki/promtail obsahuje agenta zberu protokolových súborov
  • balenia loki/loki-stack, umožňuje okamžite nasadiť Lokiho spolu s Promtailom.

Inštalácia Lokiho

Ak chcete nasadiť Loki do Kubernetes, spustite nasledujúci príkaz v priestore názvov „monitorovanie“:

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

Ak chcete uložiť na disk, pridajte parameter --set loki.persistence.enabled = true:

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

Poznámka: ak chcete súčasne nasadiť aj Grafana, tak pridajte parameter --set grafana.enabled = true

Keď spustíte tento príkaz, mali by ste dostať nasledujúci výstup:

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.

Pri pohľade na stav modulov v mennom priestore „monitorovania“ vidíme, že všetko je nasadené:

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

Výsledok:

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

Všetky moduly bežia. Teraz je čas urobiť nejaké testy!

Pripája sa k Grafane

Ak sa chcete pripojiť k Grafane pod Kubernetes, musíte otvoriť tunel do jej modulu. Nižšie je uvedený príkaz na otvorenie portu 3000 pre grafana pod:

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

Ďalším dôležitým bodom je potreba obnoviť heslo správcu Grafana. Heslo je utajené loki-grafana v poli .data.admin-user vo formáte base64.

Ak ho chcete obnoviť, musíte spustiť nasledujúci príkaz:

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

Toto heslo použite v spojení s predvoleným účtom správcu (admin).

Definovanie zdroja údajov Loki v Grafane

Najprv sa uistite, že bol vytvorený zdroj údajov Loki (Konfigurácia/Zdroj údajov).
Tu je príklad:

Loki - zber logov pomocou prístupu Prometheus
Príklad nastavenia zdroja údajov pre Lokiho

Kliknutím na „Test“ môžete skontrolovať spojenie s Lokim.

Podávanie žiadostí Lokimu

Teraz prejdite na Grafana do sekcie „Preskúmať“. Pri prijímaní protokolov z kontajnerov Loki pridáva metadáta z Kubernetes. Takto je možné prezerať denníky konkrétneho kontajnera.

Ak chcete napríklad vybrať protokoly kontajnera promtail, môžete použiť nasledujúci dotaz: {container_name = "promtail"}.
Tu tiež nezabudnite vybrať zdroj údajov Loki.

Tento dotaz vráti aktivitu kontajnera takto:

Loki - zber logov pomocou prístupu Prometheus
Výsledok dotazu v Grafane

Pridať na informačný panel

Počnúc verziou Grafana 6.4 môžete informácie denníka umiestniť priamo na palubnú dosku. Potom bude môcť používateľ rýchlo prepínať medzi počtom požiadaviek na svojej stránke a sledovaním aplikácie.

Nižšie je uvedený príklad dashboardu, ktorý implementuje túto interakciu:

Loki - zber logov pomocou prístupu Prometheus
Vzorový informačný panel s metrikami Prometheus a protokolmi Loki

Lokiho budúcnosť

Loki som začal používať už v máji/júni s verziou 0.1. Dnes už bola vydaná verzia 1 a dokonca aj 1.1 a 1.2.

Treba priznať, že verzia 0.1 nebola dostatočne stabilná. Ale už 0.3 vykazovala skutočné známky zrelosti a následné verzie (0.4, potom 1.0) tento dojem len posilnili.

Po 1.0.0 už nikto nemôže mať žiadne ospravedlnenie, aby nepoužil tento úžasný nástroj.

Ďalšie vylepšenia by sa nemali týkať Lokiho, ale skôr jeho integrácie s vynikajúcou Grafanou. V skutočnosti má Grafana 6.4 už dobrú integráciu s dashboardmi.

Grafana 6.5, ktorá bola nedávno vydaná, ďalej zlepšuje túto integráciu automatickým rozpoznávaním obsahu protokolu vo formáte JSON.

Video nižšie ukazuje malý príklad tohto mechanizmu:

Loki - zber logov pomocou prístupu Prometheus
Pomocou Loki strún vystavených v Grafane

Je možné použiť jedno z polí JSON, napríklad pre:

  • odkazy na externý nástroj
  • filtrovanie obsahu denníka

Môžete napríklad kliknúť na traceId a prejsť na Zipkin alebo Jaeger.

Ako obvykle, tešíme sa na vaše komentáre a pozývame vás otvorený webinár, kde budeme hovoriť o tom, ako sa odvetvie DevOps vyvíjalo počas roku 2019 a diskutovať o možných cestách vývoja pre rok 2020.

Zdroj: hab.com