Loki - naplógyűjtés Prometheus megközelítéssel

Üdvözlet Habrovszk lakosai! A tanfolyamra való új beiratkozás kezdetének előestéjén "DevOps gyakorlatok és eszközök" Elkészítettünk Önnek egy érdekes anyag fordítását.

Ez a cikk a Loki rövid bemutatása. Loki projekt Grafana támogatásával és a naplók központosított gyűjtését célozza (kiszolgálókról vagy konténerekről).

Loki fő inspirációja az volt Prométheusz azzal az ötlettel, hogy megközelítéseit alkalmazza a naplókezelésben:

  • címkék használata az adatok tárolására
  • kevés erőforrás felhasználása

Visszatérünk a Prometheus működésére, és néhány példát adunk a Kubernetes kontextusában való használatára.

Néhány szó Prométheuszról

A Loki működésének teljes megértéséhez fontos, hogy tegyünk egy lépést hátra, és emlékezzünk egy kicsit a Prometheusra.

A Prometheus egyik megkülönböztető jellemzője a mérőszámok gyűjtése a gyűjtőhelyekről (exportőrökön keresztül) és tárolása a TSDB-ben (Time Series Data Base), metaadatok hozzáadásával címkék formájában.

Miért szükséges

A közelmúltban a Prometheus de facto szabvány lett a konténerek és a Kubernetes világában: telepítése nagyon egyszerű, és a Kubernetes-fürthöz natív Prometheus végpont tartozik. A Prometheus mérőszámokat is kinyerhet egy tárolóban telepített alkalmazásokból, miközben meghatározott címkéket tárol. Ezért az alkalmazásfigyelés nagyon könnyen megvalósítható.

Sajnos még mindig nincs kulcsrakész megoldás a naplókezelésre, és magának kell megoldást találnia:

  • felügyelt felhőszolgáltatás a naplók központosításához (AWS, Azure vagy Google)
  • monitoring szolgáltatás „monitoring mint szolgáltatás” (például Datadog)
  • saját naplógyűjtési szolgáltatás létrehozása.

A harmadik lehetőséghez hagyományosan az Elasticsearch-et használtam, annak ellenére, hogy nem voltam vele mindig elégedett (főleg a nehézkessége és a konfiguráció bonyolultsága).

A Lokit a megvalósítás egyszerűsítésére tervezték, a következő elvek szerint:

  • legyen egyszerű kezdeni
  • kevés erőforrást fogyaszt
  • önállóan, különösebb karbantartás nélkül dolgozhat
  • a Prometheus kiegészítéseként szolgál a hibavizsgálatok segítésére

Ez az egyszerűség azonban bizonyos kompromisszumok rovására megy. Az egyik az, hogy ne indexeljük a tartalmat. Ezért a szöveges keresés nem túl hatékony vagy gazdag, és nem teszi lehetővé a szöveg tartalmára vonatkozó statisztikák készítését. De mivel Loki a grep megfelelője és Prometheus kiegészítője akar lenni, ez nem hátrány.

Esemény kivizsgálása

Hogy jobban megértsük, miért nincs szüksége a Lokinak az indexelésre, térjünk vissza a Loki fejlesztői által használt incidensvizsgálati módszerhez:

Loki - naplógyűjtés Prometheus megközelítéssel
1 Figyelmeztetés → 2 Irányítópult → 3 Adhoc lekérdezés → 4 Naplóösszesítés → 5 Elosztott nyomkövetés → 6 Javítás!
(1 Figyelmeztetés → 2 Irányítópult → 3 Adhoc lekérdezés → 4 Naplóösszesítés → 5 Elosztott nyomkövetés → 6 Javítás!)

Az ötlet az, hogy kapunk valamilyen riasztást (Slack Notification, SMS stb.) és utána:

  • nézd meg a Grafana műszerfalait
  • nézze meg a szolgáltatási mutatókat (például a Prometheusban)
  • nézze meg a naplóbejegyzéseket (például az Elasticsearch-ben)
  • esetleg nézd meg az elosztott nyomokat (Jaeger, Zipkin stb.)
  • és végül az eredeti probléma megoldása.

