Loki - recollendo rexistros usando o enfoque de Prometheus

Saúdos, Khabrovitas! En previsión do inicio dunha nova matrícula para o curso "Prácticas e ferramentas de DevOps" preparou unha tradución de material interesante para ti.

Este artigo é unha breve introdución a Loki. Proxecto Loki apoiado por Grafana e está dirixido á recollida centralizada de rexistros (desde servidores ou contedores).

A principal inspiración para Loki foi Prometeu coa idea de aplicar os seus enfoques á xestión de rexistros:

  • utilizando etiquetas para almacenar datos
  • baixo consumo de recursos

Volveremos aos principios de Prometheus e daremos algúns exemplos do seu uso no contexto de Kubernetes.

Unhas palabras sobre Prometeo

Para comprender completamente como funciona Loki, é importante dar un paso atrás e volver a visitar Prometheus un pouco.

Unha das características distintivas de Prometheus é a extracción de métricas dos puntos de recollida (a través de exportadores) e almacenalas nunha TSDB (Time Series Data Base, base de datos de series temporais) coa adición de metadatos en forma de etiquetas.

Por que é necesario

Recentemente, Prometheus converteuse no estándar de facto no mundo dos contedores e Kubernetes: a súa instalación é moi sinxela e un clúster de Kubernetes ten inicialmente un punto final para Prometheus. Prometheus tamén pode extraer métricas de aplicacións despregadas nun contedor mantendo etiquetas específicas. Polo tanto, o seguimento da aplicación é moi sinxelo de implementar.

Desafortunadamente, aínda non hai unha solución chave en man para a xestión de rexistros e tes que atopar unha solución por ti mesmo:

  • servizo de nube xestionado para centralizar rexistros (AWS, Azure ou Google)
  • servizo de monitorización "monitoring as a service" (por exemplo, Datadog)
  • creando o seu propio servizo de recollida de rexistros.

Para a terceira opción, usei tradicionalmente Elasticsearch, a pesar de que non sempre estaba satisfeito con el (especialmente a súa pesadez e complexidade de configuración).

Loki foi deseñado para ser doado de implementar segundo os seguintes principios:

  • ser doado de comezar
  • consumir poucos recursos
  • traballar de forma independente sen ningún mantemento especial
  • servir como complemento para Prometheus para axudar coas investigacións de erros

Non obstante, esta sinxeleza vén a costa de algúns compromisos. Un deles é non indexar o contido. Polo tanto, a busca de texto non é moi eficiente nin rica e non permite manter estatísticas sobre o contido do texto. Pero como Loki quere ser o equivalente grep e o complemento de Prometheus, isto non é unha desvantaxe.

Investigación de incidentes

Para comprender mellor por que Loki non necesita indexación, volvamos ao método de investigación de incidentes empregado polos desenvolvedores de Loki:

Loki - recollendo rexistros usando o enfoque de Prometheus
1 Alerta → 2 Panel de control → 3 Consulta adhoc → 4 Agregación de rexistros → 5 Rastrexo distribuído → 6 Solución!
(1 Aviso → 2 Panel → 3 Consulta adhoc → 4 Agregación de rexistros → 5 Rastrexo distribuído → 6 Solución!)

A idea é que recibamos algún tipo de alerta (Notificación de Slack, SMS, etc.) e despois:

  • mira os paneis de mando de Grafana
  • ver as métricas do servizo (por exemplo, en Prometheus)
  • mirar as entradas de rexistro (por exemplo, en Elasticsearch)
  • quizais bótalle un ollo ás trazas distribuídas (Jaeger, Zipkin, etc.)
  • e finalmente solucionar o problema orixinal.

Aquí, no caso da pila Grafana + Prometheus + Elasticsearch + Zipkin, terás que usar catro ferramentas diferentes. Para aforrar tempo, estaría ben poder facer todos estes pasos cunha soa ferramenta: Grafana. Cómpre sinalar que este enfoque de investigación implementouse en Grafana desde a versión 6. Así, faise posible acceder aos datos de Prometheus directamente desde Grafana.

Loki - recollendo rexistros usando o enfoque de Prometheus
Pantalla Explorer dividida entre Prometheus e Loki

Desde esta pantalla, podes ver rexistros en Loki relacionados coas métricas de Prometheus usando o concepto de pantalla dividida. Desde a versión 6.5, Grafana permítelle analizar o ID de rastrexo nas entradas do rexistro de Loki para seguir as ligazóns ás súas ferramentas de rastrexo distribuídas favoritas (Jaeger).

Proba local de Loki

A forma máis sinxela de probar Loki localmente é usar docker-compose. O ficheiro docker-compose atópase no repositorio de Loki. Podes obter o repositorio co seguinte comando git:

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

Despois cómpre cambiar ao directorio de produción:

$ cd production

Despois diso, podes obter as últimas imaxes de Docker:

$ docker-compose pull

Finalmente, a pila de Loki iníciase co seguinte comando:

$ docker-compose up

Arquitectura Loki

Aquí tes un pequeno diagrama coa arquitectura de Loki:

Loki - recollendo rexistros usando o enfoque de Prometheus
Principios de arquitectura de Loki

O cliente web executa aplicacións no servidor, Promtail recolle rexistros e envíaos a Loki, o cliente web tamén envía metadatos a Loki. Loki agrega todo e pásao a Grafana.
Loki corre. Para ver os compoñentes dispoñibles, execute o seguinte comando:

$ docker ps

No caso dun Docker recén instalado, o comando debería devolver o seguinte resultado:

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

Vemos os seguintes compoñentes:

  • Promtail: axente responsable da centralización dos rexistros
  • Grafana: a famosa ferramenta de panel
  • Loki: daemon de centralización de datos

