Obtención de métricas sin procesar del plano de control en formato Prometheus - Amazon EKS

Obtención de métricas sin procesar del plano de control en formato Prometheus

El plano de control de Kubernetes expone una serie de métricas que se representan en un formato Prometheus. Estas métricas son útiles para el monitoreo y el análisis. Se exponen internamente a través de puntos de conexión de métricas, y se puede acceder a estos sin implementar Prometheus completamente. Sin embargo, una implementación de Prometheus más sencilla permite analizar las métricas a lo largo del tiempo.

Para ver la salida de métricas sin procesar, ejecute el siguiente comando.

kubectl get --raw endpoint

Este comando permite pasar cualquier ruta de punto de conexión y devuelve la respuesta sin procesar. La salida enumera las diferentes métricas línea por línea, y cada línea incluye un nombre de métrica, etiquetas y un valor.

metric_name{tag="value"[,...]} value

Cómo obtener métricas del servidor de la API

El punto de conexión general del servidor de la API se expone en el plano de control de Amazon EKS. Este punto de conexión resulta útil sobre todo cuando se examina una métrica específica.

kubectl get --raw /metrics

Un ejemplo de salida sería el siguiente.

[...] # HELP rest_client_requests_total Number of HTTP requests, partitioned by status code, method, and host. # TYPE rest_client_requests_total counter rest_client_requests_total{code="200",host="127.0.0.1:21362",method="POST"} 4994 rest_client_requests_total{code="200",host="127.0.0.1:443",method="DELETE"} 1 rest_client_requests_total{code="200",host="127.0.0.1:443",method="GET"} 1.326086e+06 rest_client_requests_total{code="200",host="127.0.0.1:443",method="PUT"} 862173 rest_client_requests_total{code="404",host="127.0.0.1:443",method="GET"} 2 rest_client_requests_total{code="409",host="127.0.0.1:443",method="POST"} 3 rest_client_requests_total{code="409",host="127.0.0.1:443",method="PUT"} 8 # HELP ssh_tunnel_open_count Counter of ssh tunnel total open attempts # TYPE ssh_tunnel_open_count counter ssh_tunnel_open_count 0 # HELP ssh_tunnel_open_fail_count Counter of ssh tunnel failed open attempts # TYPE ssh_tunnel_open_fail_count counter ssh_tunnel_open_fail_count 0

Este resultado sin procesar devuelve literalmente lo que el servidor de API expone.

Métricas del plano de control con metrics.eks.amazonaws.com

En el caso de los clústeres nuevos que son Kubernetes versión 1.28 y posteriores, Amazon EKS también expone métricas bajo el grupo de la API metrics.eks.amazonaws.com. Estas métricas incluyen componentes del plano de control, como kube-scheduler y kube-controller-manager. Estas métricas básicas también se encuentran disponibles para los clústeres existentes que tengan una versión de plataforma igual o posterior en comparación con la tabla siguiente.

Versión de Kubernetes Versión de la plataforma

1.31

eks.10

1.30

eks.18

1.29

eks.21

1.28

eks.27

Cómo obtener métricas de kube-scheduler

Utilice el siguiente comando para obtener métricas de kube-scheduler

kubectl get --raw "/apis/metrics.eks.amazonaws.com/v1/ksh/container/metrics"

Un ejemplo de salida sería el siguiente.

# TYPE scheduler_pending_pods gauge scheduler_pending_pods{queue="active"} 0 scheduler_pending_pods{queue="backoff"} 0 scheduler_pending_pods{queue="gated"} 0 scheduler_pending_pods{queue="unschedulable"} 18 # HELP scheduler_pod_scheduling_attempts [STABLE] Number of attempts to successfully schedule a pod. # TYPE scheduler_pod_scheduling_attempts histogram scheduler_pod_scheduling_attempts_bucket{le="1"} 79 scheduler_pod_scheduling_attempts_bucket{le="2"} 79 scheduler_pod_scheduling_attempts_bucket{le="4"} 79 scheduler_pod_scheduling_attempts_bucket{le="8"} 79 scheduler_pod_scheduling_attempts_bucket{le="16"} 79 scheduler_pod_scheduling_attempts_bucket{le="+Inf"} 81 [...]

Cómo obtener métricas de kube-controller-manager

Utilice el siguiente comando para obtener métricas de kube-controller-manager

kubectl get --raw "/apis/metrics.eks.amazonaws.com/v1/kcm/container/metrics"

Un ejemplo de salida sería el siguiente.

[...] workqueue_work_duration_seconds_sum{name="pvprotection"} 0 workqueue_work_duration_seconds_count{name="pvprotection"} 0 workqueue_work_duration_seconds_bucket{name="replicaset",le="1e-08"} 0 workqueue_work_duration_seconds_bucket{name="replicaset",le="1e-07"} 0 workqueue_work_duration_seconds_bucket{name="replicaset",le="1e-06"} 0 workqueue_work_duration_seconds_bucket{name="replicaset",le="9.999999999999999e-06"} 0 workqueue_work_duration_seconds_bucket{name="replicaset",le="9.999999999999999e-05"} 19 workqueue_work_duration_seconds_bucket{name="replicaset",le="0.001"} 109 workqueue_work_duration_seconds_bucket{name="replicaset",le="0.01"} 139 workqueue_work_duration_seconds_bucket{name="replicaset",le="0.1"} 181 workqueue_work_duration_seconds_bucket{name="replicaset",le="1"} 191 workqueue_work_duration_seconds_bucket{name="replicaset",le="10"} 191 workqueue_work_duration_seconds_bucket{name="replicaset",le="+Inf"} 191 workqueue_work_duration_seconds_sum{name="replicaset"} 4.265655885000002 [...]