Itt a Grafana + Prometheus + Elasticsearch + Zipkin verem esetében négy különböző eszközt kell használnia. Az idő csökkentése érdekében jó lenne ezeket a lépéseket egyetlen eszközzel végrehajtani: a Grafana segítségével. Érdemes megjegyezni, hogy ezt a kutatási megközelítést a Grafana 6. verziója óta alkalmazzák. Így lehetővé válik a Prometheus-adatok közvetlen elérése a Grafana-ból.

Loki - naplógyűjtés Prometheus megközelítéssel
Az Explorer képernyő megosztott Prometheus és Loki között

Ezen a képernyőn megtekintheti a Prometheus mérőszámaihoz kapcsolódó Loki naplókat az osztott képernyős koncepció használatával. A 6.5-ös verzió óta a Grafana lehetővé teszi a nyomkövetési azonosító elemzését a Loki naplóbejegyzéseiben, hogy kövesse a kedvenc elosztott nyomkövető eszközeire (Jaeger) mutató hivatkozásokat.

Helyi Loki teszt

A Loki helyi tesztelésének legegyszerűbb módja a docker-compose használata. A docker-compose fájl a Loki-lerakatban található. A tárat a következő paranccsal érheti el git:

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

Ezután be kell lépnie a termelési könyvtárba:

$ cd production

Ezt követően letöltheti a Docker képek legújabb verzióját:

$ docker-compose pull

Végül a Loki verem elindul a következő paranccsal:

$ docker-compose up

Loki építészet

Itt van egy kis diagram a Loki architektúrával:

Loki - naplógyűjtés Prometheus megközelítéssel
Loki építészeti alapelvei

A webkliens alkalmazásokat futtat a szerveren, a Promtail naplókat gyűjt és elküldi a Lokinak, a webkliens metaadatokat is küld a Lokinak. A Loki mindent összesít, és továbbítja a Grafanának.
Elindul a Loki. Az elérhető összetevők megtekintéséhez futtassa a következő parancsot:

$ docker ps

Frissen telepített Docker esetén a parancsnak a következő eredményt kell visszaadnia:

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

A következő összetevőket látjuk:

  • Promtail: a naplók központosításáért felelős ügynök
  • Grafana: egy híres műszerfali eszköz
  • Loki: Data Centralization Daemon

A klasszikus infrastruktúra részeként (például virtuális gépeken alapuló) a Promtail ügynököt minden gépen telepíteni kell. A Grafana és a Loki telepíthető ugyanarra a gépre.

Telepítés a Kubernetesben

A Loki-összetevők Kubernetesre történő telepítése a következőképpen történik:

  • daemonSet a Promtail ügynök telepítéséhez a kiszolgálófürt minden egyes gépén
  • Bevetési Loki
  • az utolsó pedig a Grafana bevetése.

Szerencsére a Loki Helm csomagként is elérhető, így könnyen telepíthető.

Telepítés Heml-en keresztül

A Heml-nek már telepítve kell lennie. Letölthető a projekt GitHub tárházából. Úgy telepíthető, hogy kicsomagolja az architektúrájának megfelelő archívumot, és hozzáadja a kormányt $PATH.

Megjegyzés: A Helm 3.0.0-s verziója nemrég jelent meg. Mivel sok változás történt rajta, az olvasónak azt tanácsoljuk, hogy várjon egy kicsit a használat előtt..

Forrás hozzáadása Helmhez

Az első lépés a „loki” tároló hozzáadása a következő paranccsal:

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

Ezek után rákereshet a „loki” nevű csomagokra:

$ helm search loki

Eredmény:

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

Ezek a csomagok a következő tulajdonságokkal rendelkeznek:

  • csomag loki/loki csak a Loki szerverrel egyezik
  • csomag loki/fluent-bit lehetővé teszi egy DaemonSet üzembe helyezését a fluent-bin használatával a naplók gyűjtésére a Promtail helyett
  • csomag loki/promtail naplófájl-gyűjtő ügynököt tartalmaz
  • csomag loki/loki-stack, lehetővé teszi a Loki azonnali telepítését a Promtail-lel együtt.

Loki telepítése

A Loki Kubernetes rendszerbe történő telepítéséhez futtassa a következő parancsot a „monitoring” névtérben:

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

Lemezre mentéshez adja hozzá a paramétert --set loki.persistence.enabled = true:

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

