Loki: recopilació de registres mitjançant l'enfocament de Prometeu

Salutacions, habitants de Khabrovsk! A la vigília de l'inici d'una nova matrícula per al curs "Pràctiques i eines de DevOps" Us hem preparat una traducció de material interessant.

Aquest article és una breu introducció a Loki. Projecte Loki recolzat per Grafana i està orientat a la recollida centralitzada de registres (des de servidors o contenidors).

La principal inspiració per a Loki va ser Prometeu amb la idea d'aplicar els seus enfocaments a la gestió de registres:

  • utilitzant etiquetes per emmagatzemar dades
  • consum de pocs recursos

Tornarem a com funciona Prometheus i donarem alguns exemples del seu ús en el context de Kubernetes.

Unes paraules sobre Prometeu

Per entendre completament com funciona Loki, és important fer un pas enrere i recordar una mica sobre Prometeu.

Una de les característiques distintives de Prometheus és l'extracció de mètriques dels punts de recollida (mitjançant exportadors) i l'emmagatzematge en TSDB (Time Series Data Base), amb l'addició de metadades en forma d'etiquetes.

Per què ho necessiteu?

Recentment, Prometheus s'ha convertit en l'estàndard de facto en el món dels contenidors i Kubernetes: la seva instal·lació és molt senzilla i el clúster Kubernetes ve amb un endpoint natiu per a Prometheus. Prometheus també pot extreure mètriques d'aplicacions desplegades en un contenidor mentre emmagatzema etiquetes específiques. Per tant, el seguiment de l'aplicació és molt fàcil d'implementar.

Malauradament, encara no hi ha una solució clau en mà per a la gestió de registres, i heu de trobar una solució per a vosaltres mateixos:

  • servei de núvol gestionat per centralitzar registres (AWS, Azure o Google)
  • servei de monitorització "monitoring as a service" (per exemple, Datadog)
  • creant el vostre propi servei de recollida de registres.

Per a la tercera opció, he utilitzat tradicionalment Elasticsearch, malgrat que no sempre n'he estat content (especialment la seva pesadesa i complexitat de configuració).

Loki va ser dissenyat per simplificar la implementació d'acord amb els principis següents:

  • sigui fàcil de començar
  • consumeix pocs recursos
  • treballar de manera independent sense cap manteniment especial
  • servir com a complement a Prometheus per ajudar amb les investigacions d'errors

Tanmateix, aquesta senzillesa es fa a costa d'alguns compromisos. Un d'ells és no indexar el contingut. Per tant, la cerca de text no és molt eficient ni rica i no permet fer estadístiques sobre el contingut del text. Però com que Loki vol ser l'equivalent de grep i un complement de Prometeu, això no és un desavantatge.

Investigació d'incidències

Per entendre millor per què Loki no necessita indexació, tornem al mètode d'investigació d'incidents que van utilitzar els desenvolupadors de Loki:

Loki: recopilació de registres mitjançant l'enfocament de Prometeu
1 Alerta → 2 Tauler → 3 Consulta adhoc → 4 Agregació de registres → 5 Traçat distribuït → 6 Solucionar!
(1 Avís → 2 Tauler → 3 Consulta adhoc → 4 Agregació de registres → 5 Traçat distribuït → 6 Correcció!)

La idea és que rebem algun tipus d'alerta (Notificació Slack, SMS, etc.) i després:

  • mireu els quadres de comandament de Grafana
  • mirar les mètriques del servei (per exemple, a Prometheus)
  • mirar les entrades de registre (per exemple, a Elasticsearch)
  • potser feu una ullada a les traces distribuïdes (Jaeger, Zipkin, etc.)
  • i finalment solucionar el problema original.

