Prometheus Federation 101

David Fernández
4 min readDec 30, 2018

--

Prometheus es un sistema de monitoreo del tipo time series incubado por Cloud Native Computing Foundation. Como todo sistema time series, podemos acceder a nuestras métricas por fracción de tiempo, dependiendo de la configuración de scrappeo configurado. Para realizar consultas se puede hacer por intermedio de su interfaz utilizando PromQL o también realizar consultas mediante su API .

Cuenta con varios exporter, (así son llamados los “agentes” de monitoreo) y -a diferencia de los sistemas tradicionales de monitoreo-, el servidor, en este caso Prometheus, es el encargado de ir a consultar las métricas a los exporter. Podemos encontrar exporter oficiales y no oficiales dentro del proyecto: entre los oficiales uno de los más conocidos es Node Exporter, que permite recopilar la información de CPU, Memoria, Red y Disco de un host. Asimismo podemos encontrar un lista de exporter para la necesidad que tengamos, por ejemplo: Mongo exporter, Kafka exporter, Rabbitmq exporter, etc.

¿Por qué usamos Prometheus?

Principalmente porque se trata de una solución pensada para trabajar nativamente con containers, cuenta con muy buena integración con Kubernetes y también con servicios cloud, como AWS, Azure, etc. En nuestro caso, necesitamos una solución de monitoreo tanto para para K8 como AWS, ya que trabajamos sobre sistemas híbridos. Como plus, Prometheus ofrece una excelente integración con Grafana como visualizador y sistema de alarma.

Me gustaría hablar un poco de la implementación de federation que lleve a cabo con tres clusters de Kubernetes: production, development y management. Anteriormente contábamos con un único cluster para todos los ambientes de vida del desarrollo, separado por namespaces. La verdad no es una práctica recomendada. Menos aún tener el monitoreo en el mismo cluster 😱, porque ante cualquier problema de conectividad no sabés qué sucede en tu cluster y pierde sentido el monitoreo.

Arquitectura de prometheus federation

Primer problema a resolver: al tener tres clusters debía encontrar la forma de tener un monitoreo unificado, para no perder tiempo en armar varios dashboard y alertas por ambiente y a la vez poder replicar la información de Prometheus. Todo esto se puede resolver usando Prometheus Federation.

Cada cluster de Kubernetes cuenta con un deploy de Prometheus con los agentes Node Exporter y kube state metrics, además cuentan con integración con kubelet que incorpora cadvisor y podemos así obtener métricas de nuestros containers.

Continuo un poco la configuración de Prometheus y como trabaja la federación. Cada cluster cuenta con un Prometheus y sus exporter del cual se puede acceder desde su UI por medio de un ingress. Tanto Production como Development tienen una configuración de scrape bastante similar en mi caso, pero con diferentes tiempos de persistencia. Sin entrar en detalle sobre cómo configurar ciertas cosas, vamos directo a la configuración de federation. En cada Prometheus tenemos el archivo de configuración prometheus.yml, el mismo se encuentra como un configmap en nuestro deployments. Podemos encontrar en este archivo los diferentes parámetros de configuración de nuestro servidor pero nos vamos a detener en los siguientes:

external_labels:slave: development

Con esto a nuestras métricas de Prometheus se le agrega la etiqueta slave con el valor correspondiente al nombre del cluster, en este caso Development. Esta etiqueta debe ser agregada, ya que no viene por default.

Ahora tenemos que configurar nuestro Prometheus que va a servir de nodo central. Creamos un job, en este caso lo voy a llamar federate, cada 60 segundos consultará las métricas de los otros servidores. La etiqueta honor_labels, es para que nuestro servidor central solo tenga acceso a lectura a los otros servidores. Por otro parte, para consultar el estado del cluster, podemos acceder a /federate desde nuestro servidor. Luego configuramos los parámetros de las métricas que queremos persistir, y por último static_configs donde hacemos referencia a los servidores que van a integrar el cluster.

- job_name: ‘federate’scrape_interval: 60shonor_labels: truemetrics_path: ‘/federate’params:‘match[]’:- ‘{__name__=~”job:.*”}’- ‘{job=”prometheus”}’- ‘{job=”kubernetes-nodes”}’- ‘{job=”kubernetes-cadvisor”}’- ‘{name=~”.+”}’- ‘{job=”kubernetes-service-endpoints”}’- ‘{job=”kubernetes-pods”}’- ‘{job=”kubernetes-apiservers”}’- ‘{release=”prometheus-production”}’- ‘{release=”prometheus-development”}’- ‘{release=”prometheus-sandbox”}’- ‘{pod_name=”.+”}’static_configs:- targets:- ‘prometheus.production.com’- ‘prometheus.development.com’
Un ejemplo de cómo se realizan búsqueda con el slave

Ahora tenemos armado un Prometheus Federation, solo necesitan configurar como base de datos al Prometheus lider en su Grafana y podran hacer uso de las métricas de los diferentes cluster. Asimismo también pueden hacer uso de Alertmanager para monitorear sus diferentes ambientes.

Comparto con ustedes, algunas configuraciones de ejemplo para que puedan realizar su cluster federation.

https://github.com/violenti/prometheus-federation

Mas información:

Gracias @anitalmada por las correcciones como siempre.

V0.1

--

--