Como parte dunha infraestrutura clásica (por exemplo, baseada en máquinas virtuais), o axente Promtail debe implantarse en cada máquina. Grafana e Loki pódense instalar na mesma máquina.

Implementación en Kubernetes

A instalación de compoñentes de Loki en Kubernetes será a seguinte:

  • daemonSet para implantar o axente Promtail en cada unha das máquinas do clúster de servidores
  • Implementación de Loki
  • e o último é o despregamento de Grafana.

Afortunadamente, Loki está dispoñible como paquete Helm, o que facilita a súa implantación.

Instalación vía Heml

Xa deberías ter instalado Heml. Pódese descargar desde o repositorio de GitHub do proxecto. Instálase extraendo o arquivo axeitado para a súa arquitectura e engadindo helm $PATH.

Nota: A versión 3.0.0 de Helm publicouse recentemente. Dado que houbo moitos cambios nel, recoméndase ao lector que agarde un pouco antes de comezar a utilizalo..

Engadindo fonte para Helm

O primeiro paso é engadir o repositorio "loki" co seguinte comando:

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

Despois diso, pode buscar paquetes chamados "loki":

$ helm search loki

Resultado:

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

Estes paquetes teñen as seguintes características:

  • paquete loki/loki só coincide co servidor de Loki
  • paquete loki/fluent-bit permítelle implementar DaemonSet usando fluent-bin para recoller rexistros en lugar de Promtail
  • paquete loki/promtail contén un axente de recollida de rexistros
  • paquete loki/loki-pila, permítelle despregar inmediatamente Loki xunto con Promtail.

Instalando Loki

Para implementar Loki en Kubernetes, execute o seguinte comando no espazo de nomes "monitoring":

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

Para gardar no disco, engade a opción --set loki.persistence.enabled = true:

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

Nota: se queres implementar Grafana ao mesmo tempo, engade o parámetro --set grafana.enabled = true

Cando executas este comando, deberías obter a seguinte saída:

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.

Mirando o estado dos pods no espazo de nomes "monitoring", podemos ver que todo está despregado:

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

Resultado:

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

Todas as vainas están funcionando. Agora toca facer unhas probas!

Conectando a Grafana

Para conectarse a Grafana en Kubernetes, cómpre abrir un túnel ao seu pod. O seguinte é o comando para abrir o porto 3000 para un pod Grafana:

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

Outro punto importante é a necesidade de recuperar o contrasinal do administrador de Grafana. O contrasinal mantense en segredo loki-grafana en campo .data.admin-user en formato base64.

Para restauralo, cómpre executar o seguinte comando:

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

Use este contrasinal xunto coa conta de administrador predeterminada (admin).

Definición da fonte de datos de Loki en Grafana

En primeiro lugar, asegúrate de crear a fonte de datos de Loki (Configuración/Fonte de datos).
Aquí tes un exemplo:

Loki - recollendo rexistros usando o enfoque de Prometheus
Un exemplo de configuración dunha fonte de datos para Loki

Ao facer clic en "Probar" podes probar a conexión con Loki.

Facendo peticións a Loki

Agora vai a Grafana e vai á sección "Explorar". Ao recibir rexistros de contedores, Loki engade metadatos de Kubernetes. Así, faise posible ver os rexistros dun recipiente específico.

Por exemplo, para seleccionar rexistros de contedores de promtail, pode usar a seguinte consulta: {container_name = "promtail"}.
Non esquezas seleccionar aquí tamén a fonte de datos de Loki.

Esta consulta devolverá a actividade do contedor do seguinte xeito:

Loki - recollendo rexistros usando o enfoque de Prometheus
Resultado da consulta en Grafana

Engadindo ao panel de control

A partir de Grafana 6.4, é posible poñer a información do rexistro directamente no panel. Despois diso, o usuario poderá cambiar rapidamente entre o número de solicitudes do seu sitio e os rastros da aplicación.

A continuación móstrase un exemplo de panel de control que implementa esta interacción:

Loki - recollendo rexistros usando o enfoque de Prometheus
Exemplo de panel de control con métricas de Prometheus e rexistros de Loki

O futuro de Loki

Comecei a usar Loki en maio/xuño coa versión 0.1. Hoxe xa se publicou a versión 1, e mesmo a 1.1 e 1.2.

Hai que admitir que a versión 0.1 non era o suficientemente estable. Pero 0.3 xa mostraba sinais reais de madurez, e as seguintes versións (0.4, despois 1.0) só reforzaron esta impresión.

Despois da 1.0.0, ninguén pode ter unha escusa para non usar esta marabillosa ferramenta.

Outras melloras non deberían ser sobre Loki, senón sobre a súa integración co excelente Grafana. De feito, Grafana 6.4 xa ten unha boa integración cos paneis.

Grafana 6.5, que foi lanzado recentemente, mellora aínda máis esta integración ao recoñecer automaticamente o contido dos rexistros en formato JSON.

O seguinte vídeo mostra un pequeno exemplo deste mecanismo:

Loki - recollendo rexistros usando o enfoque de Prometheus
Usando cadeas de Loki representadas en Grafana

Faise posible usar un dos campos JSON, por exemplo, para:

  • ligazóns a unha ferramenta externa
  • filtrado de contido de rexistro

Por exemplo, pode facer clic en traceId para ir a Zipkin ou Jaeger.

Como de costume, agardamos os vosos comentarios e invitámosvos seminario web aberto, onde falaremos de como se desenvolveu a industria DevOps durante 2019 e discutiremos posibles camiños de desenvolvemento para 2020.

Fonte: www.habr.com