Aquí, en el cas de la pila Grafana + Prometheus + Elasticsearch + Zipkin, haureu d'utilitzar quatre eines diferents. Per reduir el temps, estaria bé poder realitzar tots aquests passos amb una eina: Grafana. Val la pena assenyalar que aquest enfocament de recerca s'ha implementat a Grafana des de la versió 6. Així, es fa possible accedir a les dades de Prometheus directament des de Grafana.

Loki: recopilació de registres mitjançant l'enfocament de Prometeu
La pantalla de l'explorador es va dividir entre Prometeu i Loki

Des d'aquesta pantalla podeu veure els registres de Loki relacionats amb les mètriques de Prometheus mitjançant el concepte de pantalla dividida. Des de la versió 6.5, Grafana us permet analitzar l'identificador de traça a les entrades de registre de Loki per seguir enllaços a les vostres eines de traça distribuïdes preferides (Jaeger).

Prova local de Loki

La manera més senzilla de provar Loki localment és utilitzar docker-compose. El fitxer docker-compose es troba al dipòsit de Loki. Podeu obtenir el repositori mitjançant l'ordre següent git:

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

Aleshores heu d'anar al directori de producció:

$ cd production

Després d'això, podeu obtenir la darrera versió de les imatges de Docker:

$ docker-compose pull

Finalment, s'inicia la pila Loki amb l'ordre següent:

$ docker-compose up

Arquitectura Loki

Aquí teniu un petit diagrama amb l'arquitectura de Loki:

Loki: recopilació de registres mitjançant l'enfocament de Prometeu
Principis d'arquitectura de Loki

El client web executa aplicacions al servidor, Promtail recull registres i els envia a Loki, el client web també envia metadades a Loki. Loki ho agrega tot i ho transmet a Grafana.
Es llança Loki. Per veure els components disponibles, executeu l'ordre següent:

$ docker ps

En el cas d'un Docker recentment instal·lat, l'ordre hauria de retornar el resultat següent:

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

Veiem els següents components:

  • Promtail: agent responsable de centralitzar els registres
  • Grafana: una famosa eina de tauler
  • Loki: Dimoni de centralització de dades

Com a part d'una infraestructura clàssica (per exemple, basada en màquines virtuals), l'agent Promtail s'ha de desplegar a cada màquina. Grafana i Loki es poden instal·lar a la mateixa màquina.

Desplegament a Kubernetes

La instal·lació dels components de Loki a Kubernetes serà la següent:

  • daemonSet per desplegar l'agent Promtail a cadascuna de les màquines del clúster de servidors
  • Desplegament Loki
  • i l'últim és el desplegament de Grafana.

Afortunadament, Loki està disponible com a paquet Helm, per la qual cosa és fàcil de desplegar.

Instal·lació mitjançant Heml

Ja hauríeu de tenir Heml instal·lat. Es pot descarregar des del repositori GitHub del projecte. S'instal·la desempaquetant l'arxiu corresponent a la vostra arquitectura i afegint-hi helm $PATH.

Nota: La versió 3.0.0 de Helm es va publicar recentment. Com que hi ha hagut molts canvis, es recomana al lector que espereu una mica abans d'utilitzar-lo..

Afegint una font per a Helm

El primer pas és afegir el repositori "loki" mitjançant l'ordre següent:

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

Després d'això, podeu cercar paquets anomenats "loki":

$ helm search loki

Resultat:

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

Aquests paquets tenen les següents característiques:

  • el paquet loki/loki només coincideix amb el servidor Loki
  • el paquet loki/fluent-bit us permet desplegar un DaemonSet mitjançant fluent-bin per recollir registres en lloc de Promtail
  • el paquet loki/promtail conté un agent de recollida de fitxers de registre
  • el paquet loki/loki-stack, us permet desplegar immediatament Loki juntament amb Promtail.

Instal·lant Loki

Per implementar Loki a Kubernetes, executeu l'ordre següent a l'espai de noms de "vigilància":

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

Per desar al disc, afegiu el paràmetre --set loki.persistence.enabled = true:

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