Megjegyzés: ha egyszerre szeretné telepíteni a Grafanát, akkor adja hozzá a paramétert --set grafana.enabled = true

A parancs futtatásakor a következő kimenetet kell kapnia:

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.

Ha megnézzük a „monitoring” névtérben lévő podok állapotát, láthatjuk, hogy minden telepítve van:

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

Eredmény:

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

Minden pod fut. Itt az ideje néhány tesztnek!

Csatlakozás a Grafana-hoz

A Kubernetes alatti Grafana-hoz való csatlakozáshoz alagutat kell nyitnia a podjához. Alább található a Grafana pod 3000-es portjának megnyitására szolgáló parancs:

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

Egy másik fontos pont a Grafana rendszergazdai jelszó helyreállításának szükségessége. A jelszót titokban tartják loki-grafana mezőben .data.admin-user base64 formátumban.

A visszaállításhoz a következő parancsot kell futtatnia:

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

Használja ezt a jelszót az alapértelmezett rendszergazdai fiókkal (admin) együtt.

Loki adatforrás meghatározása a Grafanában

Először is győződjön meg arról, hogy a Loki adatforrás létrejött (Konfiguráció/Adatforrás).
Íme egy példa:

Loki - naplógyűjtés Prometheus megközelítéssel
Példa a Loki adatforrásának beállítására

A „Teszt” gombra kattintva ellenőrizheti a kapcsolatot a Lokival.

Kérések benyújtása Lokihoz

Most lépjen a Grafana oldalára a „Felfedezés” részhez. Amikor naplókat fogad tárolókból, a Loki metaadatokat ad hozzá a Kubernetesből. Így lehetővé válik egy adott konténer naplóinak megtekintése.

Például a promtail tároló naplóinak kiválasztásához használja a következő lekérdezést: {container_name = "promtail"}.
Ne felejtse el itt kiválasztani a Loki adatforrást is.

Ez a lekérdezés a következőképpen adja vissza a tárolótevékenységet:

Loki - naplógyűjtés Prometheus megközelítéssel
Lekérdezés eredménye a Grafana-ban

Hozzáadás az irányítópulthoz

A Grafana 6.4-től kezdve a naplóadatokat közvetlenül az irányítópulton helyezheti el. Ezt követően a felhasználó gyorsan tud váltani a webhelyén lévő kérések száma és az alkalmazásnyomok között.

Az alábbiakban egy példa látható egy irányítópultra, amely megvalósítja ezt az interakciót:

Loki - naplógyűjtés Prometheus megközelítéssel
Minta irányítópult Prometheus-metrikákkal és Loki-naplókkal

Loki jövője

Májusban/júniusban kezdtem el használni a Lokit a 0.1-es verzióval. Ma már megjelent az 1-es verzió, sőt az 1.1 és 1.2 is.

El kell ismerni, hogy a 0.1-es verzió nem volt elég stabil. De a 0.3 már az érettség valódi jeleit mutatta, és a későbbi verziók (0.4, majd 1.0) csak erősítették ezt a benyomást.

Az 1.0.0 után senkinek nem lehet mentsége arra, hogy ne használja ezt a csodálatos eszközt.

A további fejlesztéseknek nem a Lokira kell vonatkozniuk, hanem inkább annak integrációjára a kiváló Grafanával. Valójában a Grafana 6.4 már jól integrálja a műszerfalakat.

A nemrégiben megjelent Grafana 6.5 tovább javítja ezt az integrációt azáltal, hogy automatikusan felismeri a naplótartalmat JSON formátumban.

Az alábbi videó egy kis példát mutat erre a mechanizmusra:

Loki - naplógyűjtés Prometheus megközelítéssel
A Grafanában exponált Loki karakterláncok használata

Lehetővé válik a JSON-mezők egyikének használata például a következőkhöz:

  • hivatkozások külső eszközre
  • a napló tartalmának szűrése

Például rákattinthat a traceId-re a Zipkin vagy a Jaeger eléréséhez.

Szokás szerint várjuk észrevételeiket, és arra is invitálunk nyílt webinárium, ahol arról lesz szó, hogyan fejlődött a DevOps iparág 2019-ben, és megvitatjuk a lehetséges fejlesztési utakat 2020-ra.

Forrás: will.com