En este post veremos algunos conceptos muy generales de lo que es el stack ELK, según su documentación oficial. La idea de este post es lograr unicamente que funcionen mediante un network de docker todo el stack ELK. Como verás, éstas instalaciones las haremos a través de contenedores, mediante las diferentes imágenes que nos permite descargar elastic desde su página oficial.
¡ Que comience el juego !
Elasticsearch
Es el corazón de todo el elastic stack, y es un motor de análisis y búsqueda RESTful, capaz de resolver un número creciente de casos de uso. Estos casos de uso pueden ser variados debido a la velocidad y escalabilidad de elasticsearch y su capacidad para indexar muchos tipos de contenidos.
Los datos se redirigen hacia elasticsearch de diferentes fuentes. La ingesta de datos es el proceso por el cual se analiza estos datos sin procesar, normalizados, y enriquecidos antes de que se indexe en Elasticsearch. Una vez indexados en Elasticsearch, los usuarios pueden ejecutar consultas complejas contra sus datos.
Un índice de Elasticsearch es una colección de documentos relacionados entre sí. Elasticsearch almacena datos como documentos JSON. Cada documento correlaciona un conjunto de claves con sus valores correspondientes.
Instalando Elasticsearch
Elasticsearch está disponible como imágenes de docker, las mismas las podremos encontrar en https://www.docker.elastic.co/
Nosotros en este caso instalaremos la versión 7.11.0.
Haciendo un pull contra el registro de docker de elastic
$ docker pull docker.elastic.co/elasticsearch/elasticsearch:7.11.0
Iniciando un cluster single-node
Si estás instalando en tu PC es muy importante especificar el discovery single-node, esto elegirá un nodo como maestro y no unirá el cluster con ningún otro nodo.
$ docker run -p 9200:9200 -p 9300:9300 \
-e "discovery.type=single-node" docker.elastic.co/elasticsearch/elasticsearch:7.11.0
Para verificar si se encuentra funcionando, simplemente ejecutamos el siguiente comando:
$ curl -X GET "http://127.0.0.1:9200/"
#output:
{
"name" : "dcd5b2844eb1",
"cluster_name" : "docker-cluster",
"cluster_uuid" : "iA88pNENSHmKQ1YOgNA2nA",
"version" : {
"number" : "7.11.0",
"build_flavor" : "default",
"build_type" : "docker",
"build_hash" : "8ced7813d6f16d2ef30792e2fcde3e755795ee04",
"build_date" : "2021-02-08T22:44:01.320463Z",
"build_snapshot" : false,
"lucene_version" : "8.7.0",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
Kibana
Elastic Kibana es la plataforma de visualización y análisis de código abierto más popular diseñada para ofrecer información más rápida sobre sus datos. Está diseñado para trabajar en conjunto con Elasticsearch para hacer flujos de datos enormes y complejos más rápida y fácilmente comprensibles a través de la representación gráfica. El software genera informes en PDF a pedido o según lo programado y proporciona un panel de control dinámico y flexible. Los informes generados pueden representar los datos en barras, líneas, diagranas de dispersión o formatos de gráficos circulares con colores personalizables y resultados de búsqueda muy marcados. Kibana también incluye herramientas para compartir la visualización de datos.
En este caso instalaremos la versión v7.11.0
Haciendo un pull contra el registro de docker de elastic
$ docker pull docker.elastic.co/kibana/kibana:7.11.0
Ejecutando Kibana en una network docker
En primer lugar debemos detener y eliminar cualquier servicio de elasticsearch que esté corriendo, para ello ejecutamos:
$ docker container stop elasticsearch
#output: elasticsearch
$ docker rm elasticsearch
Ahora si estamos listos para crear una red de docker llamado elk y correr Kibana y elasticsearch sobre la red:
$ docker network create elk
Primero buscamos el image ID de Kibana y elasticsearch:
$ docker images
#output
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.elastic.co/beats/filebeat 7.12.0 50c655d7dd44 5 weeks ago 461MB
docker.elastic.co/elasticsearch/elasticsearch 7.11.0 d3e8b103c135 2 months ago 819MB
docker.elastic.co/logstash/logstash 7.11.0 a3e0aa07add8 2 months ago 963MB
docker.elastic.co/kibana/kibana 7.11.0 f48b11156469 2 months ago 1.01GB
#Elasticsearch
docker run -d --network=elk --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=sigle-node" d3e8b103c135
#Kibana
$ docker run -d --network=elk --name kibana -p 5601:5601 f48b11156469
Accediendo a Kibana
Para acceder a kibana, desde su navegador introduzca la siguiente url, ya que kibana se ejecuta por default en el puerto 5601: localhost:5601
Le debería aparecer una pantalla como la siguiente:

En caso de que no pueda ingresar, asegúrese de que tiene corriendo los servicios de elasticsearch y kibana:
$ docker ps
#En caso de que no tenga algún servicio corriendo:
#Elasticsearch
$ docker container start elasticsearch
#Kibana
$ docker container start kibana
Logstash
Logstash es un motor de recopilación de datos de código abierto con capacidades de canalización en tiempo real. Logstash puede unificar dinámicamente datos de fuentes dispares y normalizar los datos en los destinos de su elección.
Si bien Logstash originalmente impulsó la innovación en la recopilación de registros, sus capacidades se extienden mucho más allá de ese caso de uso. Cualquier tipo de evento se puede enriquecer y transformar con una amplia gama de complementos de entrada, filtro y salida, con muchos códecs nativos que simplifican aún más el proceso de ingestión. Logstash acelera sus conocimientos al aprovechar un mayor volumen y variedad de datos.
Archivos de configuración
Logstash tiene 2 tipos de archivos de configuración:
1. Archivos de configuración pipeline: Define el procesamiento de logstash.
2. Archivos de configuración: Especifica las opciones que controlan el inicio y la ejecución de Logstash.
Haciendo un pull contra el registro de docker de elastic
$ docker pull docker.elastic.co/logstash/logstash:7.11.0
Para accancar con la ejecución de logstash, primero creemos un archivo llamado logstash.conf, en mi caso lo crearé en una carpeta llamada pipeline dentro de mi /home:
$ cat ~/pipeline/logstash.conf
#output: input { stdin {} } output { elasticsearch { hosts => ["elasticsearch:9200" ] } }
Luego, como ya tenemos creada la red elk, solamente procedemos a correr logstash. En primer lugar buscamos el image ID de logstash y luego lo corremos:
$ docker images
#output
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.elastic.co/beats/filebeat 7.12.0 50c655d7dd44 5 weeks ago 461MB
docker.elastic.co/elasticsearch/elasticsearch 7.11.0 d3e8b103c135 2 months ago 819MB
docker.elastic.co/logstash/logstash 7.11.0 a3e0aa07add8 2 months ago 963MB
docker.elastic.co/kibana/kibana 7.11.0 f48b11156469 2 months ago 1.01GB
$ docker run --rm -it \
--name=logstash \
--network=elk \
-v ~/pipeline/:/usr/share/logstash/pipeline/ a3e0aa07add8
En ese caso logstash quedará ejecutándose. Para comprobarlo podemos ejecutar lo siguiente, donde veremos en los containers: elasticsearch, kibana y logstash:
$ docker network inspect elk
# output:
[
{
"Name": "elk",
"Id": "0639343ac9d19cbddba3921b85dfc030f5629c7ce53138e43b769e0b897f0a9b",
"Created": "2021-04-24T11:20:06.965446501-03:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "172.24.0.0/16",
"Gateway": "172.24.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
"d8cf7e95184a82217f7595880d035bc9a7c9406d26de068b0f6ba7d156bc9830": {
"Name": "kibana",
"EndpointID": "5d32d298ba51b528806f7c970300b68e19428190b94f4f7f7b1f0b07ebc99c20",
"MacAddress": "02:42:ac:18:00:03",
"IPv4Address": "172.24.0.3/16",
"IPv6Address": ""
},
"dcd5b2844eb199c736fc911b219dfd2f310fc54862b0a2d44df9eaa0e4588d4d": {
"Name": "elasticsearch",
"EndpointID": "f12de844e5f4e9096d078d44d7b82a3040db589196b7de1de476e4e4f275ec68",
"MacAddress": "02:42:ac:18:00:02",
"IPv4Address": "172.24.0.2/16",
"IPv6Address": ""
},
"e67fcd8882abbf7bb03eadd859fa561d8d604915ea78fd8abab868d6111fa775": {
"Name": "logstash",
"EndpointID": "a9c9d27b5725fe1f5a63a95068590fcd752819890b107af3096acf1a2cbb6c4c",
"MacAddress": "02:42:ac:18:00:04",
"IPv4Address": "172.24.0.4/16",
"IPv6Address": ""
}
},
"Options": {},
"Labels": {}
}
]
También podemos ver el estado de los índices con el siguiente comando:
$ curl http://localhost:9200/_cat/indices\?v
#output
health status index uuid pri rep docs.count docs.deleted store.size pri.store.size
green open .kibana-event-log-7.11.0-000001 FM-oQYDPQ6iNrLJ13Qgz-Q 1 0 1 0 5.6kb 5.6kb
yellow open logstash-2021.04.25-000001 31wXxWv2RU-Qx7CIrz60Aw 1 1 1 0 4.5kb 4.5kb
green open .apm-custom-link 6R8p6jYmQHqVwoceOVqlyw 1 0 0 0 208b 208b
yellow open filebeat-7.12.0-2021.04.24-000001 j3TBvrIVRKqckz6dIDrkSQ 1 1 2528 0 1.8mb 1.8mb
green open .kibana_task_manager_1 RY3ofLeVQKCgqJGx-NkDwQ 1 0 8 2736 388.3kb 388.3kb
green open .apm-agent-configuration ZN1wiManTb2ag_PYxpYFpw 1 0 0 0 208b 208b
green open .async-search T0Q4-fqCSqCCGYjuwfW4-Q 1 0 0 0 4.7kb 4.7kb
green open kibana_sample_data_flights ezEpKa0tSti4J-ukEWFsLw 1 0 13059 0 5.3mb 5.3mb
green open .kibana_1 PCpq3vg2Rym_mFWCuPA4EA 1 0 2013 54 2.6mb 2.6mb