Cómo reenviar registros de contenedores Docker a ELK?

Me gustaría saber cuál es la forma más fácil de reenviar los registros de mi contenedor docker a un servidor ELK, hasta ahora las soluciones que he probado después de buscar en Internet no funcionaron en absoluto.

Básicamente, tengo una imagen de docker que ejecuto usando docker-compose, este contenedor no registra nada localmente (está compuesto por diferentes servicios, pero ninguno de ellos es logstash o lo que sea) pero veo el registro docker logs -tf imageName o docker-compose logs. Como estoy iniciando los contenedores con compose, no puedo hacer uso (o al menos no se como) de la --logs-driver opción de docker.

Por lo tanto, me preguntaba si alguien puede iluminarme un poco sobre cómo reenviar esos registros a un contenedor ELK, por ejemplo.

Gracias de antemano,

Respecto

SOLUCIÓN:

Gracias a madeddie pude lograr resolver mi problema de la siguiente manera, mencione que utilicé ELK-stack-in-containers básico que madeddie sugirió en su publicación.

Primero actualizo el docker-compose.yml archivo de mi contenedor para agregar entradas para la referencia de registro como me dijo madeddie, incluí una entrada por servicio, un fragmento de mi docker-compose se ve así

   version: '2'    services:      mosquitto:        image: ansi/mosquitto        ports:          - "1883:1883" # Public access to MQTT          - "12202:12202"  #mapping logs        logging:            driver: gelf           options:              gelf-address: udp://localhost:12202    redis:     image: redis     command: redis-server --appendonly yes     ports:       - "6379:6379" # No public access to Redis       - "12203:12203" #mapping logs     volumes:       - /home/dockeruser/redis-data:/data     logging:        driver: gelf       options:          gelf-address: udp://localhost:12203 

En segundo lugar, tuve que usar un número de puerto diferente por servicio para poder reenviar los registros.

Finalmente, actualicé mi contenedor elk docker-compose.yml archivo para asignar cada uno de los puertos upd donde estaba enviando mis registros al que escucha logstash

logstash:  build: logstash/  command: logstash -f /etc/logstash/conf.d/logstash.conf  volumes:    - ./logstash/config:/etc/logstash/conf.d  ports:    - "5000:5000"    - "12202:12201/udp" #mapping mosquitto logs    - "12203:12201/udp" #mapping redis logs

Esta configuración y la adición de la entrada de gelf {} en logstash.conf para que funcione, también es importante configurar correctamente la dirección IP del servicio docker.

Saludos!

Docker Compose tiene la palabra clave logging:fuente

logging:   driver: syslog  options:     syslog-address: "tcp://192.168.0.42:123"

Así que si sabes a dónde ir a partir de ahí, hazlo.

Si no, puedo aconsejarle que busque en el gelf controlador de registro para docker y el complemento de entrada logstash gelf

Si, por ejemplo, utilizara este configuración básica de ELK-stack-in-containers, actualizaría el archivo docker-compose y agregaría el puerto - "12201:12201/udp" a logstash.

Edite el logstash.conf sección de entrada a:

input {    tcp {        port => 5000    }    gelf {    }}

A continuación, configure los contenedores para que utilicen el controlador de registro gelf (no syslog) y la opción gelf-address=udp://ip_of_logstash:12201 (en lugar de syslog-address).

La única magia de la que tendrá que ocuparse es cómo Docker encontrará la dirección IP o el nombre de host del contenedor Logstash. Puede resolverlo a través de la nomenclatura de docker-compose, los enlaces de Docker o simplemente manualmente.

Docker y ELK son bestias poderosas, flexibles, pero por lo tanto también grandes y complejas. Prepárese para dedicar un tiempo serio a la lectura y la experimentación.

No tengas miedo de abrir preguntas nuevas (y preferiblemente muy específicas) que encuentres mientras exploras todo esto.

¿configuras el puerto 12201 por servicio? porque no deberías

No lo entiendo completamente, ¿quiere decir que mi opción de registro debería estar al mismo nivel de la etiqueta de servicios en lugar de por contenedor?

la palabra clave logging en realidad no abre un puerto para escuchar, configura dónde se conecta docker a. Estoy hablando de las asignaciones de puertos que realiza en cada contenedor, solo puede _abrir _ un puerto una vez, pero no debe abrir un puerto para iniciar sesión en _cada _ contenedor, solo el de logstash. El problema radica en el uso de “localhost” como host del punto final de geld, en lugar de localhost, debe usar la IP de la máquina donde se ejecuta el contenedor logstash o 172.17.0.1 si todos los contenedores están en el mismo host o usar “logstash” si todos los contenedores se inician con el mismo archivo de composición.

@madeddie Me enfrento a un pequeño problema con esa pila de elk, puedo ver que kibana o elasticsearch se reinician alrededor de 2 horas más o menos, ¿también has visto este comportamiento? Si configuro mis imágenes a la última en lugar de las de compilación, ¿esta pila seguiría funcionando?

Sé a lo que te refieres ahora, creo que lo intenté antes de recibir el error de que el puerto ya estaba en uso, pero puedo intentarlo por segunda vez. Gracias de nuevo

@madeddie para tener menos carga en mi servidor, quería cambiar el puerto, sin embargo, no puedo manejarlo para que funcione. Agregué una línea como esta gelf-address: udp:/ / 172.17.0.1:12201 'en cada servicio, obteniendo un error cuando inicio los servicios debido al uso del puerto' ERROR: para el controlador redis falló la programación de la conectividad externa en el punto final ttnbackend_redis_1: Bind para 0.0.0.0:12201 falló: el puerto ya está asignado ERROR: para el controlador del agente falló la programación de la conectividad externa en el punto final ttnbackend_broker_1: Enlace para 0.0.0.0:12201 falló: el puerto ya está asignado

Intenté hacerlo, pero mientras ejecutaba ‘docker-compose up’ vi una queja de que el puerto ya estaba en uso.

sí, porque abre un puerto para logstash en _todos _ sus contenedores, mientras que solo debe abrirlo para el contenedor logstash. no es necesario que todos los demás contenedores escuchen las conexiones de logstash, por lo tanto, no necesitan abrir un puerto para ello.

Creo que lo hice, ¿debería agregar solo una línea como gelf-address: udp://172.17.0.1 ? Luego se quejará de que necesita un puerto

Hoy en día sigo usando la solución “el reenvío de puertos”…