GNU/Linux >> Tutoriales Linux >  >> Panels >> Docker

Implementación de una pila EFK con Docker

El monitoreo y el análisis de registros se han vuelto críticos hoy en día, ya sea para aplicaciones o infraestructura de servidor/contenedor. Una de las pilas de software más populares para el análisis y la supervisión de registros que puede elegir es Elasticsearch, Fluentd y Kibana (pila EFK).

EFK stack es un motor de búsqueda distribuido y escalable que permite realizar búsquedas y análisis estructurados. Y en este tutorial, aprenderá cómo configurar el monitoreo de registros de pila de EFK con Docker y centralizar los registros de contenedores en la pila de EFK.

¿Listo? ¡Siga leyendo y facilite su análisis de registros!

Requisitos

Este tutorial comprende demostraciones prácticas. Para seguir, asegúrese de tener lo siguiente:

  • Un host Linux:este ejemplo utiliza el servidor Debian 11 Bullseye con una capacidad de memoria de 6 GB.
  • Un Docker CE (Community Edition) y Docker Compose instalados en su host Linux.

Configuración de un proyecto de pila EFK

EFK Stack es un marco de análisis de registros y agregación de registros listo para la empresa para infraestructura de contenedores y sin sistema operativo. Pero antes de implementar una pila EFK, primero configurará un directorio de proyecto y creará una configuración de Docker para implementar EFK Stack en su host Docker.

Para este ejemplo, utilizará imágenes de Docker con las siguientes especificaciones:

  • Elasticsearch 7.17.0:capaz de almacenar datos con capacidades de búsqueda rápidas basadas en Apache Lucene
  • Kibana 7.17.0:agregación y recopilador de datos de código abierto que admite datos JSON, y
  • Imagen personalizada de Fluentd basada en v1.14.1:software de visualización de datos para Elasticsearch.

Para configurar su proyecto de pila EFK:

1. Abra una terminal e inicie sesión en su servidor.

2. Ejecute los siguientes comandos para verificar que Docker y Docker Compose estén instalados en su sistema.

# Checking Docker version
docker --version

# Checking docker-compose version
docker-compose version

Como puede ver a continuación, las versiones instaladas de Docker CE (Community Edition) v20.10.12 y Docker Compose v1.29.2.

3. Ejecute el siguiente comando para crear un nuevo directorio de proyecto (mkdir ) y configúrelo como el directorio de trabajo (cd ).

Puede nombrar el directorio como prefiera, pero en este tutorial, el directorio se llama efk. Este directorio almacenará todos los archivos de configuración de EFK Stack en este tutorial.

mkdir -p ~/efk; cd ~/efk

4. Ahora, cree un nuevo archivo de configuración (docker-compose.yml ) utilizando su editor preferido y complete las siguientes configuraciones.

La siguiente configuración usa el script Docker Compose v3 y define todos los contenedores de pila EFK.

version: "3"

# Define the Docker volume named esdata for the Elasticsearch container.
volumes:
  esdata:

# Deploying three container services (fluentd, elasticsearch, and kibana)
services:
	# Deploy using the custom image automatically be created during the build process.
  fluentd: 
    build: ./fluentd
    links: # Sends incoming logs to the elasticsearch container.
      - elasticsearch
    depends_on:
      - elasticsearch
    ports: # Exposes the port 24224 on both TCP and UDP protocol for log aggregation
      - 24224:24224
      - 24224:24224/udp

	# Created using the Docker image elasticsearch:7.17.0
  elasticsearch:
    image: elasticsearch:7.17.0
    expose: # Exposes the default port 9200
      - 9200
    environment:
      - discovery.type=single-node # Runs as a single-node
    volumes: # Stores elasticsearch data locally on the esdata Docker volume
      - esdata:/usr/share/elasticsearch/data

	# Created using the Docker image kibana:7.17.0
  kibana:
    image: kibana:7.17.0
    links: # Links kibana service to the elasticsearch container
      - elasticsearch
    depends_on:
      - elasticsearch
    ports: # Runs kibana service on default port 5601
      - 5601:5601
    environment: # Defined host configuration
      - ELASTICSEARCH_HOSTS=http://elasticsearch:9200

5. Ejecute el siguiente comando para crear un nuevo directorio fluentd y navegue a ese directorio. El fluentd el directorio almacenará fluentd configuraciones de servicio.

mkdir -p fluentd/; cd fluentd/

6. Dentro de ~/efk/fluentd directorio, cree un nuevo Dockerfile utilizando su editor preferido y complete la siguiente configuración.

Esta configuración crea la imagen personalizada de fluentd que contiene el controlador de cliente de elasticsearch y fluentd-plugin-elasticsearch.

Asegúrese de usar la misma versión entre elasticsearch y el controlador de cliente de elasticsearch; este tutorial usa la versión 7.17.0.

# image based on fluentd v1.14-1
FROM fluentd:v1.14-1

# Use root account to use apk
USER root

# below RUN includes plugin as examples elasticsearch is not required# you may customize including plugins as you wish
RUN apk add --no-cache --update --virtual .build-deps \
        sudo build-base ruby-dev \
