Loki - sbírání protokolů pomocí přístupu Prometheus

Zdravím vás, Khabrovite! V očekávání zahájení nového zápisu do kurzu "Postupy a nástroje DevOps" pro vás připravil překlad zajímavého materiálu.

Tento článek je stručným představením Lokiho. Projekt Loki podporovaný Grafana a je zaměřen na centralizovaný sběr protokolů (ze serverů nebo kontejnerů).

Hlavní inspirací pro Lokiho byl Prometheus s myšlenkou uplatnit jeho přístupy ke správě protokolů:

  • pomocí štítků k ukládání dat
  • nízká spotřeba zdrojů

Vrátíme se k principům Promethea a uvedeme několik příkladů jeho použití v kontextu Kubernetes.

Pár slov o Prometheovi

Abyste plně pochopili, jak Loki funguje, je důležité udělat krok zpět a trochu se vrátit k Prometheovi.

Jednou z charakteristických vlastností Prometheus je extrakce metrik ze sběrných míst (prostřednictvím exportérů) a jejich ukládání do TSDB (databáze časových řad, databáze časových řad) s přidáním metadat ve formě štítků.

Proč je to nutné

V poslední době se Prometheus stal de facto standardem ve světě kontejnerů a Kubernetes: jeho instalace je velmi jednoduchá a cluster Kubernetes má zpočátku koncový bod pro Prometheus. Prometheus může také extrahovat metriky z aplikací nasazených v kontejneru při zachování specifických štítků. Monitorování aplikací je proto velmi snadné implementovat.

Bohužel stále neexistuje řešení na klíč pro správu protokolů a řešení si musíte najít sami:

  • spravovaná cloudová služba pro centralizaci protokolů (AWS, Azure nebo Google)
  • monitorovací služba „monitorování jako služba“ (například Datadog)
  • vytvoření vlastní služby sběru protokolů.

Pro třetí možnost jsem již tradičně použil Elasticsearch, přestože jsem s ním nebyl vždy spokojen (zejména jeho náročnost a složitost nastavení).

Loki byl navržen tak, aby se dal snadno implementovat podle následujících zásad:

  • být snadné začít
  • spotřebovávat málo zdrojů
  • pracovat samostatně bez zvláštní údržby
  • slouží jako doplněk k Prometheus, který pomáhá s vyšetřováním chyb

Tato jednoduchost však jde na úkor některých kompromisů. Jedním z nich je neindexovat obsah. Textové vyhledávání proto není příliš efektivní ani bohaté a neumožňuje vést statistiky o obsahu textu. Ale protože Loki chce být ekvivalentem grepu a doplňkem Promethea, není to nevýhoda.

Vyšetřování incidentu

Abychom lépe pochopili, proč Loki nepotřebuje indexování, vraťme se k metodě vyšetřování incidentů, kterou používají vývojáři Loki:

Loki - sbírání protokolů pomocí přístupu Prometheus
1 Výstraha → 2 Ovládací panel → 3 Adhoc dotaz → 4 Agregace protokolu → 5 Distribuované trasování → 6 Opravit!
(1 Upozornění → 2 Ovládací panel → 3 Adhoc dotaz → 4 Agregace protokolu → 5 Distribuované trasování → 6 Oprava!)

Myšlenka je taková, že dostaneme nějaký druh upozornění (Slack Notification, SMS atd.) a poté:

  • podívejte se na řídicí panely Grafana
  • podívejte se na metriky služeb (například v Prometheus)
  • podívejte se na položky protokolu (například v Elasticsearch)
  • možná se podívejte na distribuované stopy (Jaeger, Zipkin atd.)
  • a konečně opravit původní problém.

