Gestión sencilla de la canalización de supervisión de Prometheus con el operador de Prometheus

Prometheus es un conjunto de herramientas de monitoreo y alerta de código abierto desarrollado originalmente por SoundCloud en 2012. Desde entonces, la plataforma ha atraído a una vibrante comunidad de desarrolladores y usuarios. Prometheus ahora está estrechamente integrado en el ecosistema nativo de la nube y tiene soporte nativo para contenedores y Kubernetes.

En el tutorial anterior, aprendió cómo configurar e implementar Prometheus para monitorear sus aplicaciones de Kubernetes. Sin embargo, configurar Prometheus no es una tarea trivial porque necesita tener un conocimiento específico del dominio, incluido el formato de configuración de Prometheus y la configuración de descubrimiento automático de Kubernetes. Obviamente, adquirir este conocimiento requiere tiempo y esfuerzo.

Sin embargo, como mostramos en este tutorial, puede simplificar drásticamente la implementación y administración de sus instancias de Prometheus con el Operador de Prometheus desarrollado por CoreOS. Discutimos cómo el operador de Prometheus podría beneficiar su canal de monitoreo y luego lo guiamos a través de la configuración de un operador de Prometheus en funcionamiento para recopilar métricas en formato Prometheus de sus aplicaciones. ¡Empecemos!

¿Qué son los operadores?

El concepto de operadores de software fue introducido por CoreOS en 2016. En pocas palabras, un operador es cualquier controlador específico de la aplicación o del dominio que extiende la API de Kubernetes para simplificar la implementación, la configuración, y administración de aplicaciones con estado complejas en nombre de los usuarios de Kubernetes.

Bajo el capó, los operadores abstraen las API y los controladores básicos de Kubernetes y automatizan tareas comunes para aplicaciones específicas (por ejemplo, Prometheus). Gracias a esta abstracción, los usuarios pueden configurar fácilmente aplicaciones complejas incluso con poco conocimiento de la configuración y el idioma específicos de su dominio. Además, los operadores pueden resultar útiles para una amplia gama de otras tareas, incluida la coordinación segura de actualizaciones de aplicaciones, descubrimiento de servicios, configuración de certificados TLS, recuperación ante desastres, gestión de copias de seguridad, etc.

Operador de Prometheus

Sobre la base de la definición anterior, el operador de Prometheus puede definirse como una pieza de software sobre Kubernetes que permite una administración más sencilla de las instancias de Prometheus, incluida su configuración y descubrimiento de servicios. Permite al usuario lanzar fácilmente varias instancias de Prometheus, configurar versiones de Prometheus, así como administrar políticas de retención, persistencia y réplicas.

Además, el operador de Prometheus puede generar automáticamente la configuración del objetivo de supervisión en función de las consultas de etiquetas de Kubernetes. Los usuarios pueden simplemente referirse a los servicios y pods que desean monitorear en el manifiesto del operador de Prometheus, y el operador se encargará de insertar la configuración de Prometheus adecuada para el descubrimiento automático de Kubernetes.

Para implementar esta funcionalidad, Prometheus Operator introduce recursos y abstracciones adicionales diseñados como Definiciones de recursos personalizadas (CRD). Estos incluyen:

En este artículo, exploramos solo los monitores de servicios y recursos de Prometheus, el mínimo necesario para configurar Prometheus Operator para monitorear su clúster de Kubernetes.

Para completar los ejemplos que se utilizan a continuación, necesitará los siguientes requisitos previos:

Con este entorno configurado, vamos a monitorear una aplicación web simple que exporta métricas en formato Prometheus. ¡Empecemos!

Paso 1: Cree un operador de Prometheus

Un operador de Prometheus tiene que acceder a la API de Kubernetes, a los nodos y a los componentes del clúster, por lo que debemos otorgarle algunos permisos. Podemos hacer esto a través del recurso ClusterRole que define una política RBAC. El ClusterRole contiene reglas que representan un conjunto de permisos. Estos permisos son aditivos, por lo que deberíamos enumerarlos todos. Usaremos el recurso ClusterRole que puede otorgar permisos para manipular recursos de todo el clúster en lugar de Role, que tiene un ámbito de espacio de nombres.

