¡Hola, amigos de Habr! Con la llegada de un nuevo grupo para el curso hemos preparado para ustedes la traducción de un material interesante.
Este artículo es una breve introducción a Loki. El proyecto Loki y está dirigido a la recopilación centralizada de registros (desde servidores o contenedores).
La principal fuente de inspiración para Loki fue con la idea de aplicar sus enfoques a la gestión de registros:
- uso de etiquetas (labels) para almacenar datos
- consumir pocos recursos
Volveremos a los principios de funcionamiento de Prometheus y proporcionaremos algunos ejemplos de su uso en el contexto de Kubernetes.
Algunas palabras sobre Prometheus
Para comprender completamente cómo funciona Loki, es importante dar un paso atrás y recordar un poco sobre Prometheus.
Una de las características distintivas de Prometheus es la extracción de métricas desde puntos de recolección (a través de exportadores) y su almacenamiento en TSDB (Base de Datos de Series Temporales) con la adición de metadatos en forma de etiquetas.
¿Por qué es necesario?
Recientemente, Prometheus se ha convertido en el estándar de facto en el mundo de los contenedores y Kubernetes: su instalación es muy sencilla y en un clúster de Kubernetes hay, por defecto, un endpoint para Prometheus. Prometheus también puede extraer métricas de aplicaciones desplegadas en contenedores, manteniendo ciertas etiquetas. Por lo tanto, la supervisión de aplicaciones es muy fácil de implementar.
Desafortunadamente, todavía no hay una solución 'llave en mano' para la gestión de registros y debes encontrar una solución para ti:
- un servicio en la nube gestionado para la centralización de registros (AWS, Azure o Google)
- un servicio de monitoreo 'monitoreo como servicio' (por ejemplo, Datadog)
- crear tu propio servicio de recopilación de registros.
Para la tercera opción, tradicionalmente he utilizado Elasticsearch, aunque no siempre he estado satisfecho con él (especialmente por su pesadez y complejidad de configuración).
Loki fue diseñado con el objetivo de simplificar su implementación de acuerdo con los siguientes principios:
- ser fácil de iniciar
- consumir pocos recursos
- funcionar de manera autónoma sin ningún mantenimiento especial
- servir como complemento de Prometheus para ayudar en la investigación de errores
Sin embargo, esta simplicidad se logra a expensas de algunos compromisos. Uno de ellos es no indexar el contenido. Por lo tanto, la búsqueda de texto no es muy eficiente o rica y no permite llevar estadísticas sobre el contenido del texto. Pero dado que Loki quiere ser equivalente a grep y un complemento para Prometheus, esto no es una desventaja.
Investigación de incidentes
Para entender mejor por qué Loki no necesita indexación, volvamos al método de investigación de incidentes que utilizaron los desarrolladores de Loki:

1 Alerta → 2 Dashboard → 3 Consulta Adhoc → 4 Agregación de registros → 5 Trazado distribuido → 6 ¡Solucionar!
(1 Alerta → 2 Dashboard → 3 Consulta Adhoc → 4 Agregación de registros → 5 Trazado distribuido → 6 ¡Solucionar!)
La idea es que recibimos alguna alerta (notificación de Slack, SMS, etc.) y después:
- miramos los dashboards de Grafana
- vemos las métricas de los servicios (por ejemplo, en Prometheus)
- revisamos los registros (por ejemplo, en Elasticsearch)
- posiblemente, echamos un vistazo a los trazos distribuidos (Jaeger, Zipkin, etc.)
- y, finalmente, solucionamos el problema subyacente.
Aquí, en el caso de la pila Grafana + Prometheus + Elasticsearch + Zipkin, se tendrán que usar cuatro herramientas diferentes. Para reducir el tiempo, sería ideal poder realizar todos estos pasos utilizando una sola herramienta: Grafana. Es importante señalar que este enfoque de investigación se implementó en Grafana a partir de la versión 6. Así, se hace posible acceder a los datos de Prometheus directamente desde Grafana.

