Blog de Amazon Web Services (AWS)

Monitoreo de pods en Windows con Prometheus y Grafana

Marcio Morales es autor de este articulo. Cezar Guimarães, ingeniero de software sénior de VTEX, es coautor de este artículo, Traducido al español por Nicolás Santisteban, Consultor DevOps en AWS Professional Services.

Introducción

Los clientes de todo el mundo están adoptando cada vez más Amazon Elastic Kubernetes Service (Amazon EKS) para ejecutar sus cargas de trabajo de Windows. Esto se debe a que los clientes se dan cuenta de que refactorizar las aplicaciones existentes basadas en Windows en un entorno de código abierto, si bien es ideal, es una tarea muy compleja. Necesita inversiones que, por lo general, no se traducen inmediatamente en un ahorro de costos, e invertir en esta refactorización de aplicaciones no es lo mejor para el presupuesto anual de TI. Sin embargo, desde el punto de vista del ahorro de costos y la modernización, es lógico volver a colocar las aplicaciones basadas en Windows existentes, pero críticas, en contenedores de Windows.

Herramientas como App2Container (A2C) han facilitado el cambio de plataforma de las aplicaciones. Sin embargo, para que las operaciones de “día dos” sean satisfactorias, los clientes deberían plantearse algunas transformaciones de infraestructura, como el registro, el monitoreo, el rastreo, etc. Para poder observar plenamente los contenedores de Windows en AWS, en 2022 publicamos un artículo de contenedores sobre cómo los clientes pueden utilizar una imagen de contenedor de fluent-bit en Windows administrado por AWS para centralizar el registro de los pods de Windows en diferentes destinos.

Prometheus y Grafana son algunas de las herramientas de monitoreo más populares para cargas de trabajo basadas en Kubernetes. Por eso, hoy publicamos un artículo que se centra en cómo los clientes pueden centralizar las métricas de los pods de Windows mediante Amazon Managed Service para Prometheus y Amazon Managed Grafana.

Descripción general de la solución

Esta publicación explica cómo configurar Windows Exporter (un exportador de Prometheus para Windows) como un daemonset de Kubernetes y un PromQL (lenguaje de consultas de Prometheus) para enriquecer las métricas de los contenedores de windows-exporter y, al mismo tiempo, combinarlas con kube-state-metrics (KSM). Esto le permite ampliar el monitoreo actual basado en Linux de Kubernetes para admitir cargas de trabajo basadas en Windows.

Flujo de la solución

Imagen 1. Flujo de la solución

  1. Amazon Managed Service para Prometheus extrae las métricas de los nodos o contenedores de Windows, como el uso de la CPU, la memoria, el disco y la red, del DaemonSet HostProcess del exportador de Windows.
  2. Amazon Managed Service para Prometheus utiliza KSM para asignar los pods y los nombres de los contenedores a su ID de contenedor.
  3. Amazon Managed Grafana ofrece la posibilidad de crear tableros de monitoreo a partir de las métricas recopiladas utilizando Amazon Managed Service para Prometheus como fuente de datos.

Requisitos previos

Los siguientes requisitos son necesarios para continuar:

  • Un clúster de Amazon EKS con nodos de Windows en funcionamiento. Consulte este paso a paso.
  • Amazon Managed Service para Prometheus con la ingestión de Amazon EKS correctamente configurada. Consulte este paso a paso.
  • Amazon Managed Grafana que esté totalmente integrado con Amazon Managed Service para Prometheus. Consulte este paso a paso.
  • Los requisitos previos de esta publicación utilizan servicios gestionados por AWS, como Amazon Managed Service para Prometheus con recopiladores gestionados y Amazon Managed Grafana. Sin embargo, esta publicación también se aplica a los agentes autogestionados de Prometheus, Grafana y ADOT/PROM-Server.

Tutorial

Los siguientes pasos le guiarán por los pasos descritos anteriormente.

1. Instalar KSM

Ahora instalamos KSM, un servicio simple que escucha al servidor API de Kubernetes y genera métricas sobre el estado de los objetos. Debemos recopilar KSM para asignar los pods y los nombres de contenedores a su ID de contenedor.

1.1 Introduzca el siguiente comando para instalar KSM:

helm repo add prometheus-community https://prometheus-community.github.io/helm-charts

helm install kube-state-metrics prometheus-community/kube-state-metrics -n kube-system

2. Crear un daemonset de Windows Exporter

En primer lugar, profundizando en la configuración del daemonset, configuraremos securityContext en HostProcess:True. Esto significa que el proceso del contenedor tiene acceso al espacio de nombres, almacenamiento y a los dispositivos de la red del host, lo que nos permite obtener las métricas de todos los contenedores que se ejecutan en el host al escuchar las métricas integradas de Windows.