Zde v případě zásobníku Grafana + Prometheus + Elasticsearch + Zipkin budete muset použít čtyři různé nástroje. Abychom ušetřili čas, bylo by hezké mít možnost provádět všechny tyto kroky pomocí jediného nástroje: Grafana. Stojí za zmínku, že tento přístup k výzkumu je v Grafaně implementován od verze 6. Díky tomu je možné přistupovat k datům Prometheus přímo z Grafany.

Loki - sbírání protokolů pomocí přístupu Prometheus
Obrazovka Průzkumníka rozdělená mezi Promethea a Lokiho

Na této obrazovce můžete zobrazit protokoly v Loki související s metrikami Prometheus pomocí konceptu rozdělené obrazovky. Od verze 6.5 vám Grafana umožňuje analyzovat ID trasování v záznamech protokolu Loki, abyste mohli sledovat odkazy na vaše oblíbené distribuované trasovací nástroje (Jaeger).

Lokiho test

Nejjednodušší způsob, jak otestovat Loki lokálně, je použít docker-compose. Soubor docker-compose se nachází v úložišti Loki. Úložiště můžete získat pomocí následujícího příkazu git:

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

Poté je třeba přejít do produkčního adresáře:

$ cd production

Poté můžete získat nejnovější obrázky Docker:

$ docker-compose pull

Nakonec se Loki stack spustí následujícím příkazem:

$ docker-compose up

Loki architektura

Zde je malý diagram s architekturou Loki:

Loki - sbírání protokolů pomocí přístupu Prometheus
Principy architektury Loki

Webový klient spouští aplikace na serveru, Promtail sbírá logy a posílá je Lokimu, webový klient také posílá metadata Lokimu. Loki vše agreguje a předává Grafaně.
Loki běží. Chcete-li zobrazit dostupné součásti, spusťte následující příkaz:

$ docker ps

V případě čerstvě nainstalovaného Dockeru by měl příkaz vrátit následující výstup:

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 následující komponenty:

  • Promtail: agent zodpovědný za centralizaci protokolů
  • Grafana: slavný nástroj palubní desky
  • Loki: démon centralizace dat

V rámci klasické infrastruktury (například založené na virtuálních strojích) musí být na každém stroji nasazen agent Promtail. Grafana a Loki lze nainstalovat na stejný stroj.

Nasazení do Kubernetes

Instalace komponent Loki v Kubernetes bude následující:

  • daemonSet pro nasazení agenta Promtail na každý z počítačů v clusteru serverů
  • Lokiho nasazení
  • a poslední je nasazení Grafany.

Naštěstí je Loki dostupný jako balíček Helm, takže jeho nasazení je snadné.

Instalace přes Heml

Heml byste již měli mít nainstalovaný. Lze jej stáhnout z úložiště GitHub projektu. Instaluje se rozbalením archivu vhodného pro vaši architekturu a přidáním kormidla $PATH.

Poznámka: verze 3.0.0 Helmu byla vydána nedávno. Vzhledem k tomu, že v něm došlo k mnoha změnám, čtenáři se doporučuje chvíli počkat, než jej začne používat..

Přidání zdroje pro Helm

Prvním krokem je přidání úložiště „loki“ pomocí následujícího příkazu:

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

Poté můžete vyhledat balíčky s názvem „loki“:

$ helm search loki

Výsledek:

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

Tyto balíčky mají následující vlastnosti:

  • пакет loki/loki odpovídá pouze serveru Loki
  • пакет loki/fluent-bit umožňuje nasadit DaemonSet pomocí fluent-bin ke shromažďování protokolů namísto Promtail
  • пакет loki/promtail obsahuje agenta pro shromažďování protokolů
  • пакет loki/loki-stack, umožňuje okamžitě nasadit Lokiho společně s Promtailem.

Instalace Lokiho

Chcete-li nasadit Loki do Kubernetes, spusťte následující příkaz v oboru názvů „monitorování“:

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

Chcete-li uložit na disk, přidejte možnost --set loki.persistence.enabled = true:

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

Poznámka: pokud chcete zároveň nasadit Grafanu, tak přidejte parametr --set grafana.enabled = true