La pantalla Explorer se divide entre Prometheus y Loki
En esta pantalla se pueden ver los registros en Loki relacionados con las métricas de Prometheus, utilizando el concepto de pantalla dividida. Desde la versión 6.5, Grafana permite manejar el identificador de trazado (trace id) en los registros de Loki para acceder a sus herramientas de trazado distribuido favoritas (Jaeger).
Prueba local de Loki
La forma más sencilla de probar Loki localmente es usar docker-compose. El archivo docker-compose se encuentra en el repositorio de Loki. Se puede obtener el repositorio con el siguiente comando git:
$ git clone https://github.com/grafana/loki.gitLuego, necesita ingresar al directorio de producción:
$ cd productionDespués de esto, puede obtener la última versión de las imágenes de Docker:
$ docker-compose pullFinalmente, la pila de Loki se inicia con el siguiente comando:
$ docker-compose upArquitectura de Loki
Aquí hay un pequeño diagrama con la arquitectura de Loki:

Principios de la arquitectura de Loki
El cliente web ejecuta aplicaciones en el servidor, Promtail recopila los registros y los envía a Loki, el cliente web también envía metadatos a Loki. Loki los agrega y los envía a Grafana.
Loki está en funcionamiento. Para ver los componentes disponibles, ejecute el siguiente comando:
$ docker psEn caso de que se haya instalado Docker recientemente, el comando debería devolver el siguiente resultado:
IMAGEN PUERTOS NOMBRES
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_1Vemos los siguientes componentes:
- Promtail: agente responsable de la centralización de registros
- Grafana: herramienta conocida para dashboards
- Loki: demonio de centralización de datos
Dentro de una infraestructura clásica (por ejemplo, basada en máquinas virtuales), cada máquina debe tener un agente Promtail desplegado. Grafana y Loki pueden ser instalados en una sola máquina.
Despliegue en Kubernetes
La instalación de los componentes de Loki en Kubernetes consistirá en lo siguiente:
- daemonSet para desplegar el agente Promtail en cada una de las máquinas del clúster de servidores
- despliegue (Deployment) de Loki
- y por último, el despliegue de Grafana.
Afortunadamente, Loki está disponible como un paquete Helm, lo que simplifica su despliegue.
Instalación a través de Helm
Helm ya debería estar instalado en su sistema. Se puede descargar desde el repositorio de GitHub del proyecto. Se instala descomprimiendo el archivo correspondiente a su arquitectura y agregando helm a $PATH.
Nota: la versión 3.0.0 de Helm fue lanzada recientemente. Debido a que se hicieron muchos cambios, se recomienda al lector esperar un poco antes de comenzar a usarla..
Agregar fuente para Helm
El primer paso será agregar el repositorio 'loki' con el siguiente comando:
$ helm add loki https://grafana.github.io/loki/chartsDespués de esto, se pueden buscar paquetes con el nombre 'loki':
$ helm search lokiResultado:
loki/loki 0.17.2 v0.4.0 Loki: como Prometheus, pero para registros.
loki/loki-stack 0.19.1 v0.4.0 Loki: como Prometheus, pero para registros.
loki/fluent-bit 0.0.2 v0.0.1 Usa el plugin de Loki para fluent-bit para...
loki/promtail 0.13.1 v0.4.0 Responsable de recopilar registros y...Estos paquetes tienen las siguientes funcionalidades:
- paquete loki/loki corresponde únicamente al servidor Loki
- paquete loki/fluent-bit le permite desplegar DaemonSet, utilizando fluent-bit para recopilar registros en lugar de Promtail
- paquete loki/promtail contiene el agente de recopilación de registros
- paquete loki/loki-stack, permite desplegar Loki junto con Promtail de una vez.
Instalación de Loki
Para desplegar Loki en Kubernetes, ejecute el siguiente comando en el espacio de nombres 'monitoring':
$ helm upgrade --install loki loki/loki-stack --namespace monitoringPara guardar en disco, agregue el parámetro --set loki.persistence.enabled = true:
$ helm upgrade --install loki loki/loki-stack
--namespace monitoring
--set loki.persistence.enabled=trueNota: si desea desplegar Grafana al mismo tiempo, agregue el parámetro
--set grafana.enabled = true
Al ejecutar este comando, debería obtener la siguiente salida:
ÚLTIMO DESPLIEGUE: Mar Nov 19 15:56:54 2019
NOMBRE DEL ESPACIO: monitoring
ESTADO: DESPLEGADO
RECURSOS:
==> v1/ClusterRole
NOMBRE EDAD
loki-promtail-clusterrole 189d
…
NOTAS:
La pila de Loki ha sido desplegada en tu clúster. Loki ahora puede ser agregado como una fuente de datos en Grafana.
Ver <a href="http://docs.grafana.org/features/datasources/loki/">http://docs.grafana.org/features/datasources/loki/</a> para más detalles.Al revisar el estado de los pods en el espacio de nombres “monitoring”, veremos que todo está desplegado:
$ kubectl -n monitoring get pods -l release=lokiResultado:
NOMBRE LISTO ESTADO REINICIOS EDAD
loki-0 1/1 En ejecución 0 147m
loki-promtail-9zjvc 1/1 En ejecución 0 3h25m
loki-promtail-f6brf 1/1 En ejecución 0 11h
loki-promtail-hdcj7 1/1 En ejecución 0 3h23m
loki-promtail-jbqhc 1/1 En ejecución 0 11h
loki-promtail-mj642 1/1 En ejecución 0 62m
loki-promtail-nm64g 1/1 En ejecución 0 24mTodos los pods están en funcionamiento. ¡Ahora es el momento de hacer algunas pruebas!
Conectándose a Grafana
Para conectarse a Grafana desde Kubernetes, es necesario abrir un túnel a su pod. A continuación se muestra el comando para abrir el puerto 3000 para el pod de Grafana:
$ kubectl -n port-forward monitoring svc/loki-grafana 3000:80Otro aspecto importante es la necesidad de recuperar la contraseña del administrador de Grafana. La contraseña se almacena en el secreto loki-grafana en el campo .data.admin-user en formato base64.
Para recuperarla, ejecute el siguiente comando:
$ kubectl -n monitoring get secret loki-grafana
--template '{{index .data "admin-password" | base64decode}}'; echoUse esta contraseña junto con la cuenta de administrador predeterminada (admin).
Definiendo el origen de datos Loki en Grafana
Primero, asegúrese de que se haya creado el origen de datos Loki (Configuración / Origen de datos).
Aquí hay un ejemplo:

