Ahojte, Habráci! V predvečer začiatku nového zápisu na kurz sme pre vás pripravili preklad zaujímavého materiálu.
Článok je krátke úvodné slovo o Loki. Projekt Loki a je zameraný na centralizovaný zber logov (zo serverov alebo kontajnerov).
Hlavným zdrojom inšpirácie pre Loki bola myšlienka aplikácie jeho prístupov k správe logov:
- používanie štítkov (labels) na uchovávanie údajov
- nízka spotreba zdrojov
Na princípy fungovania Prometheus sa ešte vrátime a prinesieme niekoľko príkladov jeho využitia v kontexte Kubernetes.
Niekoľko slov o Prometheus
Aby ste plne porozumeli, ako funguje Loki, je dôležité urobiť krok späť a trochu si spomenúť na Prometheus.
Jednou z charakteristických čŕt Prometheus je vyťahovanie metrík z zberných bodov (prostredníctvom exportérov) a ich uloženie v TSDB (Time Series Data Base, databáza časových radov) s pridaním metadát vo forme štítkov.
Prečo to potrebujeme
V poslednej dobe sa Prometheus stal de facto štandardom v svete kontajnerov a Kubernetes: jeho inštalácia je veľmi jednoduchá a v Kubernetes klastri je od začiatku prítomný koncový bod pre Prometheus. Prometheus môže taktiež vyťahovať metriky z aplikácií nasadených v kontajneroch, pričom si zachováva určité štítky. Preto je monitoring aplikácií veľmi jednoduchý na realizáciu.
Nanešťastie, stále neexistuje „na kľúč“ riešenie na správu logov, takže si musíte nájsť vlastné riešenie:
- riadená cloudová služba na centralizáciu logov (AWS, Azure alebo Google)
- monitorovací servis „monitoring ako služba“ (monitoring as a service) (napríklad Datadog)
- vytvorenie vlastnej služby zberu logov.
Pre tretiu možnosť som tradične používal Elasticsearch, aj keď som nebol vždy spokojný (najmä s jeho náročnosťou a zložitostí nastavenia).
Loki bol navrhnutý s cieľom zjednodušiť implementáciu v súlade s nasledujúcimi princípmi:
- byť jednoduchý na začiatok
- spotrebovať málo zdrojov
- fungovať samostatne bez akejkoľvek špeciálnej údržby
- slúžiť ako doplnok k Prometheus na pomoc pri zisťovaní chýb
Toto zjednodušenie však prichádza na úkor niektorých kompromisov. Jedným z nich je neindexovať obsah. Preto hľadanie v texte nie je veľmi efektívne alebo rozsiahle a neumožňuje aplikačnú štatistiku textového obsahu. Avšak, keďže Loki sa chce stať ekvivalentom grep a doplnkom k Prometheovi, nie je to nedostatok.
Vyšetrovanie incidentov
Aby sme lepšie pochopili, prečo Loki nepotrebuje indexáciu, vráťme sa k metóde vyšetrovania incidentov, ktorú používali vývojári Loki:

1 Upozornenie → 2 Dashboard → 3 Adhoc dotaz → 4 Agregácia logov → 5 Distribuované trasovanie → 6 Opravené!
(1 Upozornenie → 2 Dashboard → 3 Adhoc dotaz → 4 Agregácia logov → 5 Distribuované trasovanie → 6 Opravené!)
Myšlienka spočíva v tom, že dostaneme nejaké upozornenie (Slack notifikácia, SMS a pod.) a potom:
- pozeráme sa na dashboardy Grafana
- pozeráme sa na metriky služieb (napríklad v Prometheovi)
- pozeráme sa na záznamy logov (napríklad v Elasticsearch)
- možno sa pozrieme na distribuované trasy (Jaeger, Zipkin a pod.)
- a nakoniec opravíme pôvodný problém.
Tu, v prípade stacku Grafana + Prometheus + Elasticsearch + Zipkin, bude potrebné použiť štyri rôzne nástroje. Aby sme skrátili čas, bolo by dobré mať možnosť vykonávať všetky tieto kroky pomocou jedného nástroja: Grafana. Je potrebné poznamenať, že takýto prístup k vyšetrovaniu bol implementovaný v Grafane od verzie 6. Týmto spôsobom je možné získavať dáta z Prometheusa priamo z Grafany.