Comprender las métricas del programador y del administrador de controladores

En la siguiente tabla se describen las métricas del programador y del administrador del controlador que están disponibles para la extracción de estilos de Prometheus. Para obtener más información acerca de estas métricas, consulte Referencia de métricas de Kubernetes en la documentación de Kubernetes.

Métrica Componente del plano de control Descripción

scheduler_pending_pods

programador

La cantidad de pods que están a la espera de ser programados en un nodo para su ejecución.

scheduler_schedule_attempts_total

programador

La cantidad de intentos realizados para programar pods.

scheduler_preemption_attempts_total

programador

La cantidad de intentos realizados por el programador para programar pods de mayor prioridad al expulsar a los de menor prioridad.

scheduler_preemption_victims

programador

La cantidad de pods que han sido seleccionados para ser expulsados con el fin de liberar espacio para pods de mayor prioridad.

scheduler_pod_scheduling_attempts

programador

La cantidad de intentos de programar un pod correctamente.

scheduler_scheduling_attempt_duration_seconds

programador

Indica que tan rápido o lento el programador es capaz de encontrar un espacio adecuado para la ejecución de un pod en función de varios factores, como la disponibilidad de recursos y las reglas de programación.

scheduler_pod_scheduling_sli_duration_seconds

programador

La latencia de extremo a extremo de un pod que está en proceso de ser programado, desde el momento en que el pod entra en la cola de programación. Es posible que esto implique varios intentos de programación.

kube_pod_resource_request

programador

Los recursos solicitados por las cargas de trabajo en el clúster, desglosados por pod. Esto muestra el uso de recursos que el programador y kubelet esperan por pod para los recursos junto con la unidad correspondiente al recurso, si existe.

kube_pod_resource_limit

programador

El límite de recursos para cargas de trabajo en el clúster, desglosado por pod. Esto muestra el uso de recursos que el programador y kubelet esperan por pod para los recursos junto con la unidad correspondiente al recurso, si existe.

cronjob_controller_job_creation_skew_duration_seconds

administrador de controladores

El tiempo transcurrido entre el momento en que se programa la ejecución de un cronjob y el momento en que se crea el trabajo correspondiente.

workqueue_depth

administrador de controladores

La profundidad actual de la cola.

workqueue_adds_total

administrador de controladores

Cantidad total de adiciones administradas por la cola de trabajo.

workqueue_queue_duration_seconds

administrador de controladores

El tiempo en segundos que un elemento permanece en la cola de trabajo antes de ser solicitado.

workqueue_work_duration_seconds

administrador de controladores

El tiempo en segundos que tarda en procesarse un elemento de la cola de trabajo.

Implemente un sistema de extracción de Prometheus para extraer métricas de forma coherente

Para implementar un sistema de extracción de Prometheus que extraiga sistemáticamente las métricas, utilice la siguiente configuración:

--- apiVersion: v1 kind: ConfigMap metadata: name: prometheus-conf data: prometheus.yml: |- global: scrape_interval: 30s scrape_configs: # apiserver metrics - job_name: apiserver-metrics kubernetes_sd_configs: - role: endpoints scheme: https tls_config: ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt insecure_skip_verify: true bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token relabel_configs: - source_labels: [ __meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name, ] action: keep regex: default;kubernetes;https # Scheduler metrics - job_name: 'ksh-metrics' kubernetes_sd_configs: - role: endpoints metrics_path: /apis/metrics.eks.amazonaws.com/v1/ksh/container/metrics scheme: https tls_config: ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt insecure_skip_verify: true bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token relabel_configs: - source_labels: [ __meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name, ] action: keep regex: default;kubernetes;https # Controller Manager metrics - job_name: 'kcm-metrics' kubernetes_sd_configs: - role: endpoints metrics_path: /apis/metrics.eks.amazonaws.com/v1/kcm/container/metrics scheme: https tls_config: ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt insecure_skip_verify: true bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token relabel_configs: - source_labels: [ __meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name, ] action: keep regex: default;kubernetes;https --- apiVersion: v1 kind: Pod metadata: name: prom-pod spec: containers: - name: prom-container image: prom/prometheus ports: - containerPort: 9090 volumeMounts: - name: config-volume mountPath: /etc/prometheus/ volumes: - name: config-volume configMap: name: prometheus-conf

El permiso que sigue es necesario para que el pod acceda al nuevo punto de conexión de métricas.

{ "effect": "allow", "apiGroups": [ "metrics.eks.amazonaws.com" ], "resources": [ "kcm/metrics", "ksh/metrics" ], "verbs": [ "get" ] },

Para aplicar un parche al rol que se utiliza, puede utilizar el siguiente comando.

kubectl patch clusterrole <role-name> --type=json -p='[ { "op": "add", "path": "/rules/-", "value": { "verbs": ["get"], "apiGroups": ["metrics.eks.amazonaws.com"], "resources": ["kcm/metrics", "ksh/metrics"] } } ]'

A continuación, para ver el panel de Prometheus, puede cambiar el puerto del sistema de extracción al puerto local.

kubectl port-forward pods/prom-pod 9090:9090

Para el clúster de Amazon EKS, las métricas del plano de control del núcleo de Kubernetes también se ingieren en las métricas de Amazon CloudWatch bajo el espacio de nombres AWS/EKS. Para verlas, abra la consola de CloudWatch y seleccione Todas las métricas en el panel de navegación izquierdo. En la página de selección de Métricas, elija el espacio de nombres de y una dimensión de métricas para el clúster.