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
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 |
---|---|
|
|
|
|
|
|
|
|
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
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