Obrazovka Explorer je rozdelená medzi Prometheus a Loki
Na tejto obrazovke môžete vidieť logy v Loki, ktoré sú spojené s metrikami Prometheus pomocou konceptu rozdelenia obrazovky. Od verzie 6.5, Grafana umožňuje spracovávať identifikátor trasy (trace id) v záznamoch logov Loki na prepojenie s vašimi obľúbenými nástrojmi distribuovaného trasovania (Jaeger).
Lokálne testovanie Loki
Najjednoduchší spôsob, ako lokálne testovať Loki, je použiť docker-compose. Súbor docker-compose sa nachádza v repozitári Loki. Získať repozitár môžete pomocou nasledujúceho príkazu git:
$ git clone https://github.com/grafana/loki.gitPotom musíte prejsť do adresára production:
$ cd productionPotom môžete získať najnovšiu verziu Docker obrazov:
$ docker-compose pullNakoniec sa stack Loki spúšťa nasledujúcim príkazom:
$ docker-compose upArchitektúra Loki
Tu je malá schéma s architektúrou Loki:

Princípy architektúry Loki
Webový klient spúšťa aplikácie na serveri, Promtail zhromažďuje logy a posiela ich do Loki, webový klient tiež odosiela metadáta do Loki. Loki všetko agreguje a posiela do Grafany.
Loki je spustený. Na zobrazenie existujúcich komponentov zadajte nasledujúci príkaz:
$ docker psAk máte čerstvo nainštalovaný Docker, príkaz by mal vrátiť nasledujúci výsledok:
OBRÁZOK PORTY NÁZVY
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_1Vidíme nasledujúce komponenty:
- Promtail: agent zodpovedný za centralizáciu logov
- Grafana: známy nástroj pre dashboards
- Loki: démon centralizácie dát
V rámci klasickej infraštruktúry (napríklad na báze virtuálnych strojov) musí byť na každom počítači nasadený agent Promtail. Grafana a Loki môžu byť nainštalované na jednom počítači.
Nasadenie v Kubernetes
Inštalácia komponentov Loki v Kubernetes bude pozostávať z nasledovného:
- daemonSet na nasadenie agenta Promtail na každom z počítačov v klastru serverov
- nasadenie (Deployment) Loki
- a nakoniec - nasadenie Grafany.
Našťastie, Loki je dostupný vo forme balíka Helm, čo zjednodušuje jeho nasadenie.
Inštalácia cez Helm
Helm by ste už mali mať nainštalovaný. Môžete si ho stiahnuť z GitHub-repozitára projektu. Nainštaluje sa rozbalením archívu, ktorý zodpovedá vašej architektúre, a pridaním helm do $PATH.
Poznámka: verzia 3.0.0 Helm bola nedávno vydaná. Keďže v nej došlo k mnohým zmenám, čitateľovi sa odporúča chvíľu počkať, kým ju začne používať.
Pridanie zdroja pre Helm
Prvým krokom bude pridanie repozitára "loki" pomocou nasledujúceho príkazu:
$ helm add loki https://grafana.github.io/loki/chartsPotom je možné vyhľadávať balíky s názvom "loki":
$ helm search lokiVýsledok:
loki/loki 0.17.2 v0.4.0 Loki: ako Prometheus, ale pre logy.
loki/loki-stack 0.19.1 v0.4.0 Loki: ako Prometheus, ale pre logy.
loki/fluent-bit 0.0.2 v0.0.1 Používa fluent-bit Loki go plugin pre...
loki/promtail 0.13.1 v0.4.0 Zodpovedný za zhromažďovanie logov a...Tieto balíky majú nasledujúce funkcie:
- balík loki/loki zodpovedá len serveru Loki
- balík loki/fluent-bit umožňuje vám nasadiť DaemonSet, využívajúc fluent-bit na zhromažďovanie logov namiesto Promtail
- balík loki/promtail obsahuje agent pre zhromažďovanie logov
- balík loki/loki-stack, umožňuje okamžité nasadenie Loki spolu s Promtail.
Inštalácia Loki
Aby ste nasadili Loki v Kubernetes, zadajte nasledujúci príkaz v priestore názvov "monitoring":
$ helm upgrade --install loki loki/loki-stack --namespace monitoringAk 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=truePoznámka: ak chcete nasadiť aj Grafana, pridajte parameter
--set grafana.enabled = true
Pri spustení tejto príkazu by ste mali dostať nasledujúci výstup:
NAHRAZOVANÉ: Ut 19. novembra 2019 15:56:54
MIESTO: monitoring
STAV: NAHRANÉ
ZDROJE:
==> v1/ClusterRole
NÁZOV VEK
loki-promtail-clusterrole 189d
…
POZNÁMKY:
Stack Loki bol nasadený do vášho clusteru. Loki môže byť teraz pridaný ako zdroj údajov v Grafana.
Pozrite sa <a href="http://docs.grafana.org/features/datasources/loki/">http://docs.grafana.org/features/datasources/loki/</a> na ďalšie podrobnosti.Keď sa pozrieme na stav podov v namespace “monitoring”, uvidíme, že všetko je nasadené:
$ kubectl -n monitoring get pods -l release=lokiVý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 24mVšetky podi sú spustené. Teraz je čas vykonať niekoľko testov!
Pripojenie k Grafana
Aby ste sa mohli pripojiť k Grafana cez Kubernetes, musíte otvoriť tunel k jeho podu. Nižšie je uvedený príkaz na otvorenie portu 3000 pre pod Grafana:
$ kubectl -n port-forward monitoring svc/loki-grafana 3000:80Ďalším dôležitým bodom je potreba obnoviť heslo administrátora Grafana. Heslo sa uchováva v tajomstvo loki-grafana v poli .data.admin-user vo formáte base64.
Na jeho obnovenie je potrebné vykonať nasledujúci príkaz:
$ kubectl -n monitoring get secret loki-grafana
--template '{{index .data "admin-password" | base64decode}}'; echoPoužite toto heslo spolu s predvoleným účtom správcu (admin).
Definícia zdroja údajov Loki v Grafana
Najprv sa uistite, že je vytvorený zdroj údajov Loki (Configuration / Datasource).
Tu je príklad:

