Caso práctico de stack ELK + Metricbeat

por | abril 25, 2018

Desde hace un tiempo tenía pendiente monitorizar los nodos virtualizados con KVM que tengo para el proyecto World Community Grid. Hay muchas maneras de hacerlo, pero me decidí por montar un stack ELK (Elasticsearch, Logstash y Kibana) en la máquina que tengo como servidor y recoger métricas con Metricbeat de cada nodo.

Por tanto, para empezar el entorno que tengo es:

  • Servidor jota-pc (Debian Stretch, IP 192.168.1.39) con ELK instalado. En el propio servidor también tengo instalado Metricbeat para tener métricas de rendimiento.
  • Máquinas virtualizadas wcg-node1, wcg-node2 y wcg-node3 con Ubuntu Server 16.04 que envian métricas a jota-pc. Como estas máquinas envían métricas al servidor jota-pc las consideraré clientes.

Preparación del repositorio de elastic.co

Para instalar los distintos componentes tanto en servidor como clientes utilizaremos el repositorio oficial de elastic.co

En todos los nodos (servidor y clientes) hacemos:

wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
sudo apt-get install apt-transport-https
echo "deb https://artifacts.elastic.co/packages/6.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-6.x.list

Instalación y configuración de ELK en el servidor

En el servidor jota-pc instalo el stack ELK:

sudo apt-get update 
sudo apt-get install elasticsearch logstash kibana

Configuramos cada componente:

  • IP/hostname de Kibana y URL de Elasticsearch en el fichero /etc/kibana/kibana.yml
    server.host: "192.168.1.39"
    elasticsearch.url: "http://192.168.1.39:9200"
    
  • IP/hostname de Elasticsearch en /etc/elasticsearch/elasticsearch.yml
    network.host: 192.168.1.39
    
  • IP/hostname de Logstash en /etc/logstash/logstash.yml
    http.host: "192.168.1.39"
    

Habilito (para que arranque con el inicio de la máquina) y levanto cada componente:

# Habilitar
systemctl enable kibana
systemctl enable logstash
systemctl enable elasticsearch

# Iniciar
systemctl start kibana
systemctl start logstash
systemctl start elasticsearch

Instalación de Metricbeat

Servidor

En mi caso he instalado Metricbeat en el servidor ya que me interesa tener métricas del mismo:

sudo apt-get install metricbeat

El fichero de configuración es /etc/metricbeat/metricbeat.yml. Configuramos el endpoint de Kibana:

#============================== Kibana =====================================

# Starting with Beats version 6.0.0, the dashboards are loaded via the Kibana API.
# This requires a Kibana endpoint configuration.
setup.kibana:

  # Kibana Host
  # Scheme and port can be left out and will be set to the default (http and 5601)
  # In case you specify and additional path, the scheme is required: http://localhost:5601/path
  # IPv6 addresses should always be defined as: https://[2001:db8::1]:5601
  host: "192.168.1.39:5601"

...

Configuramos los endpoints para Elasticsearch y Logstash. Dejamos comentada la configuración de Logstash temporalmente para la carga inicial del template en Elasticsearch:

...
#================================ Outputs =====================================

# Configure what output to use when sending the data collected by the beat.

#-------------------------- Elasticsearch output ------------------------------
output.elasticsearch:
  # Array of hosts to connect to.
  hosts: ["192.168.1.39:9200"]

  # Optional protocol and basic auth credentials.
  #protocol: "https"
  #username: "elastic"
  #password: "changeme"

#----------------------------- Logstash output --------------------------------
#output.logstash:
  # The Logstash hosts
  #hosts: ["192.168.1.39:5044"]
...

Iniciamos Metricbeat:

systemctl start metricbeat.service

Cargamos template para Elasticsearch y dashboards para Kibana:

# Carga de template, veremos "Loaded index template" si todo ha cargado bien
metricbeat setup --template -E output.logstash.enabled=false -E 'output.elasticsearch.hosts=["192.168.1.39:9200"]'

# Carga de dashboards, obtendremos "Loaded dashboards"
metricbeat setup --dashboards

Ahora, volvemos al fichero de configuración /etc/metricbeat/metricbeat.yml, comentamos el endpoint de Elasticsearch y descomentamos el de Logstash. Después, reiniciamos Metricbeat con systemctl restart metricbeat.service

Clientes wcg-node

Esta parte es muy sencilla ya que que la configuración de ELK para recibir métricas de Metricbeat ya la hemos realizado en el paso anterior. Ahora en cada uno de los clientes (wcg-node1,2 y 3) simplemente instalo el paquete para Metricbeat:

sudo apt-get install metricbeat

Y configuro en /etc/metricbeat/metricbeat.yml el endpoint para Kibana y Logstash:

#============================== Kibana =====================================

# Starting with Beats version 6.0.0, the dashboards are loaded via the Kibana API.
# This requires a Kibana endpoint configuration.
setup.kibana:

  # Kibana Host
  # Scheme and port can be left out and will be set to the default (http and 5601)
  # In case you specify and additional path, the scheme is required: http://localhost:5601/path
  # IPv6 addresses should always be defined as: https://[2001:db8::1]:5601
  host: "192.168.1.39:5601"

...


#----------------------------- Logstash output --------------------------------
output.logstash:
  # The Logstash hosts
  hosts: ["192.168.1.39:5044"]

Iniciamos en cada máquina Metricbeat con systemctl start metricbeat.service

Comprobando dashboards

En mi máquina servidor donde tengo el stack ELK, en un navegador voy a http://192.168.1.39:5601/app/kibana y después en los dashboards busco metric, seleccionando [Metricbeat System] Overview

Desde aquí podemos entrar al dashboard de los distintos nodos que están enviando métricas, por ejemplo mi servidor:

ELK y metricbeat tienen mucho más por explorar. Podemos habilitar métricas para Apache, Redis… todo ello lo tenéis en la documentación oficial.