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:
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.
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:
volumes:
- influxdb:/var/lib/influxdb
Por esta:
volumes:
- “./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:
docker pull telegraf:1.4.0-alpine
docker run --rm telegraf:1.4.0-alpine telegraf config > telegraf.conf
Y en el caso de InfluxDB:
docker pull influxdb
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:
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í:
docker node update --label-add influxdb=true
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:
Redes
En el mismo fichero también decimos que vamos a utilizar una red externa llamada “metrics”, por lo que la debemos crear:
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:
wget https://github.com/davidochobits/stack-telegraf-influxdb-grafana/archive/master.zip
unzip master.zip
cd stack-telegraf-influxdb-grafana
Y ahora sí, desplegar:
docker stack deploy -c docker-compose.yaml metrics
Comprobamos que todo ha ido bien:
docker stack ps metrics
De esta manera:
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ñ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