Cómo simplificar el análisis de registros de contenedores de Docker con Elastic Stack

El registro es un componente esencial dentro de cualquier aplicación. Los registros le permiten analizar y echar un vistazo a lo que sucede dentro del código de su aplicación como una historia. Los desarrolladores de software dedican una gran parte de su vida diaria a monitorear, solucionar problemas y depurar aplicaciones, lo que a veces puede ser una pesadilla. El registro permite a los desarrolladores de software hacer que este proceso agitado sea mucho más fácil y fluido.

Si ha colocado su aplicación en contenedores con una plataforma de contenedores como Docker, es posible que esté familiarizado con los registros de Docker.que le permite ver los registros creados dentro de su aplicación que se ejecuta dentro de su contenedor docker. Entonces, ¿por qué pensar en Elastic Stack para analizar sus registros? Bueno, aquí hay principalmente dos problemas candentes:

  • Imagine que tiene decenas, cientos o incluso miles de contenedores que generan registros; la conexión SSH en todos esos servidores y la extracción de registros no funcionará bien.
  • Además, los contenedores son inmutables y efímeros, lo que significa que tienen una vida útil más corta. Entonces, una vez que sus contenedores se acaban y se reemplazan con contenedores nuevos, todos los registros de su aplicación relacionados con contenedores antiguos desaparecen.

Entonces, la solución definitiva para esto es crear un componente de registro centralizado para recopilar todos los registros de su contenedor en un solo lugar. Aquí es donde entra Elastic Stacks.

Elastic Stack consta principalmente de cuatro componentes principales:

  • Beats es el nuevo miembro que hizo que ELK Stack se conociera como Elastic Stack. Los Beats son transportadores de datos de registro de peso ligero que pueden enviar registros al ELK Stack. Para esta publicación, usaré Filebeats, un miembro de la familia Beats, que ofrece una forma liviana de recopilar, reenviar y centralizar registros y archivos.
  • Logstash es un componente que agrega, modifica y transfiere registros desde múltiples ubicaciones de entrada a Elasticsearch.
  • Elasticsearch esun motor de análisis y búsqueda distribuido basado en JSON que almacena e indexa datos (entradas de registro en este caso) de manera escalable y manejable.
  • Kibana es una interfaz de usuario enriquecida para analizar y acceder fácilmente a los datos en Elasticsearch.

En esta publicación, veremos cómo utilizar los componentes mencionados anteriormente e implementar un analizador de registros centralizado para recopilar y extraer registros de los contenedores de Docker.

Para los propósitos de este artículo, he usado dos instancias t2.small AWS EC2, ejecutando Ubuntu 18.04 instalado con Docker y Docker compose. La instancia 1 está ejecutando una aplicación web Tomcat y la instancia 2 está ejecutando la pila ELK (Elasticsearch, Logstash, Kibana).

En Linux, de forma predeterminada, los registros de la ventana acoplable se pueden encontrar en esta ubicación:

/ var / lib / docker / containers // gt; -json.log

Todos los registros de la ventana acoplable se recopilarán a través de Filebeat que se ejecuta dentro de la máquina host como un contenedor. Filebeat se instalará en cada máquina host de la ventana acoplable (usaremos un archivo acoplable Filebeat personalizado y una unidad systemd para esto, que se explicará en la sección Configuración de Filebeat).

Nuestra aplicación web de Tomcat escribirá registros en la ubicación anterior utilizando el controlador de registro de Docker predeterminado. Filebeat luego extraerá los registros de esa ubicación y los empujará hacia Logstash.

Otra cosa importante a tener en cuenta es que, además de los registros generados por la aplicación, también necesitamos metadatos asociados con los contenedores, como el nombre del contenedor, la imagen, las etiquetas, el host, etc. Esto nos permitirá identificar específicamente el host y el contenedor exactos que están generando los registros. . Estos datos también pueden ser enviados fácilmente por Filebeat junto con las entradas del registro de la aplicación.

Al realizar este tipo de implementación, los contenedores en ejecución no necesitan preocuparse por el controlador de registro, cómo se recopilan y envían los registros. Filebeat se encargará de ellos. Esto a menudo se conoce como principio de responsabilidad única.

Configuración de Filebeat