La segunda parte es el initContainer, en el que configuramos el firewall del host para permitir el tráfico entrante TCP/9182, de modo que Amazon Managed Service para Prometheus pueda capturar al host. En la tercera parte, creamos un ConfigMap para insertar las configuraciones de windows-exporter y montarlo en el pod de Windows-exporter.

2.1 Cree un archivo que contenga el siguiente código y guárdelo como windows-exporter.yaml:

Si tiene algún taint en los nodos de Windows, asegúrese de añadir las tolerancias en la configuración del Daemonset.

kind: Namespace
apiVersion: v1
metadata:
  name: windows-monitoring
  labels:
    name: windows-monitoring
---
kind: DaemonSet
apiVersion: apps/v1
metadata:
  name: windows-exporter
  namespace: windows-monitoring
  labels:
    app: windows-exporter
spec:
  selector:
    matchLabels:
      app: windows-exporter
  template:
    metadata:
      labels:
        app: windows-exporter
      annotations:
        prometheus.io/scrape: "true"
        prometheus.io/scheme: http
        prometheus.io/path: "/metrics"
        prometheus.io/port: "9182"
    spec:
      securityContext:
        windowsOptions:
          hostProcess: true
          runAsUserName: "NT AUTHORITY\\system"
      hostNetwork: true
      initContainers:
        - name: configure-firewall
          image: mcr.microsoft.com/powershell:lts-nanoserver-1809
          command: ["powershell"]
          args: ["New-NetFirewallRule", "-DisplayName", "'windows-exporter'", "-Direction", "inbound", "-Profile", "Any", "-Action", "Allow", "-LocalPort", "9182", "-Protocol", "TCP"]
      containers:
      - args: 
        - --config.file=%CONTAINER_SANDBOX_MOUNT_POINT%/config.yml
        name: windows-exporter
        image: ghcr.io/prometheus-community/windows-exporter:latest
        imagePullPolicy: Always
        ports:
        - containerPort: 9182
          hostPort: 9182
          name: http
        volumeMounts:
        - name:  windows-exporter-config
          mountPath: /config.yml
          subPath: config.yml
      nodeSelector:
        kubernetes.io/os: windows
      volumes:
      - name: windows-exporter-config
        configMap:
          name: windows-exporter-config
---
kind: ConfigMap
apiVersion: v1
metadata:
  name: windows-exporter-config
  namespace: windows-monitoring
  labels:
    app: windows-exporter
data:
  config.yml: |
    collectors:
      enabled: '[defaults],container'
    collector:
      service:
        services-where: "Name='containerd' or Name='kubelet'"

Esta solución utiliza una imagen de contenedor Prometheus pública y de código abierto. Es su responsabilidad realizar las debidas diligencias de seguridad.

2.2 Cree el espacio de nombres de Kubernetes, Daemonset y ConfigMap. Ejecute el siguiente comando:

kubectl create -f windows-exporter.yaml

2.3 Compruebe que los pods del Daemonset esten funcionando. Ejecute el siguiente comando:

kubectl get pods -n windows-monitoring

2.4 Una vez que los pods estén en funcionamiento, puede comprobar si aceptan conexiones en el puerto 9182. Ejecute el siguiente comando:

kubectl logs windows-exporter-pod-name -n windows-monitoring

2.5 Debería de ver el pod de windows-exporter escuchando en el puerto 9182, el cual está siendo usado por Amazon Managed Service para Prometheus.

ts=2024-01-30T00:03:22.226Z caller=tls_config.go:313 level=info msg="Listening on" address=[::]:91

3. Visualización de las métricas de los pods de Windows en Amazon Managed Grafana

Suponiendo que ya tenga conocimientos sobre Grafana, puede crear paneles que sean relevantes para sus operaciones de “día dos”. A continuación, encontrará consultas de PromQL que recopilan automáticamente los datos correctos extraídos por Prometheus, fusionando las métricas de los contenedores de Windows y asignándolas a su pod. Estamos configurando la consulta para que rellene nuevos datos cada dos minutos.

Asegúrese de seleccionar la fuente de datos correcta al crear los paneles. En esta publicación, utilizamos Amazon Managed Service para Prometheus como fuente de datos.

 
Métrica Consulta Unidad
CPU kube_pod_container_info{} * on(container_id) group_left avg by (container_id) (rate(windows_container_cpu_usage_seconds_total{}[2m])) * 1000 custom: milliCPU
Memory kube_pod_container_info{} * on(container_id) group_left avg by (container_id) (windows_container_memory_usage_private_working_set_bytes{}) bytes
Network (sent) kube_pod_container_info{} * on(container_id) group_left avg by (container_id) (rate(windows_container_network_transmit_bytes_total{}[2m])) bytes/sec
Network (received) kube_pod_container_info{} * on(container_id) group_left avg by (container_id) (rate(windows_container_network_receive_bytes_total{}[2m])) bytes/sec
Disk (written) kube_pod_container_info{} * on(container_id) group_left avg by (container_id) (rate(windows_container_storage_write_size_bytes_total{}[2m])) bytes/sec
Disk (read) kube_pod_container_info{} * on(container_id) group_left avg by (container_id) (rate(windows_container_storage_read_size_bytes_total{}[2m])) bytes/sec

