Ingeniería

Detección automática con Beats basada en sugerencias de Docker y Kubernetes

A partir de la versión 6.0, empezamos a agregar nuevas características a Beats, para así mejorar nuestro soporte para el monitoreo de contenedores. Recientemente, presentamos una nueva característica: Detección automática en Filebeat y Metricbeat, con soporte para Docker y Kubernetes. La detección automática te permite definir un conjunto de configuraciones que se lanzarán dinámicamente mediante Beats cuando lo desees. Esta característica es especialmente útil para el monitoreo de contenedores, debido a su naturaleza dinámica.

El desafío del monitoreo de contenedores

Con la infraestructura tradicional, normalmente instalarías un nuevo host, configurarías todos los servicios para que se ejecuten en este y configurarías el agente de monitoreo para realizar una búsqueda periódicamente. Las herramientas de gestión de configuración ayudan en la tarea, pero las cosas siguen estando bastante estáticas.

Con la arquitectura de contenedores todo se convierte en un blanco móvil. Los despliegues son dinámicos, crecen, se reducen y desaparecen, los contenedores van y vienen de un nodo a otro. No hay una IP fija de la cual recuperar tus métricas.

Necesitamos herramientas específicas para rastrear las cosas.

Beats autodiscover schematics

Detección automática

Veamos cómo funciona, esto es un ejemplo de configuración:

metricbeat.autodiscover:
  providers:
   - type: docker
     templates:
       - condition.contains:
           docker.container.image: etcd
         config:
          - module: etcd
            metricsets: ["leader", "self", "store"]
            hosts: "${data.host}:2379"

output.elasticsearch:
  hosts: ["localhost:9200"]

Esto está configurando Metricbeat para usar el proveedor de detección automática de Docker. Puedes definir una lista de plantillas para usar, vinculadas a la condición que debería activarlas. En este caso, la condición es que coincida con la imagen del contenedor que contiene etcd (usamos contiene ya que el campo de imagen almacena los pares nombre:etiqueta). Cuando se crea un contenedor etcd, Metricbeat lanzará el módulo etcd para monitorearlo y reemplazará la variable ${data.host} por la dirección IP del contenedor.

Veamos cómo funciona todo esto detalladamente:

1. Eventos de detección automática

La detección automática de Beats tiene soporte para múltiples proveedores, y Kubernetes y Docker están actualmente disponibles. Los proveedores implementan una forma de observar los eventos en una plataforma específica. Cuando ocurre un evento, el proveedor emite un evento de detección automática que contiene toda la información que puedes necesitar para responder a este.

2. Coincidencia de la condición

Cada evento se compara con una lista de condiciones, y se usa el mismo formato de configuración que los procesadores. Si una de las condiciones coincide con el evento, se generará el conjunto dado de configuraciones para este.

3. Expansión de variables

Las plantillas de configuración pueden contener variables, que se sustituyen por valores reales del evento que desencadenó la condición. Este mecanismo te permite definir las configuraciones dinámicas que pueden depender del estado de un contenedor, como la dirección IP. Pero también permite configuraciones más complejas, mediante el uso de etiquetas y anotaciones.

4. Configuración de Iniciar/Detener

Una vez creada la configuración final, se lanzará mediante el proceso de detección automática. Las configuraciones válidas incluyen módulos en Metricbeat y Filebeat, así como entradas en este último.

Hay eventos tanto de inicio como de detención, por lo que una configuración lanzada por la detección automática se detendrá automáticamente una vez que el contenedor desaparezca. Esto no requiere ninguna configuración especial.

Una buena característica adicional al usar la detección automática es que todos los eventos que surgen de esta se enriquecerán automáticamente con los metadatos de Docker o Kubernetes, por lo que no hay necesidad de usar los procesadores adddockermetadata o addkubernetesmetadata. Estos metadatos te ayudarán al navegar por los logs y las métricas, ya que te permitirán filtrarlos y centrarte en lo que importa.

Presentación de sugerencias

Con el lanzamiento de la versión 6.3, ahora puedes usar sugerencias para definir cómo monitorear tus contenedores. Tradicionalmente, era necesario actualizar el archivo de configuración de Beats para configurar el monitoreo de una aplicación recién desplegada.

La detección automática basada en sugerencias invierte el control de la configuración de monitoreo, ya que te permite almacenarla junto al contenedor de la aplicación en vez de en un lugar central. Esto significa que el equipo a cargo de la construcción y el despliegue de una app puede asumir la responsabilidad de definir cómo monitorearla.

Esta configuración permite la detección automática basada en sugerencias para los logs de contenedores de Kubernetes (este cambio se puede hacer en nuestro hacer referencia al manifiesto de Kubernetes para Filebeat, por ejemplo):

filebeat.autodiscover:
  providers:
    - type: kubernetes
      hints.enabled: true

Eso es todo, puedes usar las anotaciones de Kubernetes Pod o las etiquetas de Docker para indicar a Filebeat y Metricbeat cómo tratar los logs de los contenedores. Por ejemplo, si estás ejecutando una aplicación Java en un Pod, puedes añadirle estas anotaciones:

annotations:
  co.elastic.logs/multiline.pattern: '^\['
  co.elastic.logs/multiline.negate: 'true'
  co.elastic.logs/multiline.match: after

Cuando se inicie el Pod, Filebeat procesará las anotaciones y comenzará a leer sus logs con el patrón multilínea dado, con la intención de juntar todos los rastros del stack de Java. Puedes consultar la documentación para obtener una lista completa de las sugerencias disponibles.

También puedes usar módulos para procesar los logs en datos estructurados; por ejemplo, si estás ejecutando un servidor NGINX, solo tienes que añadir estas anotaciones y todos sus logs se procesarán para proporcionarte información sobre tus visitas:

annotations:
  co.elastic.logs/module: nginx
  co.elastic.logs/fileset.stdout: access
  co.elastic.logs/fileset.stderr: error

Como puedes ver, se hace un mapeo de cada flujo de la salida del log a un conjunto de archivos diferente. También puedes hacer un mapeo de todos los flujos a un conjunto de archivos único al definir solo co.elastic.logs/fileset.

También puedes aprovechar las sugerencias cuando usas Metricbeat; así es cómo configurarías la misma instancia de NGINX para hacer que Metricbeat obtenga métricas de esta. Como puedes ver, la expansión de variable también está disponible aquí; ${data.host} se usa para extraer la dirección IP del contenedor.

annotations:
  co.elastic.metrics/module: nginx
  co.elastic.metrics/metricsets: stubstatus
  co.elastic.metrics/hosts: '${data.host}:80'
  co.elastic.metrics/period: 10s

Ten en cuenta que puedes usar ambos conjuntos de sugerencias juntos si estás ejecutando tanto Filebeat como Metricbeat.

Resumen

La detección automática basada en las sugerencias traslada la configuración de los ajustes del monitoreo junto a las aplicaciones que deseas monitorear. Esto les ofrece las herramientas adecuadas a los equipos, especialmente en escenarios de varios inquilinos. También ofrece un simple conjunto de instrucciones con las que se puede trabajar, lo que hace que la experiencia sea simple y precisa.

Hemos tratado superficialmente lo que puedes hacer con la detección automática. Nos encantaría recibir tus comentarios y conocer más sobre cómo la usas. No dudes en visitar nuestro foro de Beats y cuéntanos sobre tu experiencia.