Controlar Docker Swarm con Telegraf, InfluxDB y Grafana

En el artículo de hoy hablaremos de como desplegar un stack con Telegraf, InfluxDB y Grafana, en nuestro recién creado entorno de alta disponibilidad, con Docker Swarm.

Para conseguir este fin debemos tener un conocimiento lo suficientemente amplio en Docker, para lograrlo. Si sois unos neófitos en esta área no os preocupéis, ya que en la web de Colaboratorio.net, tratamos todos los puntos necesarios.

En esta ocasión, he subido a GitHub (sí, me da pereza migrar a GitLab), todas las piezas indispensables. Básicamente se trata de un fichero en formato YAML, para que se pueda desplegar con Docker compose, más algunos ficheros adicionales de configuración.

Desplegar stack en Docker Swarm con Telegraf, InfluxDB y Grafana

Hay que recordar que, de estas tres piezas, esto es, Telegraf, InfluxDB y Grafana, también hemos hablado en la web. En esa ocasión las utilizamos todas juntas sobre un VPS en la nube de clouding.io

Aunque en el artículo de despliegue de Docker Swarm, utilicé unas máquinas virtuales locales, en mi laptop. He clonado el entorno también en clouding.io, ya que tiene unos precios muy competitivos, y la creación de los tres VPS apenas me costará unos cuantos euros al mes. Teniendo en cuenta todas las ventajas de un servicio de este tipo, como por ejemplo los backups, la triple réplica de los servidores cloud o la fácil escalabilidad de los recursos de memoria, CPU y disco (que para más inri son SSD)

Además están ubicados en mi ciudad, Barcelona, que más se puede pedir 🙂

Una imagen vale más que mil palabras:

Muestra de los nodos en el panel de Clouding.io

Configuración de puertos

Eso sí, para que Docker Swarm y más tarde el stack de monitorización que queremos desplegar, funcionen correctamente, debemos habilitar los puertos necesarios.

En el caso de Docker Swarm son estos:

  • Puerto 2377 (TCP) para las comunicaciones del clúster.
  • Puerto 7946 (TCP y UDP) para la comunicación entre los nodos.
  • Puerto 4789 (UDP) para el tráfico de la red ‘overlay’

En el caso de Portainer, debemos habilitar el puerto 9000 (TCP), siempre que utilicemos la configuración por defecto, claro.

En la plataforma clouding.io, el cortafuegos por defecto se llama “default”, y es ahí donde debemos añadir las reglas correspondientes.

Configuración de cortafuegos en Clouding.io (click para ampliar)

Para el despliegue del stack gráfico, los puertos que debemos habilitar son los mismos que están indicados en el fichero YAML

  • InfluxDB: 8083, 8086 y 8090 (TCP)
  • Grafana: 3000 (TCP)

En cambio, si realizamos la instalación en local, en el caso de la instalación con máquinas virtuales en un PC, no hace falta que configuremos el cortafuegos, a no ser que tengamos algún cortafuegos especial.

Configuración de volúmenes

En mi caso he configurado dos volúmenes que utilizan la ubicación por defecto que es “/var/lib/docker/volumes” En vez de esta configuración una buena idea es crear un recurso NFS compartido, por ejemplo, en “/srv/docker/volumes” y allí guardar los volúmenes. Esto al final es a gusto del consumidor.

Si nos decidimos por el recurso NFS, modificamos, por ejemplo, esta línea:

  1. volumes:
  2.           - influxdb:/var/lib/influxdb

Por esta:

  1. volumes:
  2.           - “./srv/docker/influxdb:/var/lib/influxdb”

Ficheros de configuración

En el proyecto tengo definidos dos ficheros de configuración, uno para influxdb y otro para telegraf. Dentro de sus respectivas carpetas. Si nos interesa podemos descargar los ficheros de configuración por defecto, de esta manera:

En el caso de Telegraf:

  1. docker pull telegraf:1.4.0-alpine
  2. docker run --rm telegraf:1.4.0-alpine telegraf config > telegraf.conf

Y en el caso de InfluxDB:

  1. docker pull influxdb
  2. docker run --rm influxdb influxd config > influxdb.conf

Estos ficheros también se pueden consultar y modificar desde Portainer, en el apartado «Configs«, tal y como se muestra en la imagen:

Apartado «Configs» de Portainer (click para ampliar)

Etiquetas

En el fichero YAML, indicamos que tanto InfluxDB como Grafana se desplegarán en los nodos Worker correspondientes, por una etiqueta o “tag”. Esto lo podemos indicar desde la web de Portainer, o bien de manera manual, así:

  1. docker node update --label-add influxdb=true 
  2. docker node update --label-add grafana=true

Desde el panel de Portainer, desde «Swarm«, «Nodes«, por ejemplo en uno de los nodos Worker que estoy utilizando:

Añadir etiquetas a nodos en Portainer (click para ampliar)

Redes

En el mismo fichero también decimos que vamos a utilizar una red externa llamada “metrics”, por lo que la debemos crear:

  1. docker network create -d overlay metrics

Esto también lo podemos hacer desde la interfaz de portainer, en la sección «Networks»

Despliegue del stack

Antes de realizar el despliegue debemos descargar el proyecto ubicado en GitHub, si no lo hemos hecho ya:

  1. wget https://github.com/davidochobits/stack-telegraf-influxdb-grafana/archive/master.zip
  2. unzip master.zip
  3. cd stack-telegraf-influxdb-grafana

Y ahora sí, desplegar:

  1. docker stack deploy -c docker-compose.yaml metrics

Comprobamos que todo ha ido bien:

  1. docker stack ps metrics

De esta manera:

Listamos los contenedores del stack

Conexión de InfluxDB con Telegraf

Una vez tenemos el stack deplegado, ya podemos acceder a la IP o URL más el puerto de Grafana, que tengamos definido, que en nuestro caso es el 3000. Desde ahí añadimos un nuevo «Datasource«, utilizando la base de datos «telegraf»

Añadimos el nuevo Datasource de InfluxDB, con el nombre ‘telegraf’

Añadir un dashboard

Desde el repositorio oficial tenemos disponible un gran número de «dashboards», yo he escogido este, llamado «Telegraf Host Metrics»

Una vez importado tiene el siguiente aspecto:

Espero que os haya parecido interesante. Nos vamos leyendo.

Fuentes consultadas:

wmartins.github.io – Creating a Monitoring Stack With Docker Swarm, Grafana, InfluxDB y Telegraf
Portainer Documentation
Docker Documentation – Tutorial Swarm