&& gem uninstall -I elasticsearch \
&& gem install elasticsearch -v 7.17.0 \
&& sudo gem install fluent-plugin-elasticsearch \
&& sudo gem sources --clear-all \
&& apk del .build-deps \
&& rm -rf /tmp/* /var/tmp/* /usr/lib/ruby/gems/*/cache/*.gem

# copy fluentd configuration from host image
COPY ./conf/fluent.conf /fluentd/etc/
# copy binary start file
COPY entrypoint.sh /bin/

RUN chmod +x /bin/entrypoint.sh

USER fluent

7. A continuación, cree otro archivo de configuración (entrypoint.sh ) utilizando su editor preferido y complete la siguiente configuración. Este script se ejecuta cuando fluentd comienza el servicio de contenedores.

A continuación se muestra la secuencia de comandos de inicio para el servicio de contenedor fluentd, que ejecuta el comando básico fluentd –config /fluentd/etc/fluentd.conf –plugin /etc/fluentd/plugins.

#!/bin/sh

#source vars if file exists
DEFAULT=/etc/default/fluentd

if [ -r $DEFAULT ]; then
    set -o allexport
    . $DEFAULT
    set +o allexport
fi

# If the user has supplied only arguments append them to `fluentd` commandif [ "${1#-}" != "$1" ]; then
    set -- fluentd "[email protected]"
fi

# If user does not supply config file or plugins, use the defaultif [ "$1" = "fluentd" ]; then
    if ! echo [email protected] | grep -e ' \-c' -e ' \-\-config' ; then
      set -- "[email protected]" --config /fluentd/etc/${FLUENTD_CONF}
    fi

    if ! echo [email protected] | grep -e ' \-p' -e ' \-\-plugin' ; then
      set -- "[email protected]" --plugin /fluentd/plugins
    fi
fi

8. Ejecute el siguiente comando para crear un nuevo directorio conf bajo ~/efk/fluentd directorio.

mkdir -p conf

9. Ahora, cree una configuración de fluentd (conf/fluentd.conf ) utilizando su editor preferido y complete la siguiente configuración.

Esta configuración permite que el servicio de contenedor fluentd reciba mensajes de registro y los reenvíe al servicio de contenedor elasticsearch.

# bind fluentd on IP 0.0.0.0
# port 24224
<source>
  @type forward
  port 24224
  bind 0.0.0.0
</source>

# sendlog to the elasticsearch
# the host must match to the elasticsearch
# container service
<match *.**>
  @type copy
  <store>
    @type elasticsearch
    host elasticsearch
    port 9200
    logstash_format true
    logstash_prefix fluentd
    logstash_dateformat %Y%m%d
    include_tag_key true
    type_name access_log
    tag_key @log_name
    flush_interval 300s
  </store>
  <store>
    @type stdout
  </store>
</match>

10. Por último, ejecute los siguientes comandos para verificar la estructura del directorio del proyecto EFK Stack.

Si no tiene el comando de árbol, instálelo usando el siguiente comando:apt install tree -y

# Checking list of files and directory
ls

# Checking directory structure
tree

A continuación se muestra la estructura completa del directorio del proyecto EFK Stack.

Implementación de la pila EFK con Docker

Ya ha creado todos los archivos de configuración para implementar EFK Stack mediante Docker y Docker Compose. El siguiente paso es implementar EFK Stack usando docker-compose y la implementación se realizará en el directorio de su proyecto (~/efk ).

1. Primero, ejecute el siguiente comando para cambiar el directorio de trabajo a efk directorio del proyecto.

cd ~/efk/

2. A continuación, ejecute docker-compose Comando a continuación para implementar (up ) el sistema de monitoreo y análisis de registros EFK Stack.

Este comando descarga automáticamente las imágenes de Docker Elasticsearch y Kibana. Y la imagen de Fluentd Docker se construye automáticamente usando el Dockerfile en el fluido directorio.

La implementación puede llevar algún tiempo, según las especificaciones del host de Docker.

docker-compose up -d

A continuación se muestra la captura de pantalla del proceso de creación de la imagen de Fluentd Docker.

Y debajo está la captura de pantalla que muestra que la implementación está completa y el servicio de contenedor de Kibana se está ejecutando.

3. Ejecute cada comando a continuación para verificar los registros del proceso de compilación de la pila EFK. Ejecute siempre estos comandos cada vez que obtenga un error en el proceso de implementación.

# Checking logs for service fluentd
docker-compose logs fluentd

# Checking logs for service kibana
docker-compose logs kibana

A continuación se muestra el mensaje de registro cuando se ejecuta el servicio de contenedor fluentd.

Y debajo está el registro del contenedor kibana.

4. Ahora, ejecute el siguiente comando para verificar el estado de todos los servicios del contenedor (ps ).

docker-compose ps

Como puede ver a continuación, el servicio de contenedor EFK Stack está activo. Anote el nombre del contenedor de búsqueda elástica (efk_elasticsearch_1) para verificar aún más que el contenedor se está ejecutando correctamente en el siguiente paso.

5. Además, ejecute el siguiente comando para verificar el servicio de contenedor de elasticsearch. Este comando imprime la configuración detallada del efk_elasticsearch_1 envase.

docker inspect efk_elasticsearch_1

Como puede ver a continuación, el contenedor efk_elasticsearch_1 obtiene una dirección IP de 172.18.0.2.

6. Por último, ejecute el siguiente comando para acceder y verificar el contenedor de búsqueda elástica por dirección IP (172.18.0.2 ). Puerto 9200 es el puerto predeterminado para el contenedor de búsqueda elástica.

curl 172.18.0.2:9200

Verá un resultado similar al siguiente si el contenedor de búsqueda elástica en su máquina se está ejecutando.

Configuración del patrón de índice de Kibana

Ahora que completó la implementación de EFK Stack en el entorno de Docker, abrirá Kibana desde su navegador web. Configurará un patrón de índice para la supervisión y el análisis de registros.

1. Abra su navegador web favorito y navegue hasta la dirección IP del servidor seguida del puerto de servicio Kibana 5601 (es decir, http://172.16.1.10:5601).

2. A continuación, haga clic en Explorar por mi cuenta en la página de bienvenida a continuación.

3. Haga clic en Administración de pilas opción para configurar el patrón de índice Kibana en la sección Gestión.

4. En el Kibana sección del menú izquierdo, haga clic en el menú Patrones de índice y haga clic en Crear patrón de índice botón para crear un nuevo patrón de índice.

5. Ahora, ingrese el patrón de índice Nombre como fluidez- *, configure el campo de marca de tiempo a @timestamp y haga clic en Crear patrón de índice para confirmar la configuración del patrón de índice.

En el lado derecho, puede ver los patrones de índice disponibles de fluentd, como fluentd-%Y%m%d. El formato de fecha %Y%m%d se basa en la configuración de fluentd (fluentd.conf ).

6. Por último, haga clic en el menú superior izquierdo (puntos suspensivos), luego haga clic en Descubrir menú para mostrar el seguimiento de registros.

A continuación se muestra la captura de pantalla del panel de control y análisis de registros de Kibana. Todos los registros enumerados se toman de Elasticsearch y se envían mediante la agregación de registros de Fluentd.

Ejecución de un contenedor Docker con el controlador de registro Fluentd

Después de configurar el patrón de índice de Kibana, ejecutará un contenedor de Docker con la unidad de registro Fluentd y enviará registros automáticamente a la pila de EFK.

1. Ejecute el siguiente comando para descargar la imagen NGINX. El alpine La versión es más pequeña que las imágenes normales basadas en Ubuntu, CentOS o Fedora.

docker pull nginx:alpine

2. A continuación, ejecute el siguiente comando para iniciar un nuevo contenedor NGINX (nginx_container ) en modo separado (-d ).

El comando también establece la unidad de registro en Fluentd (–log-driver=fluentd) y expone el puerto 8080 en la máquina host de Docker para el contenedor (nginx_container).

docker run --name nginx_container -d --log-driver=fluentd -p 8080:80 nginx:alpine

3. Después de ejecutar el contenedor, ejecute docker Comando a continuación para verificar todos los contenedores en ejecución.

docker ps

Debería ver que nginx_container está funcionando en el puerto de host 8080.

4. Ahora, ejecute el siguiente comando para acceder al nginx_container y generar registros de acceso.

curl localhost:8080

Alternativamente, abra una nueva pestaña en su navegador web y escriba la dirección IP del servidor seguida del puerto 8080 (es decir, http://172.168.1.10:8080).

Si todo va bien, verá el index.html predeterminado. página del nginx_container.

5. Por último, vuelva al panel de control de Kibana y haga clic en Descubrir. menú del lado izquierdo.

Haga clic en la consulta container_name :nginx_container en el campo KQL (Kibana Query Language) y verá los registros del nginx_container, como se muestra a continuación.

Conclusión

Aprendió a implementar EFK Stack (Elasticsearch, Fluentd y Kibana) a lo largo de este tutorial para monitorear y analizar registros usando Docker. También aprendió a configurar el registro para el contenedor de Docker mediante el controlador de registro de Fluentd. Y en este punto, ahora tiene un monitoreo de registro completamente funcional para aplicaciones y servicios.

Para la siguiente etapa, puede estar interesado en usar KQL (Kibana Query Language) para visualizar el monitoreo y análisis de registros.


Docker
  1. Instale ModSecurity con Apache en un contenedor Docker

  2. Instale el servidor Wireguard VPN con Docker

  3. Configurar Nextcloud con Redis usando Docker

  4. Cómo implementar microservicios con Docker

  5. Cómo implementar aplicaciones con Rancher

Cómo reemplazar Docker con Podman en una Mac

Instalar Portainer con Docker en Ubuntu

Utilice Docker con esta solución de tutorial de pila MERN

Implementación de una pila EFK con Docker

Implementación de Talkyard Forum bajo Nginx con Docker

Implementación del sistema de comentarios Isso bajo Nginx con Docker