El manifiesto anterior otorga al operador de Prometheus los siguientes permisos para todo el clúster:

A continuación, debemos proporcionar una identidad para nuestro operador Prometheus. Esto se puede hacer con una cuenta de servicio.

Ahora, como tenemos un ClusterRole y un ServiceAccount , necesitamos vincular la lista de permisos definidos en el ClusterRole a Prometheus Operador. ClusterRoleBinding permite asociar una lista de usuarios, grupos o cuentas de servicio a una función específica. Vincularemos nuestro ClusterRole a la cuenta de servicio del operador de Prometheus.

Tenga en cuenta que roleRef.name debe coincidir con el nombre del ClusterRole creado en el primer paso y que subject.name debe coincidir con el nombre de la cuenta de servicio creada en el segundo paso.

Vamos a crear estos recursos de forma masiva, por lo tanto, coloque los manifiestos anteriores en un archivo (por ejemplo, authorize.yml ) separando cada manifiesto por - - - delímetro . Luego ejecuta:

¡Genial! Ahora tenemos todos los permisos requeridos por el operador de Prometheus para administrar instancias de Prometheus y monitorear aplicaciones. Creemos una implementación de una réplica para el operador de Prometheus:

Hay algunas cosas importantes que hace este manifiesto:

Ahora, guardemos esta especificación en prometheus-deployment.yml y creemos la implementación:

Verifique que los pods de la implementación se estén ejecutando:

Paso 2: Implementar la aplicación Envío de métricas en formato Prometheus

En este punto, el operador de Prometheus no tiene aplicaciones para monitorear. Por lo tanto, antes de definir ServiceMonitors y Prometheus CRD, necesitamos implementar algunas métricas de envío de aplicaciones en formato Prometheus. Para ello, utilizamos una aplicación de ejemplo de la biblioteca cliente de Go que exporta latencias RPC ficticias de algún servicio. Para implementar la aplicación en el clúster de Kubernetes, la colocamos en contenedores con Docker y la enviamos al repositorio de Docker Hub. Implementemos esta aplicación de ejemplo que ofrece métricas en el extremo / metrics que Prometheus observa de forma predeterminada. A continuación se muestra el manifiesto de implementación que usamos:

Tenga en cuenta que el containerPort es 8081 , que es el puerto definido en el código de la aplicación.

Guarde este manifiesto en rpc-app-deployment.yml y cree la implementación:

Verifiquemos que nuestra implementación lanzó con éxito dos réplicas de pod de nuestra aplicación:

Para permitir que el operador de Prometheus acceda a esta implementación, necesitamos exponer un servicio. Este servicio puede entonces ser descubierto por ServiceMonitor usando selectores de etiquetas. Necesitamos crear un servicio que seleccione pods por su etiqueta app y su valor rpc-app . Echemos un vistazo a este manifiesto de servicio:

Además, tenga en cuenta que especificamos un targetPort para este servicio que se refiere al puerto en los pods de backend del servicio. Si no se especifica el valor de targetPort , Kubernetes asigna automáticamente el valor de containerPort al targetPort , pero incluimos el campo explícitamente para resaltar su importancia .

Guardemos esta especificación anterior en algún archivo (por ejemplo, rpc-app-service.yml ) y creemos el servicio:

Ahora puede verificar que el servicio descubrió con éxito los puntos finales de la implementación y configuró los puertos correctos:

Paso 3: Cree un ServiceMonitor

Prometheus Operator utiliza ServiceMonitors para detectar automáticamente los pods de destino según los selectores de etiquetas y asociarlos con las instancias de Prometheus. Echemos un vistazo al manifiesto a continuación:

El ServiceMonitor definido anteriormente seleccionará los pods etiquetados como app: rpc-app utilizando el campo spec.selector.matchLabels . Tenga en cuenta que este campo debe coincidir con app: rpc-app para que ServiceMonitor encuentre los puntos finales correspondientes de la implementación.

Además, definimos la etiqueta env: production para ServiceMonitor . Esta etiqueta será utilizada por el operador de Prometheus para encontrar el ServiceMonitor . Finalmente, debido a que implementamos nuestro rpc-app-container con el puerto con nombre “web”, podemos referirnos fácilmente a él en el ServiceMonitor sin especificar el número de puerto. Esto nos permite cambiar el número de puerto más tarde sin afectar la integridad de otros recursos.

