Loki - logkolleksje mei de Prometheus-oanpak

Salute, Khabrovsk ynwenners! Oan 'e foarjûn fan it begjin fan in nije ynskriuwing foar de kursus "DevOps-praktiken en ark" Wy hawwe in oersetting fan nijsgjirrich materiaal foar jo taret.

Dit artikel is in koarte ynlieding foar Loki. Projekt Loki stipe troch Grafana en is rjochte op sintralisearre kolleksje fan logs (fan servers of konteners).

De wichtichste ynspiraasje foar Loki wie Prometheus mei it idee om syn oanpak ta te passen foar logbehear:

  • gebrûk fan labels om gegevens op te slaan
  • konsumpsje fan in pear boarnen

Wy sille weromkomme nei hoe't Prometheus wurket en wat foarbylden jouwe fan it gebrûk yn 'e kontekst fan Kubernetes.

In pear wurden oer Prometheus

Om folslein te begripen hoe't Loki wurket, is it wichtich om in stap werom te nimmen en in bytsje te ûnthâlden oer Prometheus.

Ien fan 'e ûnderskiedende skaaimerken fan Prometheus is de ekstraksje fan metriken út sammelpunten (fia eksporteurs) en opslaan yn TSDB (Time Series Data Base), mei de tafoeging fan metadata yn 'e foarm fan labels.

Wêrom hawwe jo it nedich?

Koartlyn is Prometheus de de facto standert wurden yn 'e wrâld fan konteners en Kubernetes: har ynstallaasje is heul ienfâldich, en it Kubernetes-kluster komt mei in native endpoint foar Prometheus. Prometheus kin ek metriken ekstrahearje út applikaasjes ynset yn in kontener by it opslaan fan spesifike etiketten. Dêrom is applikaasjemonitoring heul maklik te ymplementearjen.

Spitigernôch is d'r noch gjin turnkey-oplossing foar logbehear, en jo moatte in oplossing foar josels fine:

  • beheare wolktsjinst foar sintralisearjen fan logs (AWS, Azure of Google)
  • tafersjochtsjinst "monitoring as in tsjinst" (bygelyks Datadog)
  • it meitsjen fan jo eigen logkolleksjetsjinst.

Foar de tredde opsje brûkte ik tradisjoneel Elasticsearch, nettsjinsteande it feit dat ik der net altyd bliid mei wie (benammen de swierens en kompleksiteit fan konfiguraasje).

Loki is ûntworpen om ymplemintaasje te ferienfâldigjen neffens de folgjende prinsipes:

  • wêze ienfâldich om te begjinnen
  • konsumearje pear boarnen
  • wurkje selsstannich sûnder spesjale ûnderhâld
  • tsjinje as tafoeging oan Prometheus om te helpen mei bugûndersiken

Dizze ienfâld komt lykwols ten koste fan guon kompromissen. Ien fan har is net om de ynhâld te yndeksearjen. Dêrom is tekstsykjen net heul effisjint of ryk en lit gjin statistiken oer de ynhâld fan 'e tekst ta. Mar om't Loki it ekwivalint wêze wol fan grep en in oanfolling op Prometheus, is dit gjin neidiel.

Incident Undersyk

Om better te begripen wêrom Loki gjin yndeksearring nedich is, litte wy weromgean nei de metoade foar ynsidintûndersyk dy't de Loki-ûntwikkelders brûkten:

Loki - logkolleksje mei de Prometheus-oanpak
1 Alert → 2 Dashboard → 3 Adhoc Query → 4 Log Aggregation → 5 Distributed Tracing → 6 Fix!
(1 Warskôging → 2 Dashboard → 3 Adhoc Query → 4 Log Aggregation → 5 Distributed Tracing → 6 Fixing!)

It idee is dat wy in soarte fan warskôging krije (Slack Notification, SMS, ensfh.) En dêrnei:

  • sjoch op Grafana dashboards
  • sjoch nei tsjinstmetriken (bygelyks yn Prometheus)
  • sjoch nei log-yngongen (bygelyks yn Elasticsearch)
  • sjoch miskien nei ferdielde spoaren (Jaeger, Zipkin, ensfh.)
  • en úteinlik it orizjinele probleem reparearje.

