NGINX Ingress Controller de F5 NGINX combinado con el operador de Prometheus ServiceMonitor CRD permite recopilar métricas de las implementaciones de NGINX Ingress Controller de forma mucho más fácil y rápida mediante Helm. El chart de Helm de NGINX Ingress Controller ahora permite aprovechar de inmediato la infraestructura existente de Prometheus y prometheus-operator, lo que le permite implementar NIC y disponer de métricas listas para usar mediante Prometheus ServiceMonitor. En este artículo se explica qué es ServiceMonitor, cómo instalarlo y cómo utilizar el chart de Helm de NGINX Ingress Controller para definir estos ajustes específicos.
ServiceMonitor de Prometheus
La definición de recurso personalizado (CRD) ServiceMonitor de Prometheus permite definir de forma declarativa cómo debe supervisarse un conjunto dinámico de servicios. Los servicios supervisados se definen mediante selectores de etiquetas de Kubernetes. Esto permite que una organización establezca convenciones que rijan cómo se exponen las métricas. Al seguir estas convenciones, los nuevos servicios se detectan automáticamente y Prometheus comienza a recopilar métricas sin necesidad de reconfigurar el sistema. ServiceMonitor forma parte de Prometheus Operator. Estos recursos describen y gestionan los objetivos de monitorización de los que Prometheus debe recopilar datos. El recurso de Prometheus se conecta a ServiceMonitor mediante un campo ServiceMonitor Selector. Prometheus puede identificar fácilmente qué objetivos se han marcado para la recopilación de datos. Esto proporciona un mayor control y flexibilidad para aprovechar los recursos ServiceMonitor del clúster de Kubernetes a fin de monitorizar soluciones como NGINX Ingress Controller. Para facilitar el proceso y proporcionar métricas listas para usar de NGINX Ingress Controller, recientemente añadimos a nuestro chart de Helm la posibilidad de utilizar Prometheus ServiceMonitor. Esto facilita enormemente la activación de métricas para que Prometheus comience a recopilarlas justo después de desplegar NGINX Ingress Controller. Para utilizar esta función, debemos añadir un segundo servicio creado específicamente para recopilar métricas, al que se «conectará» ServiceMonitor. Esto indicará a Prometheus Operator qué servicio debe monitorizar (mediante las etiquetas de los metadatos), para que sepa qué datos recopilar y dónde hacerlo. Este es un ejemplo del aspecto que tendría un servicio para NGINX Ingress Controller si formara parte de los archivos de despliegue o de Helm:
apiVersion: v1
kind: Service
metadata:
name: nginx-ingress-servicemonitor
labels:
app: nginx-ingress-servicemonitor
spec:
ports:
- name: prometheus
protocol: TCP
port: 9113
targetPort: 9113
selector:
app: nginx-ingressLo anterior formará parte del despliegue. La etiqueta app: nginx-ingress-servicemonitor «conecta» con el serviceMonitor para la recopilación de métricas de Prometheus. A continuación se muestra un ejemplo de serviceMonitor que se vincularía al servicio anterior denominado nginx-ingress-servicemonitor:
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: nginx-ingress-servicemonitor
labels:
app: nginx-ingress-servicemonitor
spec:
selector:
matchLabels:
app: nginx-ingress-servicemonitor
endpoints:
- port: prometheusEs necesario crear un recurso de Prometheus configurado para buscar los recursos serviceMonitor, lo que permite a Prometheus saber de forma rápida y sencilla qué endpoints debe consultar para recopilar métricas. En el siguiente ejemplo, este recurso indica a Prometheus qué elementos debe supervisar en la especificación. En concreto, supervisamos spec.serviceMonitorSelector.matchLabels:. Podemos ver que Prometheus busca matchLabels con app.nginx-ingress-servicemonitor en cualquier espacio de nombres. Esto coincide con el recurso serviceMonitor que desplegarán los charts de Helm del controlador de entrada NGINX y Helm.
apiVersion: monitoring.coreos.com/v1
kind: Prometheus
metadata:
name: prometheus
labels:
prometheus: prometheus
spec:
replicas: 1
serviceAccountName: prometheus
serviceMonitorNamespaceSelector: {}
serviceMonitorSelector:
matchLabels:
app: nginx-ingress-servicemonitor
resources:
requests:
memory: 500MiEste diagrama muestra cómo se conectan los distintos componentes:
Instalación de Prometheus, prometheus-operator y Grafana
Vamos a utilizar prometheus-community/kube-prometheus-stack para instalar el despliegue completo. Esto instalará prometheus, prometheus-operator y Grafana. También especificaremos que queremos instalarlo en el espacio de nombres monitoring para mantenerlo aislado. Así podemos instalarlo con helm: helm install metrics01 prometheus-community/kube-prometheus-stack -n monitoring --create-namespace
Crear e instalar el recurso de Prometheus
Una vez que Prometheus y los CRD de Prometheus estén instalados en el clúster, podremos crear nuestro recurso de Prometheus. Al desplegarlo con antelación, podremos «preconfigurar» Prometheus con las etiquetas que utilizaremos en el chart de Helm. De este modo, Prometheus podrá empezar a buscar automáticamente NGINX Ingress Controller y recopilar sus métricas. Nuestro recurso de Prometheus se desplegará antes de instalar NGINX Ingress Controller. Esto permitirá que prometheus-operator detecte automáticamente nuestro NGINX Ingress Controller tras el despliegue y recopile sus métricas, de modo que estén disponibles rápidamente.
apiVersion: monitoring.coreos.com/v1
kind: Prometheus
metadata:
name: prometheus
namespace: default
labels:
prometheus: monitoring
spec:
replicas: 1
serviceAccountName: prometheus
serviceMonitorNamespaceSelector: {}
serviceMonitorSelector:
matchLabels:
app: nginx-ingress-servicemonitor
resources:
requests:
memory: 500MiEl ejemplo anterior es un ejemplo básico. La parte clave es el valor spec.serviceMonitorSelector.matchLabels que hemos especificado. Este valor es el que utilizaremos cuando despleguemos el controlador NGINX Ingress con el chart de Helm. Queremos proporcionar métricas de Prometheus listas para usar. Para ello, utilizaremos el chart de Helm de NGINX Ingress Controller.
Cambios en el archivo values.yaml del chart de Helm de NGINX Ingress Controller
Podemos revisar el archivo values.yaml del chart de Helm. Hay una sección de Prometheus en la que queremos centrarnos, ya que contiene los elementos necesarios para habilitar Prometheus, crear el servicio requerido y crear un recurso serviceMonitor. En la sección de Prometheus, deberíamos ver varias opciones de configuración: prometheus.service prometheus.serviceMonitor Vamos a habilitar las dos opciones anteriores para generar el servicio y el serviceMonitor necesarios al utilizar el chart de Helm. Esta es la sección específica en la que habilitamos el servicio, habilitamos serviceMonitor y definimos las etiquetas en la sección serviceMonitor:
`servicemonitor` support was recently added to the NGINX Ingress controller helm chart.
prometheus:
## Expose NGINX or NGINX Plus metrics in the Prometheus format.
create: true
## Configures the port to scrape the metrics.
port: 9113
secret: ""
## Configures the HTTP scheme used.
scheme: http
service:
## Requires prometheus.create=true
create: true
serviceMonitor:
create: true
labels: { app: nginx-ingress-servicemonitor } Desglosando los valores de lo anterior:
prometheus:
## Expose NGINX or NGINX Plus metrics in the Prometheus format.
create: trueIndica a Helm que quieres habilitar el endpoint de Prometheus del NIC. También puedes definir un puerto, un esquema y un secreto si es necesario. Al establecer el valor de prometheus.service.create en true, Helm creará automáticamente el servicio ServiceMonitor del NIC.
service:
## Creates a ClusterIP Service to expose Prometheus metrics internally
## Requires prometheus.create=true
create: truePor último, debemos crear el serviceMonitor. Al establecerlo en true y añadir las etiquetas correctas, se crearán y añadirán las etiquetas que coincidan con nuestro recurso de Prometheus.
serviceMonitor:
## Creates a serviceMonitor to expose statistics on the kubernetes pods.
create: true
## Kubernetes object labels to attach to the serviceMonitor object.
labels: { app: nginx-ingress-servicemonitor } La etiqueta hace referencia al nombre de service.labels: { app: nginx-ingress-servicemointor } En resumen: habilite Prometheus para exponer la funcionalidad del exportador de Prometheus de NIC. Defina un objeto Service, que permitirá que ServiceMonitor de Prometheus detecte los endpoints del exportador de Prometheus de NIC. Defina un objeto serviceMonitor para indicar a ServiceMonitor de Prometheus que debe supervisarlo.
Ahora podemos instalar NGINX Ingress Controller con helm.
Una vez que hayamos modificado nuestro values.yaml, podremos proceder a instalar NGINX Ingress Controller. helm install nic01 -n nginx-ingress --create-namespace -f values.yaml . Después de implementar NGINX Ingress Controller, podemos abrir el panel de Prometheus y acceder al menú de estado. Desde allí, podemos ir a las vistas de objetivos y detección de servicios. Cuando Prometheus localice nuestro nuevo recurso ServiceMonitor, comenzará a consultar el endpoint y a recopilar métricas, que aparecerán de inmediato en el panel de Prometheus.

