Cómo monitorear Kubernetes (K3s) usando Telegraf e InfluxDB Cloud
¿Así que necesitas monitorear tus nodos que corren K3s para conocer el estado de tu cluster, no? ¿También necesitas conocer como performan tus pods, los recursos que consumen, así como el tráfico de red? bueno, este artículo es para vos.
Este blog, así como unos cuantos recursos que tengo, están corriendo en Kubernetes. Específicamente en un cluster de tres nodos en DigitalOcean que corren K3s y particularmente todo está monitoreado con Telegraf e InfluxDB.
Sobre K3s ya hemos hablado en este blog, así que les dejo los enlaces a lo mismos.
Hoy vamos a atender el día de dos de nuestras operaciones, que es monitorear nuestro cluster para asegurarnos de que todo ande como esperamos y si no es así, bueno, poder de alguna manera, verlo.
Para monitorearlo vamos a usar básicamente dos componentes:
- InfluxDB Cloud: Cuando monitoreamos algo, lo ideal es hacerlo desde afuera, si lo hacemos desde adentro y nuestro nodo se cae, con todo lo que esta adentro, no tiene ningún sentido el monitoreo. Pueden abrirse una cuenta gratuita desde este enlace:
- Lo otro que vamos a ncesitar es instalar un Helm chart de Telegraf, especificamente este, ya que no tiene soporte para docker-engine, cosa que si corres K3s, no lo necesitamos.
Manos a la obra...
Configurando InfluxDB Cloud
Lo primero que debemos hacer es crear la cuenta en InfluxDB Cloud, una vez que esta, nos dirigimos a la sección de Data, hacemos un clic en Buckets y luego en Create Bucket.
Le ponemos un nombre y hacemos un clic sobre Create.
Así debería verse nuestra lista de buckets. Una vez identificado nuestro bucket, vamos a crear un tocket de accesso para poder escribir ese bucket. Para eso, vamos al tab que dice Tokens.
En esta sección, hacemos un clic sobre Generate Token y elegimos la opción Read/Write Token.
Especificamos un nombre, elegimos a que bucket queremos asociar este token y le damos un click en Save.
Una vez hecho este, veremos nuestro tocken ahi.
Para terminar con esta parte, vamos a necesitar nuestro Org ID y la URL al cual apuntar nuestro Telegraf.
El Org ID es nuestro correo electrónico que usamos para registrarnos en InfluxDB Cloud. La URL la saco de la barra direcciones. En mi caso, yo en su momento elegí el oeste de Estados Unidos. Así que en mi caso, se ve así:
https://us-west-2-1.aws.cloud2.influxdata.com
A monitorear nuestros nodos se ha dicho...
Ahora bien. Una vez que ya tenemos nuestra configuración pronta en InfluxDB Cloud, vamos a pasar a configurar nuestros nodos.
Como les comente más arriba, vamos a usar un Helm Chart. El mismo fue modificado por quien les escribe para adaptarse a K3s, ya que por defecto trata de monitorear docker y el mismo no se usa en la distribución de Kubernetes de la gente de Rancher.
Ahora bien, si no tenes Helm instalado, podés instalarlo corriendo este comando:
$ curl https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 | bash
Una vez que esta instalado, vamos a descargar el archivo values.yaml desde el siguiente enlace:
Pueden agarr el archivo raw y bajarlo directamente al nodo master con un wget...
$ wget https://raw.githubusercontent.com/xe-nvdk/awesome-helm-charts/main/telegraf-ds-k3s/values.yaml
Ahora bien, este archivo, hay que modificarlo un poco... Para esto, vamos a abrirlo y vamos a modificar la parte del Output. Por defecto viene así:
...
## Exposed telegraf configuration
## ref: https://docs.influxdata.com/telegraf/v1.13/administration/configuration/
config:
# global_tags:
# cluster: "mycluster"
agent:
interval: "10s"
round_interval: true
metric_batch_size: 1000
metric_buffer_limit: 10000
collection_jitter: "0s"
flush_interval: "10s"
flush_jitter: "0s"
precision: ""
debug: false
quiet: false
logfile: ""
hostname: "$HOSTNAME"
omit_hostname: false
outputs:
- influxdb:
urls:
- "http://influxdb.monitoring.svc:8086"
database: "telegraf"
retention_policy: ""
timeout: "5s"
username: ""
password: ""
user_agent: "telegraf"
insecure_skip_verify: false
monitor_self: false
Pero como nosotros vamos a usar InfluxDB Cloud, debemos hacer algunos ajustes, los mismos se verán más o menos así:
...
## Exposed telegraf configuration
## ref: https://docs.influxdata.com/telegraf/v1.13/administration/configuration/
config:
# global_tags:
# cluster: "mycluster"
agent:
interval: "1m"
round_interval: true
metric_batch_size: 1000
metric_buffer_limit: 10000
collection_jitter: "0s"
flush_interval: "10s"
flush_jitter: "0s"
precision: ""
debug: false
quiet: false
logfile: ""
hostname: "$HOSTNAME"
omit_hostname: false
outputs:
- influxdb_v2:
urls:
- "https://us-west-2-1.aws.cloud2.influxdata.com"
bucket: "kubernetes"
organization: "miemail@midominio.com"
token: "WIX6Fy-v10zUIag_dslfjasfljadsflasdfjasdlñjfasdlkñfj=="
timeout: "5s"
insecure_skip_verify: false
monitor_self: false
Fijensé que acá vamos a poniendo los datos que creamos en la etapa anterior. Si necesitamos ajustar otros valores como el intervalo de recolección, pueden hacerlo cambiando el valor de interval, yo por ejemplo, no necesito la información cada 10 segundos, así que lo pase a 1 minuto.
Llegamos al momento de la verdad, vamos a instalar el helm chart, dependiendo de tu configuración de K3s, vas a tener que pasar la configuración del cluster como variable de entorno KUBECONFIG.
$ export KUBECONFIG=/etc/rancher/k3s/k3s.yaml
Una vez hecho esto, vamos a agregar el repo de Awesome-Helm-Charts.
$ helm repo add awesome-helm-charts https://xe-nvdk.github.io/awesome-helm-charts/
Luego actualizaremos el contenido de los repos que tenemos configurados...
$ helm repo update
Vamos a instalarlo, pasandole la configuración que acabamos de modificar en el archivo values.yaml
$ helm upgrade --install telegraf-ds-k3s -f values.yaml awesome-helm-charts/telegraf-ds-k3s
La terminal nos devolverá algo como esto:
Release "telegraf-ds-k3s" does not exist. Installing it now.
NAME: telegraf-ds-k3s
LAST DEPLOYED: Fri Jun 25 22:47:22 2021
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
To open a shell session in the container running Telegraf run the following:
- kubectl exec -i -t --namespace default $(kubectl get pods --namespace default -l app.kubernetes.io/name=telegraf-ds -o jsonpath='{.items[0].metadata.name}') /bin/sh
To tail the logs for a Telegraf pod in the Daemonset run the following:
- kubectl logs -f --namespace default $(kubectl get pods --namespace default -l app.kubernetes.io/name=telegraf-ds -o jsonpath='{ .items[0].metadata.name }')
To list the running Telegraf instances run the following:
- kubectl get pods --namespace default -l app.kubernetes.io/name=telegraf-ds -w
Parece ser que nuestro Helm se desplego, tengan en cuenta que este es un DaemonSet, lo cual hace que se instale en cada uno de los nodos perteneciente a este cluster de manera automática.
Para chequear que esta corriendo, podemos tirar un...
$ kubectl get pods
Veremos que nuestro pod esta vivito y coleando...
NAME READY STATUS RESTARTS AGE
telegraf-ds-k3s-w8qhc 1/1 Running 0 2m29s
Si queremos asegurarnos de que el log es el esperado, podemos ejecutar...
$ kubectl logs -f telegraf-ds-k3s-w8qhc
La terminal deberá responderte con algo como esto:
2021-06-26T02:55:22Z I! Starting Telegraf 1.18.3
2021-06-26T02:55:22Z I! Using config file: /etc/telegraf/telegraf.conf
2021-06-26T02:55:22Z I! Loaded inputs: cpu disk diskio kernel kubernetes mem net processes swap system
2021-06-26T02:55:22Z I! Loaded aggregators:
2021-06-26T02:55:22Z I! Loaded processors:
2021-06-26T02:55:22Z I! Loaded outputs: influxdb_v2
2021-06-26T02:55:22Z I! Tags enabled: host=k3s-master
2021-06-26T02:55:22Z I! [agent] Config: Interval:10s, Quiet:false, Hostname:"k3s-master", Flush Interval:10s
Todo parece estar bien, ahora es el momento de la verdad. Vamos a nuestra cuenta de InfluxDB Cloud, a la parte de Explore y deberíamos, seleccionando el bucket ver algunos measurements y por supuesto, algunos datos.
Para ir cerrando
Como ves, parece complicado pero no lo es en absoluto, el Helm chart nos simplifica la vida y de ahora en más, podemos ver que es lo que esta pasando con nuestro cluster usando un sistema externo.
Contame si lo pudiste hacer andar, si hay algo que te falto o fallo y lo vemos sin ningún problema.