Hjir, yn it gefal fan 'e Grafana + Prometheus + Elasticsearch + Zipkin-stapel, moatte jo fjouwer ferskillende ark brûke. Om tiid te ferminderjen soe it moai wêze om al dizze stappen út te fieren mei ien ark: Grafana. It is de muoite wurdich op te merken dat dizze oanpak fan ûndersyk is ymplementearre yn Grafana sûnt ferzje 6. Sa wurdt it mooglik om tagong ta Prometheus gegevens direkt út Grafana.

Loki - logkolleksje mei de Prometheus-oanpak
Explorer skerm split tusken Prometheus en Loki

Fan dit skerm kinne jo Loki-logs sjen relatearre oan Prometheus-metriken mei it konsept fan split skerm. Sûnt ferzje 6.5 lit Grafana jo de trace-id yn Loki-log-yngongen analysearje om keppelings te folgjen nei jo favorite ferspraat tracing-ark (Jaeger).

Lokale Loki test

De maklikste manier om Loki lokaal te testen is om docker-compose te brûken. It docker-compose-bestân leit yn it Loki-repository. Jo kinne it repository krije mei it folgjende kommando git:

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

Dan moatte jo nei de produksjemap gean:

$ cd production

Hjirnei kinne jo de lêste ferzje fan Docker-ôfbyldings krije:

$ docker-compose pull

Uteinlik wurdt de Loki-stapel lansearre mei it folgjende kommando:

$ docker-compose up

Loki arsjitektuer

Hjir is in lyts diagram mei de Loki-arsjitektuer:

Loki - logkolleksje mei de Prometheus-oanpak
Loki-arsjitektuerprinsipes

De webclient rint applikaasjes op 'e tsjinner, Promtail sammelt logs en stjoert se nei Loki, de webclient stjoert ek metadata nei Loki. Loki sammelet alles en stjoert it oer nei Grafana.
Loki wurdt lansearre. Om beskikbere komponinten te besjen, útfiere it folgjende kommando:

$ docker ps

Yn it gefal fan in nij ynstallearre Docker moat it kommando it folgjende resultaat weromjaan:

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

Wy sjogge de folgjende komponinten:

  • Promtail: agint ferantwurdlik foar sintralisearjen fan logs
  • Grafana: in ferneamd dashboard-ark
  • Loki: Data Centralization Daemon

As ûnderdiel fan in klassike ynfrastruktuer (bygelyks basearre op firtuele masines), moat de Promtail-agint op elke masine ynset wurde. Grafana en Loki kinne wurde ynstallearre op deselde masine.

Ynset nei Kubernetes

It ynstallearjen fan Loki-komponinten op Kubernetes sil as folgjend wêze:

  • daemonSet foar it ynsetten fan de Promtail-agint op elk fan 'e masines yn it serverkluster
  • Ynset Loki
  • en de lêste is de ynset fan Grafana.

Lokkich is Loki beskikber as in Helm-pakket, wêrtroch it maklik te ynsetten is.

Ynstallaasje fia Heml

Jo moatte Heml al ynstalleare hawwe. It kin wurde downloade fan it GitHub-repository fan it projekt. It wurdt ynstalleare troch it argyf út te pakken dat oerienkomt mei jo arsjitektuer en helm ta te foegjen $PATH.

Tink derom: ferzje 3.0.0 fan Helm waard koartlyn frijlitten. Om't der in protte feroarings yn binne, wurdt de lêzer advisearre om in bytsje te wachtsjen foardat se it brûke..

In boarne tafoegje foar Helm

De earste stap is om it "loki" repository ta te foegjen mei it folgjende kommando:

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

Hjirnei kinne jo sykje nei pakketten mei de namme "loki":

$ helm search loki

Resultaat:

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

Dizze pakketten hawwe de folgjende funksjes:

  • пакет loki/loki komt oerien mei Loki tsjinner allinne
  • пакет loki / floeiend-bit lit jo in DaemonSet ynsette mei fluent-bin om logs te sammeljen ynstee fan Promtail
  • пакет loki/promtail befettet in agint foar kolleksje fan logfiles
  • пакет loki/loki-stack, kinne jo Loki fuortendaliks ynsette tegearre mei Promtail.

Loki ynstallearje

Om Loki nei Kubernetes yn te setten, útfiere it folgjende kommando yn 'e nammeromte "monitoring":

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

Om op te slaan op skiif, foegje de parameter ta --set loki.persistence.enabled = true:

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

