Puedo prometer y Prometheus

Una de las partes más importantes en la infraestructura es la monitorización y, en el caso de los microservicios, en Kubernetes, tenemos a Prometheus. Es una excelente herramienta de monitorización para k8s, que cuando la utilices y conozcas sus bondades, harán en ti que te enamores y no dejes de pensar en ella.

¿Qué es Prometheus?

Prometheus es un sistema de monitorización y de alerta open source cuyo origen se remonta en el 2012 en la compañía SoundCloud, y desde allí (conjunto con el crecimiento de k8s) ha sido adoptado por muchas empresas. Prometheus se unió al Cloud Native Computing Foundation en el 2016.

El ecosistema de Prometheus consiste de varios componentes, los principales son los siguientes:

  • El servidor de Prometheus para consultar y almacenar la series de datos.
  • Un Pushgateway para permitir que los trabajos efímeros y por lotes expongan sus métricas a Prometheus.
  • Exporters útil para casos donde no es factible instrumentar un sistema dado con métricas Prometheus directamente.
  • Un sistema de manejo de alarmado.
  • Un sistema de discovery.

Prometheus básicamente almacena todos los datos como series de tiempo. Cada serie de tiempo se identifica de forma única por su nombre de indicador y un conjunto de pares clave-valor, también conocidos como “labels”.

Los tipos de métricas utilizadas en Prometheus son las siguientes:

  • Counter: es una métrica acumulativa que representa un solo contador cuyo valor puede solamente incrementar o reiniciar a cero.
  • Gauge: es una métrica que representa un solo valor numeral que puede arbitrariamente subir o bajar.
  • Histogram: muestrea las observaciones y las cuenta en categorías configurables. También proporciona una suma de todos los valores observados.

Prometheus Operator

Un operador se basa en los conceptos básicos de recursos y controladores de Kubernetes, pero incluye el conocimiento del dominio de la aplicación para encargarse de las tareas comunes.

Prometheus Operator es fácil de instalar con una sola línea de comandos (lo veremos más abajo) y permite a los usuarios configurar y administrar instancias de Prometheus usando una configuración declarativa simple que, creará, configurará y administrará las instancias de monitoreo de Prometheus.

Una vez instalado el Prometheus Operator provee las siguientes características:

  • Crear/Destruir: fácilmente crea y destruye instancias de Prometheus en los namespaces de Kubernetes.
  • Simple Configuración: se encarga de las configuraciones de Prometheus, como lo son versiones, persistencia,  políticas, entre otros.
  • “Taguea” Servicios basados en etiquetas: automáticamente genera los “target” de configuración basado en etiquetas de Kubernetes, para poder realizar consultas sobre dichas etiquetas.

¿Cómo se puede implementar?

Prometheus se puede implementar de varias formas, desde la descarga de un .tar.gz de su página web, donde ya viene un ejecutable, hasta su implementación en Kubernetes por medio de Helm.

Nosotros nos vamos a enfocar en Prometheus y Visualización de sus datos, en el equipo de sistemas de Paradigma utilizamos la implementación basada en helm de CoreOS, en despliegues de Kubernetes.

  1. Lo primero que debemos hacer es crear el namespace donde se va a implementar Prometheus: kubectl create namespace monitoring

IMPORTANTE: El namespace de k8s TIENE que llamarse “monitoring” por que sino, Prometheus no captura las métricas de k8s.

  1. Luego agregar el repo de CoreOS en nuestro helm: helm repo add coreos https://s3-eu-west-1.amazonaws.com/coreos-charts/stable/
  2. Una vez agregado el repo hacemos la instalación de Prometheus Operator según el siguiente comando: helm install coreos/prometheus-operator –name prometheus-operator –namespace monitoring –set rbacEnable=true
  3. Después hacemos la instalación del kube-prometheus: helm install –name mon –namespace monitoring -f prometheus-values.yaml -f grafana-values.yaml -f alertmanager.yaml coreos/kube-prometheus

Donde el fichero xxxxx-values.yaml tiene los parámetros personalizados de la implementación del helm de kube-prometheus. Este fichero debería estar versionado en git.

El único detalle de esta implementación es que Grafana no guarda persistencia en disco duro. Para lograr esto se debe deshabilitar Grafana en el fichero de prometheus-values.yaml con la siguiente opción: deployGrafana: False y haríamos la implementación de Grafana del repo helm install –name grafana –namespace monitoring -f grafana-values.yaml stable/grafana

Para revisar que está implementado ejecutamos el comando de k8s siguiente: kubectl get pods -n monitoring

Es importante los Service Monitor ya que estos dan “visibilidad” dentro de Prometheus, por ejemplo el de Nexus 2 sería así:

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
 labels:
   app: prometheus
   chart: prometheus-0.0.51
   heritage: Tiller
   prometheus: monitor
   release: monitor
 name: monitor-nexus-exporter
 namespace: monitoring
spec:
 endpoints:
 - interval: 30s
   path: /metrics
   port: monitoring
 namespaceSelector:
   any: true
 selector:
   matchLabels:
     app: sonatype-nexus

Aquí cabe destacar el “endpoint” con el se comunicará el servicio a monitorizar con Prometheus. Intervalo de 30 segundos de consulta, path a consultar el servicios y nombre del puerto (anteriormente creado en un “Service”) a conectar.

Para revisar si Prometheus “ve” el hosts debemos ir a la siguientes URL: http://<ip_del_ingress>:9090

Veremos una pantalla como la siguiente:

Para confirmar que nuestro hosts a monitorizar está listo para arrojar métricas a Prometheus debe primero ser “descubierto” por el Service Discovery (recuadro rojo):

Luego revisamos los “Targets” para verificar que Prometheus “llega” al servicio de métricas del host de nexus 2.

El servicio de métricas está “UP” y ¡funcionando!  Ahora podemos realizar una consulta a las métricas de “Graph”, esta interfaz tiene la ventaja del “autocompletado” si y sólo si las métricas son enviadas:

Una vez seleccionada la métrica a consultar, hacemos clic en el botón de “Execute”:

Con esto solamente quedaría configurar alguna herramienta gráfica como Grafana para poder hacer consultas PromQL y mostrar información “real”.

Y hasta aquí prometo y Prometheus…

Tengo más de 20 años de experiencia en el sector de IT. Actualmente soy arquitecto de la nube en Paradigma Digital y varios de mis proyectos han sido con microservicios en Kubernetes, implementados en las nubes de AWS y Google Cloud. Para ello he utilizado herramientas de infrastructure as code (IaC) como Terraform y CloudFormation, y herramientas de Configuration Management como Ansible. Además de ser un auténtico fan de las certificaciones y Python lover.

Ver toda la actividad de Álvaro Linares

2 comentarios

  1. Sergio Delgado dice:

    Me encanta el título del post, Álvaro. :D

Escribe un comentario