Figura 3: objetivo de Prometheus

Podemos comprobar que, al utilizar herramientas nativas de Kubernetes como Helm y Prometheus, NGINX Ingress Controller facilita enormemente la recopilación de métricas desde el inicio del despliegue, proporcionando «métricas listas para usar». A continuación se incluyen documentos de referencia para instalar prometheus-operator: https://prometheus-operator.dev/ https://github.com/prometheus-operator/prometheus-operator
Sobre el autor

Artículos relacionados del blog
Únete a F5 NGINX en AppWorld 2024
Descubre las numerosas razones para asistir al evento insignia de F5, que incluirá un emocionante anuncio sobre la cartera de productos NGINX.
Rotación de certificados SSL/TLS sin reinicios en NGINX Open Source
La función de diccionario compartido permite configurar NGINX sin necesidad de reiniciarlo al renovar los certificados SSL/TLS.
Exposición de APIs en Kubernetes
La unidad 2 de Microservices March 2022 se centra en cómo exponer tus API en Kubernetes. Aquí tienes enlaces a los recursos que necesitas: la retransmisión en directo del 14 de marzo, artículos de blog y otros recursos de preparación, y el laboratorio práctico «Protege las API de Kubernetes mediante la limitación de solicitudes».
NGINX Sprint 2.0: visión clara, código renovado y nuevos compromisos con el código abierto
Hoy, en NGINX Sprint 2.0, anunciamos cómo respaldaremos nuestra visión del futuro de las aplicaciones modernas con una mayor presencia en la comunidad de código abierto, incluida la participación en el proyecto comunitario Kubernetes, nuevos proyectos de software de código abierto y la arquitectura de referencia para aplicaciones modernas.
Presentamos NGINX Plus R22
NGINX Plus R22 incorpora nuevas funcionalidades, como la compatibilidad con OCSP para verificar la revocación de certificados en TLS mutuo, el uso de varios proveedores de identidad OIDC en una configuración, el seguimiento en tiempo real de la limitación de solicitudes y conexiones en el panel de NGINX Plus y mejoras en NGINX JavaScript.
Presentamos NGINX Plus R17
NGINX Plus R17 incorpora compatibilidad con la limitación de velocidad en dos fases y con TLS 1.3, la versión más reciente del protocolo Transport Layer Security. La configuración de OpenID Connect es más sencilla y NGINX ModSecurity WAF es el doble de rápido que antes. También se ha actualizado el módulo JavaScript de NGINX.