Tink derom: as jo Grafana tagelyk wolle ynsette, foegje dan de parameter ta --set grafana.enabled = true

As jo ​​​​dit kommando útfiere, moatte jo de folgjende útfier krije:

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.

As wy sjogge nei de tastân fan 'e pods yn' e "monitoring" nammeromte, kinne wy ​​​​sjen dat alles is ynset:

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

Resultaat:

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

Alle pods rinne. No is it tiid om wat tests te dwaan!

Ferbine mei Grafana

Om te ferbinen mei Grafana ûnder Kubernetes, moatte jo in tunnel iepenje nei syn pod. Hjirûnder is it kommando om poarte 3000 te iepenjen foar de Grafana-pod:

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

In oar wichtich punt is de needsaak om it grafana-behearderwachtwurd te herstellen. It wachtwurd wurdt geheim hâlden loki-grafana yn fjild .data.admin-user yn basis64-formaat.

Om it te herstellen, moatte jo it folgjende kommando útfiere:

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

Brûk dit wachtwurd yn kombinaasje mei it standert administrator account (admin).

It definiearjen fan in Loki-gegevensboarne yn Grafana

Soargje derfoar dat de Loki-gegevensboarne is makke (Konfiguraasje / Databoarne).
Hjir is in foarbyld:

Loki - logkolleksje mei de Prometheus-oanpak
Foarbyld fan it ynstellen fan in gegevensboarne foar Loki

Troch te klikken op "Test" kinne jo de ferbining mei Loki kontrolearje.

Fersiken meitsje oan Loki

Gean no nei Grafana nei de seksje "Explore". By it ûntfangen fan logs fan konteners foeget Loki metadata ta fan Kubernetes. Sa wurdt it mooglik om de logs fan in spesifike kontener te besjen.

Om bygelyks de promtail-containerlogs te selektearjen, kinne jo de folgjende query brûke: {container_name = "promtail"}.
Tink hjir ek om de Loki-gegevensboarne te selektearjen.

Dizze query sil konteneraktiviteit as folgjend werombringe:

Loki - logkolleksje mei de Prometheus-oanpak
Query resultaat yn Grafana

Taheakje oan dashboard

Begjinnend mei Grafana 6.4 kinne jo logynformaasje direkt op it dashboard pleatse. Hjirnei sil de brûker fluch kinne wikselje tusken it oantal oanfragen op syn side en applikaasjespoaren.

Hjirûnder is in foarbyld fan in dashboard dat dizze ynteraksje ymplementearret:

Loki - logkolleksje mei de Prometheus-oanpak
Foarbyld fan dashboard mei Prometheus-metriken en Loki-logs

De takomst fan Loki

Ik begon Loki werom te brûken yn maaie / juny mei ferzje 0.1. Hjoed binne ferzje 1, en sels 1.1 en 1.2 al frijlitten.

It moat wurde talitten dat ferzje 0.1 wie net stabyl genôch. Mar 0.3 toande al echte tekens fan folwoeksenheid, en folgjende ferzjes (0.4, dan 1.0) allinnich fersterke dizze yndruk.

Nei 1.0.0 kin gjinien gjin ekskús hawwe om dit prachtige ark net te brûken.

Fierdere ferbetteringen moatte net gean oer Loki, mar leaver har yntegraasje mei de treflike Grafana. Yn feite hat Grafana 6.4 al in goede yntegraasje mei dashboards.

Grafana 6.5, dy't koartlyn útbrocht is, ferbetteret dizze yntegraasje fierder troch automatysk logynhâld yn JSON-formaat te werkennen.

De fideo hjirûnder lit in lyts foarbyld sjen fan dit meganisme:

Loki - logkolleksje mei de Prometheus-oanpak
Mei help fan Loki snaren bleatsteld yn Grafana

It wurdt mooglik ien fan 'e JSON-fjilden te brûken, bygelyks foar:

  • keppelings nei eksterne ark
  • filterjen log ynhâld

Jo kinne bygelyks op traceId klikke om nei Zipkin of Jaeger te gean.

Lykas gewoanlik sjogge wy út nei jo opmerkings en noegje jo jo út iepen webinar, wêr't wy sille prate oer hoe't de DevOps-sektor yn 2019 ûntwikkele en mooglike ûntwikkelingspaden foar 2020 besprekke.

Boarne: www.habr.com