Ingeniería

Monitoreo de contenedores de Docker y Kubernetes con Beats: logs, métricas y metadatos

Este blog trata sobre el monitoreo de un entorno de contenedores: puede incluir Google Kubernetes Engine (GKE), IBM Cloud Kubernetes Service y cualquier otro entorno de Kubernetes (k8s) y Docker. Sin embargo, para los propósitos de este blog, estaremos usando el IBM Cloud Kubernetes Service.

Es posible que te preguntes por qué escribimos sobre monitorear contenedores Docker y Kubernetes. Seguramente los proveedores del servicio de la nube manejan la infraestructura y solo podemos preocuparnos por nuestra aplicación, ¿cierto? Puede que tengas razón, pero somos el tipo de persona que revisa las críticas de Yelp incluso si hemos recibido recomendaciones personales; mientras más información tengo, mejor. Queremos que todos los registros y las métricas de aplicación y su entorno estén disponibles y queremos poder buscarlos, visualizarlos y estar pendiente de ellos al mismo tiempo. Ese monitoreo de contenedores típico es muy bueno, pero también vamos a mostrarte una forma genial de usar eventos de Kubernetes y metadatos para anotar las notificaciones sobre actualizaciones escaladas o continuas en mi gráfico de rendimiento de la aplicación.

Antes de seguir, es importante definir un par de términos.

  • Registro: una marca de tiempo y un mensaje. Esto incluiría las entradas de registro típicas como “NGINX started at 13:42” (NGINX comenzó a las 13:42) y también eventos k8s como “There was an NGINX container with a Back-off restarting failed container at 16:20” (Hubo un contenedor NGINX con retroceso reiniciando el contenedor fallido a las 16:20”).
  • Métrica: una medida numérica recolectada en un período de tiempo fijo. Puede ser “las ventas a través de la página de comercio electrónico fueron de $50 000 durante los últimos diez minutos” o “la utilización de CPU fue del 17 % desde las 14:00:00 hasta las 14:00:10”.

Implementación de aplicaciones en un cluster de Kubernetes

Para el ejemplo, vamos a usar esta aplicación basada en Apache HTTP Server, PHP y Redis.

k8s-module-1.png

Además, para monitorear la infraestructura de la aplicación y el contenedor tenemos: 

  • Una implementación de Elasticsearch Service hospedada en Elastic Cloud.
  • Beats: los transportadores ligeros de registros y métricas implementadas como un DaemonSet en el mismo cluster de Kubernetes. Ten en cuenta que esto puede reemplazar al Fluentd que se implementa normalmente en un cluster de Kubernetes.

Registros y métricas

La aplicación mencionada anteriormente es solo una parte de un ecosistema que constantemente está generando información útil que deberíamos capturar. Estos son los niveles de los cuales recolectamos esos registros y métricas:

  1. Orquestación (Kubernetes)
  2. Hosts
  3. Aplicación
  4. Contenedor (Docker)

k8s-module-2.png

Para recolectar los datos, usamos Beats (Filebeat, Metricbeat y Packetbeat) y los módulos System, Kubernetes y Docker junto con módulos para la aplicación (Apache y Redis). Implementamos un DaemonSet por cada Beat y dejamos que los Kubernetes los administren. Si te parece una lista larga, no entres en pánico; el autodescubrimiento de los Beats lo mantienen simple. Los detalles sobre implementar los Beats para monitorear una aplicación están en este blog y el video que lo acompaña. De hecho, si quieres comenzar por el principio ve a la página de monitoreo de contenedores en Elastic.

Para indexar, almacenar, buscar, analizar y visualizar los datos, usé el servicio hospedado Elasticsearch Service. Cómo implementarlo en Elastic Cloud se detalla en nuestra página de introducción, así como la implementación de Elasticsearch y Kibana en un sistema que administras tú mismo. De cualquier manera, funciona muy bien.

Mencionamos los Beats y módulos, y ellos se merecen una mejor presentación. Un Beat es un agente ligero que envía datos a Elasticsearch o Logstash. A veces, los Beats se implementan en donde se originan los datos, como en un sistema virtual o físico, y a veces se implementan junto con las fuentes, por ejemplo, como un DaemonSet (que es lo que hice aquí). Los módulos simplifican la recolección, clasificación, indexación y visualización de formatos de registro comunes.

Eso sonó un poco aburrido; vamos a decirlo de esta forma: los módulos de Elastic son una experiencia precomprimida. Digamos que sabes todo sobre administrar Apache HTTPD Server, pero NGINX es algo nuevo para ti. Podrías buscar a alguien que sepa sobre eso y preguntarle “¿Qué es lo que buscas en los registros? ¿Qué métricas vigilas? ¿Puedes darme los greps de tu archivo del historial?” Las respuestas a esas preguntas, para mí, definen los módulos de Beat; paneles de control precomprimidos, búsquedas guardadas, clasificación y recolección de un montón de cosas como Kubernetes, Docker, NGINX, Apache, sistemas operativos, bases de datos, etc. En nuestra experiencia, es un conjunto muy poderoso de capacidades.

El módulo k8s recolecta métricas relacionadas con pods, nodos, volúmenes, ReplicaSets, implementaciones, etc. Cada métrica tiene un conjunto rico de metadatos unidos a ella para que puedas ligar los datos a tu aplicación. Por ejemplo, puede que no te importe que el pod xyz esté cerca del límite de la memoria de uso, pero si esa métrica parece estar asociada con el frontend de tu aplicación, entonces conoces el valor de tu negocio. También recolecta eventos (recuerda que incluí los eventos de Kubernetes en la definición anterior de registro), los cuales usaremos para enriquecer un gráfico de rendimiento en el video a continuación.

El módulo de Docker recolecta las métricas relacionadas con los contenedores, hosts, memoria, redes, controles de estado, etc. Como el módulo de Kubernetes, los metadatos son muy valiosos para entender el rendimiento de tu aplicación y el entorno.

Hay muchos otros módulos para Filebeat y Metricbeat. Además, Packetbeat se entrega con muchos paneles de control para servicios como Cassandra, Flows, HTTP, MySQL, MongoDB, etc.

Ya verás lo fácil que es convertir los datos en inteligencia procesable. El video muestra lo siguiente:

  • Visualizar eventos de Kubernetes con métricas de rendimiento de aplicación
  • Explorar el conjunto de métricas de eventos del módulo de Kubernetes Metricbeat
  • Navegar por los eventos de Kubernetes y crear la visualización personalizada