Ejemplo de configuración del origen de datos para Loki
Al hacer clic en “Probar”, puede verificar la conexión con Loki.
Realizando consultas a Loki
Ahora dirígete a Grafana en la sección “Explorar”. Al recibir registros de los contenedores, Loki agrega metadatos de Kubernetes. Así, es posible ver los registros de un contenedor específico.
Por ejemplo, para seleccionar los registros del contenedor promtail, puedes usar la siguiente consulta: {container_name = "promtail"}.
Aquí tampoco olvide seleccionar el origen de datos Loki.
Esta consulta devolverá la actividad de los contenedores en la siguiente forma:

Resultado de la consulta en Grafana
Añadiendo al tablero
A partir de Grafana 6.4, se puede colocar la información de los registros directamente en el tablero. Después de esto, el usuario podrá alternar rápidamente entre la cantidad de solicitudes en su sitio y los rastreos de la aplicación.
A continuación, se muestra un ejemplo de un panel que implementa esta interacción:

Ejemplo de panel con métricas de Prometheus y registros de Loki
El futuro de Loki
Comencé a usar Loki en mayo/junio con la versión 0.1. Hoy ya se ha lanzado la versión 1, e incluso las 1.1 y 1.2.
Es necesario reconocer que la versión 0.1 no fue lo suficientemente estable. Pero la 0.3 mostró verdaderas señales de madurez, y las versiones siguientes (0.4, luego 1.0) solo reforzaron esta impresión.
Después de 1.0.0, nadie puede tener excusas para no usar esta magnífica herramienta.
Las mejoras futuras deben centrarse no en Loki, sino más bien en su integración con la excelente Grafana. De hecho, en Grafana 6.4 ya apareció una buena integración con los paneles.
Grafana 6.5, que se lanzó recientemente, mejora aún más esta integración, reconociendo automáticamente el contenido de los registros en formato JSON.
A continuación en el video hay un pequeño ejemplo de este mecanismo:

Uso de las cadenas de Loki mostradas en Grafana
Es posible utilizar uno de los campos JSON, por ejemplo, para:
- vínculo a una herramienta externa
- filtrado de contenido de registros
Por ejemplo, puede hacer clic en traceId para ir a Zipkin o Jaeger.
Tradicionalmente esperamos sus comentarios y los invitamos a , donde hablaremos sobre cómo ha evolucionado la industria de DevOps durante 2019 y discutiremos posibles vías de desarrollo para 2020.
Fuente: habr.com