Creemos el ServiceMonitor:

Paso 4: Cree un recurso de Prometheus

El siguiente paso es crear un recurso de Prometheus. Su manifiesto define el serviceMonitorSelector que asocia ServiceMonitors con el operador. El valor de este campo debe coincidir con la etiqueta env: production especificada en el manifiesto ServiceMonitor anterior. El uso de etiquetas ServiceMonitor facilita la reconfiguración dinámica de Prometheus.

Además, tenga en cuenta que debe consultar la cuenta de servicio creada en el Paso n. ° 1 anterior. Sin esto, el operador de Prometheus no podrá acceder a los recursos del clúster ni a las API. Este pequeño detalle se abordó en el número 1272 en GitHub.

Además, si la autorización RBAC está habilitada en su clúster, debe crear reglas RBAC para Prometheus y Prometheus Operator. Consulte el capítulo “Habilitar las reglas de RBAC para Prometheus Pods” de la documentación oficial de CoreOS para encontrar las definiciones de recursos de RBAC requeridas.

Ahora, guardemos este manifiesto en prometheus-resource.yml y creemos el recurso de Prometheus:

Finalmente, necesitamos crear un servicio Prometheus de un tipo NodePort para exponer Prometheus al mundo externo. De esa forma podemos acceder a la interfaz web de Prometheus.

Guarde esta especificación en prometheus-service.yml y cree el servicio:

Ahora puede acceder al panel de Prometheus desde su navegador. Si ejecuta su clúster con Minikube, puede encontrar la IP y el puerto de Prometheus con el siguiente comando:

Luego puede acceder al panel de Prometheus en su navegador ingresando esta dirección.

Si va al punto final / target , verá la lista de los objetivos actuales de Prometheus. Cada réplica de implementación se trata como un objetivo independiente, por lo que verá dos objetivos en su panel. También puede encontrar las etiquetas del objetivo y la hora del último raspado.

El operador de Prometheus creó automáticamente una configuración de Prometheus en funcionamiento con kubernetes_sd_configs para el descubrimiento automático de los puntos finales del servicio de Kubernetes. Esta es una característica realmente interesante porque te libera de la necesidad de aprender el lenguaje de configuración específico de Prometheus. Puede ver la configuración de Prometheus generada automáticamente en Estado – & gt; Pestaña Configuración :

Finalmente, podemos visualizar series de tiempo RPC generadas por nuestra aplicación de ejemplo. Para ello, vaya a la pestaña Gráfico donde puede seleccionar las métricas a visualizar.

En el ejemplo anterior, visualizamos las métricas de rpc_durations_histogram_seconds . Como puede ver, usamos una opción “apilada” para la visualización de series de tiempo, pero puede optar por líneas simples, por supuesto. También puede jugar con otras métricas de RPC y métricas nativas de Prometheus. La interfaz web también es compatible con el lenguaje de consulta PromQL de Prometheus para seleccionar y agregar las métricas que necesita. PromQL tiene una semántica funcional rica que le permite trabajar con series de tiempo, instancias y vectores de rango, escalares y cadenas. Para obtener más información sobre PromQL, consulte la documentación oficial.

Conclusión

Como ya ha aprendido, Prometheus Operator para Kubernetes ofrece abstracciones útiles para configurar y administrar su canal de supervisión de Prometheus. El uso del operador significa que ya no es necesario configurar manualmente la configuración de descubrimiento automático de Kubernetes, lo que implica aprender muchas cosas. Todo lo que necesita definir es el ServiceMonitor con una lista de pods de los que extraer métricas, y el recurso de Prometheus que automatiza la configuración y vincula los ServiceMonitors con las instancias de Prometheus en ejecución. Junto con estas características, Prometheus Operator admite la configuración rápida de los administradores de alertas de Prometheus. Todas estas características simplifican drásticamente la administración de su canal de monitoreo de Prometheus al tiempo que mantienen la flexibilidad y el control si es necesario.

Publicado originalmente en supergiant.io.