Para esta sección, filebeat.yml y Dockerfile se obtuvieron del repositorio github sample-filebeat-docker-logging de Bruno COSTE. Muchas gracias a su increíble trabajo. Pero como hice varios cambios en filebeat.yml de acuerdo con los requisitos de este artículo, los he alojado con filebeat.service (archivo systemd) por separado en mi propio repositorio. Puede acceder al repositorio aquí.

Como paso inicial, debe actualizar su archivo filebeat.yml que contiene las configuraciones de Filebeat. A continuación se muestra un archivo filebeat.yml de muestra que puede utilizar. Tenga en cuenta la línea 21, el campo output.logstash y el campo hosts. Lo he configurado a la dirección IP del servidor en el que estoy ejecutando mi pila ELK, pero puede modificarlo si está ejecutando Logstash en un servidor separado. De forma predeterminada, Logstash está escuchando Filebeat en el puerto 5044.

Para obtener más información sobre los parámetros de configuración de Filebeat Docker, consulte aquí.

Después de eso, puede crear su propia imagen de Filebeat Docker utilizando el siguiente Dockerfile.

Una vez creada la imagen, puede insertarla en el repositorio de su ventana acoplable. Ahora que tiene la capacidad de ejecutar Filebeat como un contenedor de ventana acoplable, solo es cuestión de ejecutar el contenedor de Filebeat en sus instancias de host que ejecutan contenedores. Aquí está el comando docker run.

docker run -v '/var/lib/docker/containers:/usr/share/dockerlogs/data:ro' -v '/var/run/docker.sock:/var/run/docker.sock' --name filebeat ${YOUR_FILEBEAT_DOCKER_IMAGE}:latest

En el comando de Docker anterior, tenga en cuenta los dos parámetros de montaje de enlace: / var / lib / docker / containers es la ruta donde existen los registros de docker dentro de la máquina host, y se ha vinculado a / usr / share / dockerlogs / data path dentro de Filebeat contenedor con acceso de solo lectura. En el segundo argumento de montaje de enlace, /var/run/docker.sock está enlazado al demonio Docker del contenedor Filebeat. Es el socket Unix en el que escucha el demonio Docker de forma predeterminada y se puede usar para comunicarse con el demonio desde dentro de un contenedor. Esto permite que nuestro contenedor Filebeat obtenga metadatos de Docker y enriquezca las entradas de registro del contenedor junto con los metadatos y los envíe a la pila ELK.

Si desea automatizar este proceso, he escrito un archivo de unidad Systemd para administrar Filebeat como servicio.

Configuración de ELK Stack

Para esto, usaré mi segunda instancia EC2, donde ejecuto la pila ELK. Puede hacer esto simplemente instalando Docker compose y revisando este increíble repositorio de deviantony / docker-elk y simplemente ejecutando docker-compose up -d

Tenga en cuenta que todas las reglas de su firewall permiten el tráfico entrante en Logstash, Elasticsearch y Kibana.

Antes de ejecutar la pila ELK, debe asegurarse de que su archivo logstash.conf esté configurado correctamente para escuchar los registros de beats entrantes en el puerto 5044 y que los registros se agreguen correctamente al host de elasticsearch. Además, debe asegurarse de agregar un parámetro de índice a su Elasticsearch para identificar los registros generados por Filbeat de manera única.

En su repositorio docker-elk puede encontrar su archivo logstash.conf siguiendo docker-elk / logstash / pipeline pathname. Este es el archivo de configuración para configurar las configuraciones de Logstash. Debe actualizarlo de la siguiente manera:

Una vez que lo haga, puede acceder a su panel de Kibana en el puerto 5601 de forma predeterminada, como se define en el archivo docker-compose.yml en el repositorio deviantony / docker-elk.

En la pestaña de administración, puede crear un patrón de índice para los registros de Filebeat. Esto debe hacerse antes de poder ver los registros en el panel de Kibana.

Si sus contenedores están enviando registros correctamente a Elasticsearch a través de Logstash y ha creado correctamente el patrón de índice, puede ir a la pestaña Descubrir en el panel de Kibana y ver los registros de la aplicación del contenedor de Docker junto con los metadatos de Docker en el patrón de índice filebeat *.

Referencias

  1. //www.elastic.co/guide/en/beats/filebeat/current/filebeat-getting-started.html
  2. //medium.com/@bcoste/powerful-logging-with-docker-filebeat-and-elasticsearch-8ad021aecd87
  3. //www.elastic.co/guide/en/logstash/current/configuration.html
  4. //medium.com/lucjuggery/about-var-run-docker-sock-3bfd276e12fd