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.
- 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.
- Amazon Managed Service para Prometheus utiliza KSM para asignar los pods y los nombres de los contenedores a su ID de contenedor.
- 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.
La consulta milliCPU genera el siguiente panel:
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.
La consulta de memoria genera el siguiente panel:
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, 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 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/