Nota: si voleu desplegar Grafana al mateix temps, afegiu el paràmetre --set grafana.enabled = true

Quan executeu aquesta comanda, hauríeu d'obtenir la següent sortida:

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.

Si observem l'estat dels pods a l'espai de noms de "vigilància", podem veure que tot està desplegat:

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

Resultat:

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

Totes les beines estan funcionant. Ara toca fer algunes proves!

Connexió a Grafana

Per connectar-vos a Grafana a Kubernetes, heu d'obrir un túnel al seu pod. A continuació es mostra l'ordre per obrir el port 3000 per al pod Grafana:

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

Un altre punt important és la necessitat de recuperar la contrasenya de l'administrador de Grafana. La contrasenya es manté en secret loki-grafana en camp .data.admin-user en format base64.

Per restaurar-lo, heu d'executar l'ordre següent:

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

Utilitzeu aquesta contrasenya juntament amb el compte d'administrador predeterminat (admin).

Definició d'una font de dades Loki a Grafana

En primer lloc, assegureu-vos que la font de dades de Loki s'ha creat (Configuració/Font de dades).
Aquí teniu un exemple:

Loki: recopilació de registres mitjançant l'enfocament de Prometeu
Exemple de configuració d'una font de dades per a Loki

Si feu clic a "Prova", podeu comprovar la connexió amb Loki.

Fent peticions a Loki

Ara aneu a Grafana a la secció "Explora". Quan rep els registres dels contenidors, Loki afegeix metadades de Kubernetes. Així, és possible veure els registres d'un contenidor específic.

Per exemple, per seleccionar els registres del contenidor de promtail, podeu utilitzar la consulta següent: {container_name = "promtail"}.
Aquí també recordeu seleccionar la font de dades de Loki.

Aquesta consulta retornarà l'activitat del contenidor de la manera següent:

Loki: recopilació de registres mitjançant l'enfocament de Prometeu
Resultat de la consulta a Grafana

Afegeix al tauler

A partir de Grafana 6.4, podeu col·locar la informació del registre directament al tauler. Després d'això, l'usuari podrà canviar ràpidament entre el nombre de sol·licituds del seu lloc i els rastres de l'aplicació.

A continuació es mostra un exemple d'un tauler que implementa aquesta interacció:

Loki: recopilació de registres mitjançant l'enfocament de Prometeu
Tauler de mostra amb mètriques de Prometheus i registres de Loki

El futur de Loki

Vaig començar a utilitzar Loki al maig/juny amb la versió 0.1. Avui ja s'han llançat la versió 1, i fins i tot 1.1 i 1.2.

Cal admetre que la versió 0.1 no era prou estable. Però 0.3 ja mostrava signes reals de maduresa, i les versions posteriors (0.4, després 1.0) només van reforçar aquesta impressió.

Després de l'1.0.0, ningú no pot tenir cap excusa per no utilitzar aquesta meravellosa eina.

Les millores posteriors no haurien de ser sobre Loki, sinó la seva integració amb l'excel·lent Grafana. De fet, Grafana 6.4 ja té una bona integració amb els quadres de comandament.

Grafana 6.5, que es va publicar recentment, millora encara més aquesta integració reconeixent automàticament el contingut del registre en format JSON.

El vídeo següent mostra un petit exemple d'aquest mecanisme:

Loki: recopilació de registres mitjançant l'enfocament de Prometeu
Utilitzant cordes de Loki exposades a Grafana

Es pot fer servir un dels camps JSON, per exemple, per a:

  • enllaços a una eina externa
  • filtrar el contingut del registre

Per exemple, podeu fer clic a traceId per anar a Zipkin o Jaeger.

Com és habitual, esperem els vostres comentaris i us convidem webinar obert, on parlarem de com es va desenvolupar la indústria DevOps durant el 2019 i parlarem de possibles camins de desenvolupament per al 2020.

Font: www.habr.com