Consulte el repositorio GitHub de Windows Exporter para obtener una lista completa de las métricas exportadas de los contenedores de Windows.

Por ejemplo, en la siguiente consulta, filtramos el porcentaje total de uso de la CPU por segundo a nivel de pod. Para ello, debe crear un custom legend con el valor pod. Además, es esencial establecer las unidades del panel con las de la siguiente tabla.

image2_panel_consulta_grafana

Imagen 2. Panel de Consultas de Grafana

La consulta milliCPU genera el siguiente panel:

image4_windowspodsmilicpu

Imagen 3. Windows Pods: MilliCPU

La consulta de CPU mide el uso de la unidad de CPU de Kubernetes por segundo multiplicado por 1000 para que coincida con el milliCPUss de Kubernetes. Esto le permite identificar rápida y fácilmente si un pod necesita límites de CPU. Un segundo de CPU se refiere a un segundo de una CPU. Esta es la cantidad de tiempo en segundos que la CPU dedica a ejecutar activamente un proceso, en contraposición al tiempo transcurrido.

4. Visualización de las métricas de los nodos de Windows en Amazon Managed Grafana

No obstante, la visualización de las métricas de los nodos de Windows es crucial, al igual que las métricas de los pods de Windows. En la siguiente tabla, encontrará consultas de PromQL que proporcionan automáticamente los datos correctos obtenidos por Prometheus para cada nodo de Windows. Estamos configurando la consulta para que rellene nuevos datos cada dos minutos.

Métrica Consulta Unidad
CPU sum by (instance) (rate(windows_cpu_time_total{mode!=”idle”}[2m])) / count by (instance) (rate(windows_cpu_time_total{mode=”idle”}[2m])) Percent (0.0-1.0)
Memory (1 – windows_os_physical_memory_free_bytes{} / windows_cs_physical_memory_bytes{}) bytes/sec
Network (sent) rate(windows_net_bytes_sent_total{}[2m]) bytes/sec
Network (received) rate(windows_net_bytes_received_total{}[2m]) bytes/sec
Disk (written) sum by (instance) (rate(windows_physical_disk_write_bytes_total{}[2m])) bytes/sec
Disk (read) sum by (instance) (rate(windows_physical_disk_read_bytes_total{}[2m])) bytes/sec

Consulte el repositorio GitHub de Windows Exporter para obtener una lista completa de las métricas exportadas de los nodos de Windows.

Por ejemplo, en la siguiente consulta, filtramos el porcentaje total de uso de la CPU por segundo a nivel de pod. Para ello, debe crear un custom legend con el valor node. Además, es esencial establecer las unidades del panel con las de la tabla anterior.

image4_panel_consultas_grafana

Imagen 4. Panel de consultas de Grafana.

La consulta de memoria genera el siguiente panel:

imagen5 panel de porcentaje de uso de memoria de los nodos de Windows

Imagen 5. Panel de porcentaje de uso de memoria de los nodos de Windows

Conclusión

En esta publicación se explica cómo implementar correctamente Windows Exporter como un daemonset mediante un hostProcess en modo contenedor. Luego, explicamos cuál Windows y KSM deberían usarse para tener un panel de monitoreo adecuado de Grafana. También puede usar estas métricas para crear paneles adicionales a un tablero existente de Grafana, como cuando se implementa un Amazon EKS con un data plane mixto.

Además, consulte las prácticas recomendadas para ejecutar contenedores de Windows en Amazon EKS en la guía de prácticas recomendadas de Amazon EK

César Guimarães

César Guimarães, VTEX

Cezar Guimarães es ingeniero de software sénior en VTEX. Es una figura clave en el equipo de experiencia del desarrollador y destaca en el aprovechamiento de las tecnologías nativas de la nube para mejorar los procesos de desarrollo. Tiene experiencia en Kubernetes y en el desarrollo de software a gran escala.

Marcio Morales

Marcio Morales

Marcio Morales es uno de los principales arquitectos de soluciones especializados en Amazon Web Services y ayuda a los clientes a migrar y modernizar su infraestructura a AWS. Es autor del libro «Running Windows Containers on AWS» y es un experto global en la materia dedicado a los contenedores de Windows. Ayuda a los clientes de AWS a diseñar, crear, proteger y optimizar las cargas de trabajo de contenedores de Windows en AWS.

Blog Original en inglés: https://aws.amazon.com/es/blogs/containers/monitoring-windows-pods-with-prometheus-and-grafana/