Když spustíte tento příkaz, měli byste získat následující 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.

Při pohledu na stav modulů ve jmenném prostoru „monitorování“ vidíme, že vše je nasazeno:

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

Výsledek:

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šechny moduly běží. Nyní je čas udělat nějaké testy!

Připojení ke Grafaně

Abyste se mohli připojit ke Grafaně pod Kubernetes, musíte otevřít tunel do jeho modulu. Následuje příkaz k otevření portu 3000 pro grafana pod:

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

Dalším důležitým bodem je potřeba obnovit heslo správce Grafana. Heslo je uchováváno v tajnosti loki-grafana v oboru .data.admin-user ve formátu base64.

Chcete-li jej obnovit, musíte spustit následující příkaz:

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

Toto heslo použijte ve spojení s výchozím účtem správce (admin).

Definice zdroje dat Loki v Grafaně

Nejprve se ujistěte, že je vytvořen zdroj dat Loki (Konfigurace / Zdroj dat).
Zde je příklad:

Loki - sbírání protokolů pomocí přístupu Prometheus
Příklad nastavení zdroje dat pro Lokiho

Kliknutím na „Test“ můžete otestovat spojení s Lokim.

Vyřizování žádostí Lokimu

Nyní přejděte do Grafany a přejděte do sekce „Prozkoumat“. Při přijímání protokolů z kontejnerů Loki přidává metadata z Kubernetes. Je tak možné prohlížet protokoly konkrétního kontejneru.

Chcete-li například vybrat protokoly kontejneru promtail, můžete použít následující dotaz: {container_name = "promtail"}.
Nezapomeňte zde také vybrat zdroj dat Loki.

Tento dotaz vrátí aktivitu kontejneru takto:

Loki - sbírání protokolů pomocí přístupu Prometheus
Výsledek dotazu v Grafana

Přidávání na palubní desku

Počínaje Grafanou 6.4 je možné umístit informace protokolu přímo na řídicí panel. Poté bude uživatel moci rychle přepínat mezi počtem požadavků na jeho webu a trasováním aplikací.

Níže je uveden příklad řídicího panelu, který implementuje tuto interakci:

Loki - sbírání protokolů pomocí přístupu Prometheus
Ukázkový řídicí panel s metrikami Prometheus a protokoly Loki

Budoucnost Lokiho

Loki jsem začal používat již v květnu/červnu s verzí 0.1. Dnes již vyšla verze 1 a dokonce 1.1 a 1.2.

Nutno přiznat, že verze 0.1 nebyla dostatečně stabilní. Ale 0.3 již vykazovala skutečné známky vyspělosti a další verze (0.4, poté 1.0) tento dojem jen posilovaly.

Po 1.0.0 už nikdo nemůže mít výmluvu, proč tento úžasný nástroj nepoužívat.

Další vylepšení by se nemělo týkat Lokiho, ale spíše jeho integrace s vynikající Grafanou. Ve skutečnosti má Grafana 6.4 již dobrou integraci s řídicími panely.

Grafana 6.5, která byla vydána nedávno, tuto integraci dále vylepšuje tím, že automaticky rozpoznává obsah protokolů ve formátu JSON.

Níže uvedené video ukazuje malý příklad tohoto mechanismu:

Loki - sbírání protokolů pomocí přístupu Prometheus
Použití řetězců Loki vykreslených v Grafaně

Je možné použít jedno z polí JSON, například k:

  • odkazy na externí nástroj
  • filtrování obsahu protokolu

Můžete například kliknout na traceId a přejít na Zipkin nebo Jaeger.

Jako obvykle se těšíme na vaše komentáře a zveme vás otevřený webinář, kde si povíme, jak se vyvíjel DevOps průmysl během roku 2019 a probereme možné cesty rozvoje pro rok 2020.

Zdroj: www.habr.com