Monitorización como Código con Grafana en Kubernetes

Publicado por Alejandro Nieto el

DevOpsMonitorización como CódigoGrafanaPrometheusKubernetes

En los últimos tiempos, se ha ido mostrando cierto interés por pasar de una administración clásica a una basada en código, desde nuestra infraestructura hasta nuestros pipelines pasando por nuestra seguridad. Esto nos permite tener ficheros con toda la información de nuestra operativa con un estilo declarativo. ¿Por qué la monitorización iba a ser menos si disponemos de herramientas que nos lo permiten?.

A este concepto lo vamos a llamar Monitorización como Código y en este post lo vamos a poner en práctica utilizando las siguientes herramientas:

  • Kubernetes
  • Helm
  • Prometheus
  • Grafana

Kubernetes nos da la posibilidad de administrar nuestra configuración como código (ConfigMaps) y que nuestros contenedores consuman esa configuración de forma dinámica mediante volúmenes.

Pre-requisitos

Anteriormente, en este blog, ya se ha hablado sobre Helm, por lo que sería recomendable echarle un vistazo.

Los ficheros a utilizar en este post están disponibles en el siguiente repositorio:
https://github.com/alejandronb/monitoring-as-code

Para realizar este ejercicio, es necesario disponer de Helm instalado en nuestro cluster de Kubernetes, no obstante en el repositorio hay un script para instalar Tiller en nuestro cluster con RBAC habilitado (el cliente helm tendréis que tenerlo ya).

Instalar Tiller:

./helm.sh

Utilizaremos los chart estables de Prometheus y Grafana que hay en el repositorio de Helm:
https://github.com/helm/charts/tree/master/stable/prometheus
https://github.com/helm/charts/tree/master/stable/grafana

Prometheus

Prometheus, aparte de ser el responsable de que tengamos fuegos que apagar los viernes a mediodía, es una solución de software libre para monitorización y alertado con un fuerte apoyo de la CNCF.

Prometheus recolecta métricas de nuestros objetivos en unos intervalos de tiempo definidos y, si lo deseas, dispara alertas. Funciona muy bien en la recolección de datos en entornos dinámicos, lo que la hace la herramienta ideal para monitorizar tanto nuestro Kubernetes, como los servicios desplegados en él, ya que dispone de muchos plugins (llamados exporters)

Desplegar Prometheus

Pasemos a la acción. Una vez tenemos helm listo en nuestro cluster, bastará con ejecutar el siguiente comando para desplegar Prometheus utilizando nuestro Helm y configurando los valores en el fichero prometheus-values.yml

helm install --name prometheus stable/prometheus --namespace monitoring -f prometheus-values.yaml  

Grafana

Grafana es un sistema para visualizar gráficas que además cuenta con una versatilidad enorme: trabaja con multitud de datasources, tiene un catálogo brutal de dashboards que ofrece la comunidad y si quieres avanzar más, podrás personalizarlos al máximo. Podremos visualizarlo todo desde la misma herramienta sin importar lo que queramos visualizar (Single Pane of Glass). En este caso, nos vamos a limitar a consultar los datos almacenados en Prometheus, pero hay un amplio catálogo:

  • Cloudwatch
  • Elasticsearch
  • InfluxDB
  • PostgreSQL
  • ...
Configuración como Código con ConfigMaps

En este punto, vamos a crear los dashboards y datasources necesarios. Los dashboards se pueden obtener de la comunidad, o bien fabricar los nuestros y exportarlos a un .json. En este caso partimos con los ConfigMaps ya creados en el repo, tenemos un datasource (prometheus) y tres dashboards de ejemplo:

kubectl apply -f datasources/datasource.yml -n monitoring  
kubectl apply -f dashboards/ -n monitoring  

Es importante etiquetar nuestros ConfigMaps, ya que Grafana los cargará en función de estas etiquetas.

Desplegar Grafana

Ahora solo tenemos que desplegar Grafana con el fichero grafana-values.yaml adaptado a nuestras necesidades:

helm install --name grafana stable/grafana --namespace monitoring -f grafana-values.yaml  

Para acceder a Grafana será suficiente con seguir el output del comando anterior:

NOTES:  
1. Get your 'admin' user password by running:

   kubectl get secret --namespace monitoring grafana -o jsonpath="{.data.admin-password}" | base64 --decode ; echo

2. The Grafana server can be accessed via port 80 on the following DNS name from within your cluster:

   grafana.monitoring.svc.cluster.local

   Get the Grafana URL to visit by running these commands in the same shell:

     export POD_NAME=$(kubectl get pods --namespace monitoring -l "app=grafana,release=grafana" -o jsonpath="{.items[0].metadata.name}")
     kubectl --namespace monitoring port-forward $POD_NAME 3000

3. Login with the password from step 1 and the username: admin  

Y ya estamos visualizando datos:

Podéis comprobar que los dashboards y datasources que se han creado corresponden con nuestros ConfigMaps:

A partir de ahora, será suficiente con crear nuevos ConfigMaps con las etiquetas correspondientes y Grafana los cargará automáticamente.

Conclusión

Con lo que hemos visto hasta ahora, identificamos varias ventajas:

  • Implementar nuestros recursos de monitorización con código utilizando un lenguaje común reduce la complejidad para administrarlas.
  • La configuración, al estar como código, podrá ser subido a nuestro repositorio de código (git) y por lo tanto, ser versionado.
  • Los equipos pueden actualizar su stack de monitorización con pipelines.
  • Utilizar estos ConfigMaps nos permite gestionar los dashboards y datasources como recursos individuales con su ciclo de vida independiente.

No obstante, tenemos que tener presente que esto es solo una parte del viaje; no es suficiente con gestionar nuestra monitorización como código. La responsabilidad de definir métricas, alertas y dashboards ha dejado de ser asunto de operaciones y pasa a requerir sinergias para ir hacia una organización "DevOps-Driven".