Príklad nastavenia zdroja údajov pre Loki
Kliknutím na “Test” môžete overiť pripojenie k Loki.
Vykonávame dotazy na Loki
Teraz prejdite do Grafana do sekcie “Explore”. Pri prijímaní logov z kontajnerov Loki pridáva metadáta z Kubernetes. Takto je možné prezerať logy konkrétneho kontajnera.
Napríklad na výber logov kontajnera promtail môžete použiť nasledujúci dotaz: {container_name = "promtail"}.
Tu nezabudnite vybrať zdroj údajov Loki.
Tento dotaz vráti aktivitu kontajnerov v nasledujúcom formáte:

Výsledok dotazu v Grafana
Pridanie na dashboard
Od verzie Grafana 6.4 je možné umiestniť informácie o logoch priamo na dashboard. Po tom bude mať používateľ možnosť rýchlo prechádzať medzi počtom dotazov na jeho stránke a trasami aplikácie.
Nižšie je uvedený príklad dashboardu, ktorý realizuje toto prepojenie:

Ukážka dashboardu s metrikami Prometheus a logmi Loki
Budúcnosť Loki
Začal som používať Loki ešte v máji/júni s verziou 0.1. Dnes je už vydaná verzia 1 a dokonca aj 1.1 a 1.2.
Treba uznať, že verzia 0.1 nebola dostatočne stabilná. Ale 0.3 už vykazovala reálne známky zrelosti a ďalšie verzie (0.4, potom 1.0) len posilnili tento dojem.
Po verzii 1.0.0 už nemôže nikto mať ospravedlnenia, aby nepoužíval tento vynikajúci nástroj.
Ďalšie vylepšenia by sa mali týkať nie Loki, ale skôr jeho integrácie s výnimočnou Grafana. Vlastne, v Grafana 6.4 už existuje dobrá integrácia s dashboardmi.
Grafana 6.5, ktorá bola nedávno vydaná, ešte viac zlepšuje túto integráciu, automaticky rozpoznávajúc obsah logov vo formáte JSON.
Nižšie v videu je uvedený malý príklad tohto mechanizmu:

Používanie riadkov Loki zobrazených v Grafana
Stáva sa možné použiť jedno z polí JSON, napríklad na:
- odkaz na externý nástroj
- filtrovanie obsahu logov
Napríklad, môžete kliknúť na traceId, aby ste prešli na Zipkin alebo Jaeger.
Tradične očakávame vaše komentáre a pozývame vás na , kde sa porozprávame o tom, ako sa vyvíjala DevOps-odvetvie počas roku 2019 a prediskutujeme možné cesty rozvoja na rok 2020.
Zdroj: habr.com
