En esta página, se describe cómo configurar un clúster de Google Kubernetes Engine (GKE) para enviar métricas emitidas por el servidor de la API de Kubernetes, y el programador y el administrador del controlador a Cloud Monitoring con Google Cloud Managed Service para Prometheus. En esta página, también se explica cómo se formatean estas métricas cuando se escriben en Monitoring y cómo se consultan.
Antes de empezar
Antes de empezar, asegúrate de haber realizado las siguientes tareas:
- Habilita la API de Google Kubernetes Engine. Habilitar la API de Google Kubernetes Engine
- Si quieres usar Google Cloud CLI para esta tarea,
instala y, luego,
inicializa
gcloud CLI. Si ya instalaste gcloud CLI, ejecuta
gcloud components update
para obtener la versión más reciente.
Requisitos
Para enviar métricas emitidas por los componentes del plano de control de Kubernetes a Cloud Monitoring, se deben cumplir los siguientes requisitos:
- El clúster debe tener habilitadas las métricas del sistema.
Configura la recopilación de métricas del plano de control
Puedes habilitar las métricas del plano de control en un clúster de GKE existente con la consola de Trusted Cloud , gcloud CLI o Terraform.
Consola
Puedes habilitar las métricas del plano de control para un clúster desde la pestaña Observabilidad o desde la pestaña Detalles de este. Cuando usas la pestaña Observabilidad, puedes obtener una vista previa de los gráficos y las métricas disponibles antes de habilitar el paquete de métricas.
Para habilitar las métricas del plano de control desde la pestaña Observabilidad del clúster, haz lo siguiente:
-
En la consola de Trusted Cloud , accede a la página de los clústeres de Kubernetes.
Acceder a los clústeres de Kubernetes
Si usas la barra de búsqueda para encontrar esta página, selecciona el resultado cuyo subtítulo es Kubernetes Engine.
Haz clic en el nombre del clúster y, luego, selecciona la pestaña Observabilidad.
Selecciona Plano de control en la lista de funciones.
Haz clic en Habilitar paquete.
Si las métricas del plano de control ya están habilitadas, verás un conjunto de gráficos para las métricas del plano de control.
Para habilitar las métricas del plano de control desde la pestaña Detalles del clúster, haz lo siguiente:
-
En la consola de Trusted Cloud , accede a la página de los clústeres de Kubernetes.
Acceder a los clústeres de Kubernetes
Si usas la barra de búsqueda para encontrar esta página, selecciona el resultado cuyo subtítulo es Kubernetes Engine.
Haz clic en el nombre del clúster.
En la fila Funciones etiquetada como Cloud Monitoring, haz clic en el ícono Editar.
En el cuadro de diálogo Editar Cloud Monitoring que aparece, confirma que esté seleccionada la opción Habilitar Cloud Monitoring.
En el menú desplegable Componentes, selecciona los componentes del plano de control del que deseas recopilar métricas: Servidor de la API, Programador o Administrador del controlador.
Haz clic en Aceptar.
Haz clic en Guardar cambios.
gcloud
Actualiza el clúster para que recopile las métricas que emiten el servidor de la API de Kubernetes, el programador y el administrador del controlador:
gcloud container clusters update CLUSTER_NAME \
--location=COMPUTE_LOCATION \
--monitoring=SYSTEM,API_SERVER,SCHEDULER,CONTROLLER_MANAGER
Reemplaza lo siguiente:
CLUSTER_NAME
: es el nombre del clúster.COMPUTE_LOCATION
: es la ubicación en Compute Engine del clúster.
Terraform
Para configurar la recopilación de métricas del plano de control de Kubernetes con Terraform,
consulta el bloque monitoring_config
en el registro de Terraform para google_container_cluster
.
Para obtener información general sobre el uso de Trusted Cloud by S3NS con Terraform, consulta Terraform con Trusted Cloud by S3NS.
Cuota
Las métricas del plano de control consumen la cuota de “solicitudes de transferencia de series temporales por minuto” de la API de Cloud Monitoring. Antes de habilitar los paquetes de métricas, verifica tu uso máximo reciente de esa cuota. Si tienes muchos clústeres en el mismo proyecto o ya te acercaste al límite de esa cuota, puedes solicitar un aumento del límite de cuota antes de habilitar cualquiera de los paquetes de observabilidad.
Precios
Las métricas del plano de control de GKE usan Google Cloud Managed Service para Prometheus con el objetivo de cargar métricas en Cloud Monitoring. Cloud Monitoring cobra por la transferencia de estas métricas según la cantidad de muestras transferidas. Sin embargo, estas métricas son sin costo para los clústeres registrados que pertenecen a un proyecto que tiene habilitada la edición de GKE Enterprise.
Para obtener más información, consulta los precios de Cloud Monitoring.
Formato de métricas
Todas las métricas del plano de control de Kubernetes escritas en Cloud Monitoring
usan el tipo de recurso
prometheus_target
.
Cada nombre de métrica tiene el prefijo prometheus.googleapis.com/
y un sufijo que indica el
tipo de métrica de Prometheus, como /gauge
, /histogram
o /counter
. De lo contrario, cada nombre de métrica es
idéntico al nombre de la métrica que expone Kubernetes de código abierto.
Exporta desde Cloud Monitoring
Las métricas del plano de control de Kubernetes se pueden exportar desde Cloud Monitoring con la API de Cloud Monitoring. Debido a que todas las métricas del plano de control de Kubernetes se transfieren con Google Cloud Managed Service para Prometheus, las métricas del plano de control se pueden consultar con el lenguaje de consulta de Prometheus (PromQL). También se pueden consultar con el lenguaje de consulta de Monitoring (MQL).
Consulta métricas
Cuando consultas las métricas del plano de control de Kubernetes, el nombre que usas depende de si usas funciones basadas en PromQL o Cloud Monitoring, como MQL o la interfaz controlada por menú del Explorador de métricas.
En las siguientes tablas de métricas del plano de control de Kubernetes, se muestran dos versiones de cada nombre de métrica:
- Nombre de la métrica de PromQL: Cuando usas PromQL en páginas de Cloud Monitoring de la consola de Trusted Cloud o en campos de PromQL de la API de Cloud Monitoring, usa el nombre de la métrica de PromQL.
- Nombre de la métrica de Cloud Monitoring
Cuando uses otras
funciones de Cloud Monitoring, usa el nombre de la métrica de Cloud Monitoring
en las tablas que aparecen a continuación. Este nombre debe tener el prefijo
prometheus.googleapis.com/
, que se omitió en las entradas de la tabla.
Métricas del servidor de la API
En esta sección, se proporciona una lista de métricas del servidor de la API y, también, información adicional sobre cómo interpretarlas y usarlas.
Lista de métricas del servidor de la API
Cuando las métricas del servidor de la API están habilitadas, todas las métricas que se muestran en la siguiente tabla se exportan a Cloud Monitoring en el mismo proyecto que el clúster de GKE.
Los nombres de las métricas de Cloud Monitoring que figuran en esta tabla deben tener el prefijo
prometheus.googleapis.com/
. Sin embargo, el prefijo se omitió en las
entradas de la tabla.
Nombre de la métrica de PromQL Etapa de lanzamiento Nombre de la métrica de Cloud Monitoring |
|
---|---|
Categoría, tipo, unidad
Recursos supervisados Versión de GKE requerida |
Descripción Etiquetas |
apiserver_current_inflight_requests
DGapiserver_current_inflight_requests/gauge
|
|
Gauge , Double , 1
prometheus_target 1.22.13+ |
Es la cantidad máxima del límite de solicitudes en curso que se usa actualmente en este
apiserver por tipo de solicitud similar en el último segundo.request_kind
|
apiserver_flowcontrol_current_executing_seats
BETAapiserver_flowcontrol_current_executing_seats/gauge
|
|
Gauge , Double , 1
prometheus_target 1.28.3+ |
Simultaneidad (cantidad de licencias) que ocupan las solicitudes
que se ejecutan actualmente (etapa inicial para un WATCH, es decir, cualquier etapa) en el subsistema
de prioridad y equidad de la API.flow_schema
priority_level
|
apiserver_flowcontrol_current_inqueue_requests
BETAapiserver_flowcontrol_current_inqueue_requests/gauge
|
|
Gauge , Double , 1
prometheus_target 1.28.3+ (1.25.16-gke.1360000+, 1.26.11+, 1.27.8+ para versiones secundarias anteriores) |
Es la cantidad de solicitudes pendientes actualmente en las filas del subsistema
de prioridad y equidad de la API.flow_schema
priority_level
|
apiserver_flowcontrol_nominal_limit_seats
BETAapiserver_flowcontrol_nominal_limit_seats/gauge
|
|
Gauge , Double , 1
prometheus_target 1.28.3+ (1.26.11+, 1.27.8+ para versiones secundarias anteriores) |
Es la cantidad nominal de licencias de ejecución configuradas para cada nivel
de prioridad.priority_level
|
apiserver_flowcontrol_rejected_requests_total
BETAapiserver_flowcontrol_rejected_requests_total/counter
|
|
Cumulative , Double , 1
prometheus_target 1.28.3+ (1.25.16-gke.1360000+, 1.26.11+, 1.27.8+ para versiones secundarias anteriores) |
Es la cantidad de solicitudes que rechazó el subsistema de prioridad y equidad
de la API.flow_schema
priority_level
reason
|
apiserver_flowcontrol_request_wait_duration_seconds
BETAapiserver_flowcontrol_request_wait_duration_seconds/histogram
|
|
Cumulative , Distribution , s
prometheus_target 1.28.3+ (1.25.16-gke.1360000+, 1.26.11+, 1.27.8+ para versiones secundarias anteriores) |
Es la cantidad de tiempo que una solicitud estuvo en espera en su fila.execute
flow_schema
priority_level
|
apiserver_request_duration_seconds
DGapiserver_request_duration_seconds/histogram
|
|
Cumulative , Distribution , s
prometheus_target 1.23.6+ |
Es la distribución de latencia de respuesta expresada en segundos para cada acción, valor de prueba de validación,
grupo, versión, recurso, subrecurso, permiso y componente.component
dry_run
group
resource
scope
subresource
verb
version
|
apiserver_request_total
DGapiserver_request_total/counter
|
|
Cumulative , Double , 1
prometheus_target 1.22.13+ |
Es el contador de solicitudes de apiserver desglosadas para cada acción, valor de prueba de validación,
grupo, versión, recurso, permiso, componente y código de respuesta HTTP.code
component
dry_run
group
resource
scope
subresource
verb
version
|
apiserver_response_sizes
DGapiserver_response_sizes/histogram
|
|
Cumulative , Distribution , 1
prometheus_target 1.22.13+ |
Es la distribución del tamaño de las respuestas que se expresa en bytes para cada grupo, versión, acción, recurso,
subrecurso, permiso y componente.component
group
resource
scope
subresource
verb
version
|
apiserver_storage_objects
DGapiserver_storage_objects/gauge
|
|
Gauge , Double , 1
prometheus_target 1.22.13+ |
Es la cantidad de objetos almacenados en el momento de la última verificación dividida
por tipo.resource
|
apiserver_admission_controller_admission_duration_seconds
DGapiserver_admission_controller_admission_duration_seconds/histogram
|
|
Cumulative , Distribution , s
prometheus_target 1.23.6+ |
Es el histograma de latencia del controlador de admisión expresado en segundos, identificado por nombre
y desglosado para cada operación y recurso y tipo de API (validación o
admisión).name
operation
rejected
type
|
apiserver_admission_step_admission_duration_seconds
DGapiserver_admission_step_admission_duration_seconds/histogram
|
|
Cumulative , Distribution , s
prometheus_target 1.22.13+ |
Es el histograma de latencia de paso secundario de admisión que se expresa en segundos, desglosado para cada operación
y recurso de API y tipo de paso (validación o admisión).operation
rejected
type
|
apiserver_admission_webhook_admission_duration_seconds
DGapiserver_admission_webhook_admission_duration_seconds/histogram
|
|
Cumulative , Distribution , s
prometheus_target 1.22.13+ |
Es el histograma de latencia de webhook de admisión expresado en segundos, identificado por nombre y
desglosado para cada operación y recurso y tipo de API (validación o
admisión).name
operation
rejected
type
|
En las siguientes secciones, se proporciona información adicional sobre las métricas del servidor de la API.
apiserver_request_duration_seconds
Usa esta métrica para supervisar la latencia en el servidor de la API. La duración de la solicitud que registra esta métrica incluye todas las fases del procesamiento de solicitudes, desde el momento en que se recibe la solicitud hasta que el servidor completa su respuesta al cliente. Específicamente, incluye el tiempo dedicado a lo siguiente:
- La autenticación y autorización de la solicitud
- La llamada a los webhooks de terceros y del sistema asociados a la solicitud
- La recuperación del objeto solicitado de una caché en memoria (para solicitudes
que especifican un parámetro de URL
resourceVersion
) o de la base de datos de estado del clúster basada en etcd o Spanner llamando a la API deetcd
(para el resto de las solicitudes) - Se pueden usar las etiquetas
group
,version
,resource
ysubresource
para identificar de forma inequívoca una solicitud lenta para una investigación más detallada - La escritura de la respuesta al cliente y la recepción de su respuesta
Para obtener más información sobre el uso de esta métrica, consulta Latencia.
Esta métrica tiene una cardinalidad muy alta. Cuando uses esta métrica, debes usar filtros o grupos para encontrar fuentes de latencia específicas.
apiserver_admission_controller_admission_duration_seconds
Esta métrica mide la latencia en los webhooks de admisión integrados, no
en webhooks de terceros. Para diagnosticar problemas de latencia con webhooks de terceros, usa
la
métrica
apiserver_admission_webhook_admission_duration_seconds
.
apiserver_admission_webhook_admission_duration_seconds
y
apiserver_admission_step_admission_duration_seconds
Estas métricas miden la latencia en webhooks de admisión externos de terceros.
En general, la métrica apiserver_admission_webhook_admission_duration_seconds
es la más útil. Para obtener más información sobre el uso de esta
métrica, consulta Latencia.
apiserver_request_total
Usa esta métrica para supervisar el tráfico de solicitudes en tu servidor de la API. También puedes usarla para determinar las tasas de éxito y de errores de las solicitudes. Para obtener más información sobre el uso de esta métrica, consulta Tráfico y tasa de errores.
Esta métrica tiene una cardinalidad muy alta. Cuando la uses, debes usar filtros o grupos para identificar las fuentes de errores.
apiserver_storage_objects
Usa esta métrica para detectar la saturación del sistema y posibles fugas de recursos. Para obtener más información, consulta Saturación.
apiserver_current_inflight_requests
Esta métrica registra la cantidad máxima de solicitudes que se entregaron activamente en el período del último segundo. Para obtener más información, consulta Saturación.
La métrica no incluye solicitudes de larga duración como “watch”.
Supervisa el servidor de la API
Las métricas del servidor de la API pueden aportar estadísticas sobre los indicadores principales del estado del sistema:
- Latencia: ¿Cuánto tiempo se tarda en entregar una solicitud?
- Tráfico: ¿Cuánta demanda experimenta el sistema?
- Tasa de errores: ¿Con qué frecuencia fallan las solicitudes?
- Saturación: ¿Qué tan completo está el sistema?
En esta sección, se describe cómo usar las métricas del servidor de la API para supervisar el estado de tu servidor de la API.
Latencia
Cuando el servidor de la API se sobrecarga, aumenta la latencia de las solicitudes. Para medir la
latencia de las solicitudes al servidor de la API, usa la
métrica
apiserver_request_duration_seconds
. Para identificar la fuente de la latencia de manera más específica, puedes agrupar
las métricas con la etiqueta verb
o resource
.
El límite superior sugerido para una llamada a un solo recurso, como GET, POST o PATCH, es de un segundo. El límite superior sugerido para las llamadas a LIST con alcance de clúster y espacio de nombres es de 30 segundos. Los SLO definidos por la comunidad de Kubernetes de código abierto establecen las expectativas de límite superior. Para obtener más información, consulta los detalles de SLI/SLO de latencia de las llamadas a la API.
Si el valor de la métrica
apiserver_request_duration_seconds
aumenta más allá de la duración esperada, investiga las siguientes causas
posibles:
- Es posible que el plano de control de Kubernetes esté sobrecargado. Para verificarlo, consulta las
métricas
apiserver_request_total
yapiserver_storage_objects
.- Usa la etiqueta
code
para determinar si las solicitudes se procesan de forma correcta. Para obtener información sobre los valores posibles, consulta Códigos de estado HTTP. - Usa las etiquetas
group
,version
,resource
ysubresource
para identificar de forma inequívoca una solicitud.
- Usa la etiqueta
Un webhook de admisión de terceros es lento o no responde. Si el valor de la métrica
apiserver_admission_webhook_admission_duration_seconds
aumenta, significa que algunos de tus webhooks de admisión de terceros o definidos por el usuario están lentos o no responden. La latencia en el webhook de admisión puede causar demoras en la programación del trabajo.Para consultar el percentil 99 de la latencia de webhook por instancia del plano de control de Kubernetes, usa la siguiente consulta de PromQL:
sum by (instance) (histogram_quantile(0.99, rate(apiserver_admission_webhook_admission_duration_seconds_bucket{cluster="CLUSTER_NAME"}[1m])))
Te recomendamos que observes también los percentiles 50, 90, 95 y 99.9. Esta consulta se puede ajustar modificando el valor
0.99
.Los webhooks externos tienen un límite de tiempo de espera de alrededor de 10 segundos. Puedes establecer políticas de alertas en la métrica
apiserver_admission_webhook_admission_duration_seconds
para recibir alertas cuando te acerques al tiempo de espera del webhook.También puedes agrupar la métrica
apiserver_admission_webhook_admission_duration_seconds
en la etiquetaname
para diagnosticar posibles problemas con webhooks específicos.
Estás enumerando muchos objetos. Se espera que la latencia de las llamadas LIST aumente a medida que aumenta la cantidad de objetos de un tipo determinado (el tamaño de respuesta).
Problemas del cliente:
- Es posible que el cliente no tenga suficientes recursos para recibir respuestas de manera oportuna. Para verificarlo, consulta las métricas de uso de CPU del pod del cliente.
- El cliente tiene una conexión de red lenta. Esto puede suceder cuando el cliente se ejecuta en un dispositivo como un teléfono celular, pero es poco probable que se ejecute en una red de Compute Engine.
- El cliente cerró de forma inesperada, pero la conexión TCP tiene un tiempo de espera establecido en decenas de segundos. Antes de que se agote el tiempo de espera de la conexión, se bloquean los recursos del servidor, lo que puede aumentar la latencia.
Para obtener más información, consulta Prácticas recomendadas para usar la prioridad y equidad de la API en la documentación de Kubernetes.
Tráfico y tasa de error
Para medir el tráfico y la cantidad de solicitudes correctas y fallidas en el servidor
de la API, usa la
métrica apiserver_request_total
. Por
ejemplo, para medir el tráfico del servidor de la API por instancia del plano de control de
Kubernetes, usa la siguiente consulta de PromQL:
sum by (instance) (increase(apiserver_request_total{cluster="CLUSTER_NAME"}[1m]))
Para consultar las solicitudes incorrectas, filtra la etiqueta
code
por los valores 4xx y 5xx con la siguiente consulta de PromQL:sum(rate(apiserver_request_total{code=~"[45].."}[5m]))
Para consultar las solicitudes correctas, filtra la etiqueta
code
por los valores 2xx con la siguiente consulta de PromQL:sum(rate(apiserver_request_total{code=~"2.."}[5m]))
Para consultar las solicitudes que rechaza el servidor de la API por instancia del plano de control de Kubernetes, filtra la etiqueta
code
por el valor 429 (http.StatusTooManyRequests
) con la siguiente consulta de PromQL:sum by (instance) (increase(apiserver_request_total{cluster="CLUSTER_NAME", code="429"}[1m]))
Saturación
Puedes medir la saturación del sistema con las
métricas apiserver_current_inflight_requests
y apiserver_storage_objects
.
Si el valor de la métrica apiserver_storage_objects
aumenta, es posible que tengas un problema con un controlador personalizado
que crea objetos, pero no los borra. Puedes filtrar o agrupar
la métrica en función de la etiqueta resource
para identificar el recurso
que experimenta el aumento.
Evalúa la métrica apiserver_current_inflight_requests
de acuerdo
con la configuración de la prioridad y equidad de la API; esta configuración afecta
la forma en que se priorizan las solicitudes, por lo que no puedes extraer conclusiones solo de los
valores de la métrica. Para obtener más información, consulta Prioridad y equidad de la API.
Métricas del programador
En esta sección, se proporciona una lista de las métricas del programador y, también, información adicional sobre cómo interpretar y usar las métricas.
Lista de métricas del programador
Cuando las métricas del programador están habilitadas, todas las métricas que se muestran en la siguiente tabla se exportan a Cloud Monitoring en el mismo proyecto que el clúster de GKE.
Los nombres de las métricas de Cloud Monitoring que figuran en esta tabla deben tener el prefijo
prometheus.googleapis.com/
. Sin embargo, el prefijo se omitió en las
entradas de la tabla.
Nombre de la métrica de PromQL Etapa de lanzamiento Nombre de la métrica de Cloud Monitoring |
|
---|---|
Categoría, tipo, unidad
Recursos supervisados Versión de GKE requerida |
Descripción Etiquetas |
kube_pod_resource_limit
DGkube_pod_resource_limit/gauge
|
|
Gauge , Double , 1
prometheus_target 1.31.1-gke.1621000+ |
Es el límite de recursos para las cargas de trabajo en el clúster, desglosado por Pod.
Muestra el uso de recursos que el programador y kubelet esperan por Pod para
cada recurso, junto con la unidad del recurso, si corresponde.namespace
node
pod
priority
resource
scheduler
unit
|
kube_pod_resource_request
DGkube_pod_resource_request/gauge
|
|
Gauge , Double , 1
prometheus_target 1.31.1-gke.1621000+ |
Recursos solicitados por las cargas de trabajo en el clúster, desglosados por Pod.
Muestra el uso de recursos que el programador y kubelet esperan por Pod para
cada recurso, junto con la unidad del recurso, si corresponde.namespace
node
pod
priority
resource
scheduler
unit
|
scheduler_pending_pods
DGscheduler_pending_pods/gauge
|
|
Gauge , Double , 1
prometheus_target 1.22.13+ |
Es la cantidad de Pods pendientes, por tipo de fila. La categoría “activos” se refiere a la cantidad de Pods
en activeQ, “retirados” se refiere a la cantidad de Pods en backoffQ y “no programable”
se refiere a la cantidad de Pods en unschedulablePods.queue
|
scheduler_pod_scheduling_duration_seconds
OBSOLETOscheduler_pod_scheduling_duration_seconds/histogram
|
|
Cumulative , Distribution , 1
prometheus_target 1.25.1 a 1.29 (1.22.17-gke.3100+, 1.23.11+ y 1.24.5+ para versiones secundarias anteriores) |
[Quedó obsoleto a partir de la versión 1.29; se quitó en la versión 1.30 y se reemplazó por
scheduler_pod_scheduling_sli_duration_seconds ].
Es la latencia E2e de un Pod que está programado, lo que puede incluir varios intentos de programación.attempts
|
scheduler_pod_scheduling_sli_duration_seconds
BETAscheduler_pod_scheduling_sli_duration_seconds/histogram
|
|
Cumulative , Distribution , 1
prometheus_target 1.30+ |
Es la latencia E2e de un Pod que se programa, desde el momento en que el Pod ingresa a la fila de programación, lo que puede implicar varios intentos de programación.attempts
|
scheduler_preemption_attempts_total
DGscheduler_preemption_attempts_total/counter
|
|
Cumulative , Double , 1
prometheus_target 1.22.13+ |
Es el total de intentos de interrupción en el clúster hasta ahora. |
scheduler_preemption_victims
DGscheduler_preemption_victims/histogram
|
|
Cumulative , Distribution , 1
prometheus_target 1.22.13+ |
Es la cantidad de víctimas de interrupciones seleccionadas. |
scheduler_scheduling_attempt_duration_seconds
DGscheduler_scheduling_attempt_duration_seconds/histogram
|
|
Cumulative , Distribution , 1
prometheus_target 1.23.6+ |
Es la latencia de los intentos de programación que se expresa en segundos (algoritmo de programación +
vinculación).profile
result
|
scheduler_schedule_attempts_total
DGscheduler_schedule_attempts_total/counter
|
|
Cumulative , Double , 1
prometheus_target 1.22.13+ |
Es la cantidad de intentos de programación de Pods, por resultado. La categoría “no programable” se refiere a un Pod
que no se pudo programar, mientras que “error” se refiere a un problema interno
del programador.profile
result
|
En las siguientes secciones, se proporciona información adicional sobre las métricas del servidor de la API.
scheduler_pending_pods
Puedes usar la métrica scheduler_pending_pods
para supervisar la carga
del programador. Aumentar los valores de esta métrica puede indicar problemas
de asignación de recursos. El programador tiene tres filas, y esta métrica informa la cantidad de solicitudes pendientes
por fila. Se admiten las siguientes filas:
- Fila
active
- Es el conjunto de Pods que el programador intenta programar; el Pod con mayor prioridad se encuentra en el principio de la fila.
- Fila
backoff
- Es el conjunto de Pods que no se pudieron programar la última vez que el programador intentó, pero que podrían programarse la próxima vez.
- Los Pods en esta cola deben esperar un período de retirada (un máximo de 10
segundos), después del cual se vuelven a mover a la fila
active
para otro intento de programación. Para obtener más información sobre la administración de la filabackoff
, consulta la solicitud de implementación, problema de Kubernetes 75417.
Conjunto
unschedulable
Es el conjunto de Pods que el programador intentó programar, pero que se determinó que no es programable. La ubicación en esta fila puede indicar problemas de compatibilidad o preparación con tus nodos o la configuración de tus selectores de nodos.
Cuando las restricciones de recursos impiden que se programen Pods, los Pods no están sujetos al control de retirada. En cambio, cuando un clúster está lleno, no se pueden programar Pods nuevos y se colocan en la fila
unscheduled
.La presencia de Pods no programados podría indicar que no tienes recursos suficientes o que tienes un problema de configuración de nodos. Los Pods se mueven a la fila
backoff
oactive
después de los eventos que cambian el estado del clúster. Los Pods en esta fila indican que no cambió nada en el clúster que haría que los Pods se puedan programar.Las afinidades definen reglas sobre cómo se asignan los Pods a los nodos. El uso de reglas de afinidad o antiafinidad puede ser un motivo del aumento de Pods no programados.
Algunos eventos, como PVC/Service ADD/UPDATE, la finalización de un Pod o el registro de nodos nuevos, mueven algunos o todos los Pods no programados a la fila
backoff
oactive
. Para obtener más información, consulta Problema de Kubernetes 81214.
Para obtener más información, consulta Latencia del programador y Problemas de recursos.
scheduler_scheduling_attempt_duration_seconds
Esta métrica mide la duración de un solo intento de programación dentro del programador y se desglosa según el resultado: programado, no programable o con error. La duración abarca desde el momento en que el programador recoge un Pod hasta que localiza un nodo y coloca el Pod en él, determina que el Pod no se puede programar o encuentra un error. La duración de la programación incluye el tiempo del proceso de programación y el tiempo de vinculación. La vinculación es el proceso en el que el programador comunica su asignación de nodos al servidor de la API. Para obtener más información, consulta Latencia del programador.
Esta métrica no captura el tiempo que el Pod pasa en la validación o el control de admisión.
Para obtener más información sobre la programación, consulta Programa un Pod.
scheduler_schedule_attempts_total
Esta métrica mide la cantidad de intentos de programación, y cada intento de programar
un Pod aumenta el valor. Puedes usar esta métrica para determinar si el programador
está disponible: si el valor aumenta, el programador está operativo. Puedes
usar la etiqueta result
para determinar el éxito; los Pods pueden ser scheduled
o unschedulable
.
Esta métrica se correlaciona en gran medida con la métrica scheduler_pending_pods
: cuando hay muchos Pods pendientes, es normal que haya muchos intentos
de programar los Pods. Para obtener más información, consulta Problemas de recursos.
Esta métrica no aumenta si el programador no tiene Pods para programar, lo que puede ocurrir si tienes un programador secundario personalizado.
scheduler_preemption_attempts_total
y scheduler_preemptions_victims
Puedes usar las métricas de interrupción para determinar si necesitas agregar recursos.
Es posible que tengas Pods de mayor prioridad que no se puedan programar porque no hay
espacio para ellos. En este caso, el programador libera recursos interrumpiendo uno
o más Pods que están en ejecución en un nodo. La métrica scheduler_preemption_attempts_total
realiza un seguimiento de la cantidad de veces que el programador intentó interrumpir Pods.
La métrica scheduler_preemptions_victims
registra los Pods seleccionados
para la interrupción.
La cantidad de intentos de interrupción tiene una gran correlación con el valor de la métrica
scheduler_schedule_attempts_total
cuando el valor de la etiqueta result
es
unschedulable
.
Los dos valores no son equivalentes. Por ejemplo, si un clúster tiene 0 nodos, no
hay intentos de interrupción, pero puede haber intentos de programación que fallen.
Para obtener más información, consulta Problemas de recursos.
Supervisa el programador
Las métricas del programador pueden brindarte estadísticas sobre el rendimiento de tu programador:
- Latencia del programador: ¿Se está ejecutando el programador? ¿Cuánto tarda en programar los Pods?
- Problemas de recursos: ¿Los intentos de programar Pods alcanzan las restricciones de recursos?
En esta sección, se describe cómo usar la métrica del programador para supervisar tu programador.
Latencia del programador
La tarea del programador es garantizar que tus Pods se ejecuten, por lo que debes saber cuándo el programador está atascado o ejecutándose lento.
- Para verificar que el programador se esté ejecutando y programando Pods, usa la
métrica
scheduler_schedule_attempts_total
. Cuando el programador se ejecuta lento, investiga las siguientes causas posibles:
La cantidad de Pods pendientes está aumentando. Usa la métrica
scheduler_pending_pods
para supervisar la cantidad de Pods pendientes. La siguiente consulta de PromQL devuelve la cantidad de Pods pendientes por fila en un clúster:sum by (queue) (delta(scheduler_pending_pods{cluster="CLUSTER_NAME"}[2m]))
Los intentos individuales de programar Pods son lentos. Usa la métrica
scheduler_scheduling_attempt_duration_seconds
para supervisar la latencia de los intentos de programación.Te recomendamos que observes esta métrica al menos en los percentiles 50 y 95. La siguiente consulta de PromQL recupera los valores del percentil 95, pero se puede ajustar:
sum by (instance) (histogram_quantile(0.95, rate( scheduler_scheduling_attempt_duration_seconds_bucket{cluster="CLUSTER_NAME"}[5m])))
Problemas de recursos
Las métricas del programador también pueden ayudarte a evaluar si tienes
suficientes recursos. Si el valor de la métrica
scheduler_preemption_attempts_total
aumenta, verifica el valor de scheduler_preemption_victims
con la
siguiente
consulta de PromQL:
scheduler_preemption_victims_sum{cluster="CLUSTER_NAME"}
La cantidad de intentos de interrupción y la cantidad de víctimas de interrupciones
aumentan cuando hay Pods de mayor prioridad para programar. Las métricas de interrupción
no indican si los Pods de prioridad alta que activaron las interrupciones
se programaron. Por lo tanto, cuando veas aumentos en el valor de las métricas de interrupción, también puedes supervisar el valor de la
métrica scheduler_pending_pods
. Si la cantidad de Pods pendientes
también aumenta, es posible que no tengas recursos suficientes para manejar
los Pods de mayor prioridad. Es posible que debas escalar verticalmente los recursos disponibles,
crear Pods nuevos con reclamaciones de recursos reducidos o cambiar el selector de nodos.
Si la cantidad de víctimas de interrupciones no aumenta, significa que no quedan Pods de prioridad baja que se puedan quitar. En este caso, considera agregar más nodos para que se puedan asignar los Pods nuevos.
Si la cantidad de víctimas de interrupción aumenta, significa que hay Pods de mayor prioridad en espera para programarse, por lo que el programador está interrumpiendo algunos de los Pods en ejecución. Las métricas de interrupción no indican si los Pods de mayor prioridad se programaron correctamente.
Para determinar si se están programando los Pods de mayor prioridad, busca valores decrecientes de la métrica
scheduler_pending_pods
. Si el valor de esta métrica aumenta, es posible que debas agregar más nodos.
Es posible que veas aumentos repentinos en los valores de la métrica
scheduler_pending_pods
cuando se vayan a programar
las cargas de trabajo en el clúster, por ejemplo, durante eventos como actualizaciones o escalamientos.
Si tienes suficientes recursos en tu clúster, estos aumentos repentinos son temporales.
Si la cantidad de Pods pendientes no disminuye, haz lo siguiente:
- Verifica que los nodos no estén acordonados, ya que estos no aceptan Pods nuevos.
- Verifica las siguientes directivas de programación, que pueden estar mal configuradas y
hacer que un Pod no sea programable:
- Afinidad y selector de nodos
- Taints y tolerancias
- Restricciones de distribución de topología de Pods
Si los Pods no se pueden programar debido a que los recursos son insuficientes, considera liberar algunos de los nodos existentes o aumentar la cantidad de nodos.
Métricas del administrador de controladores
Cuando las métricas del administrador de controladores están habilitadas, todas las métricas que se muestran en la siguiente tabla se exportan a Cloud Monitoring en el mismo proyecto que el clúster de GKE.
Los nombres de las métricas de Cloud Monitoring que figuran en esta tabla deben tener el prefijo
prometheus.googleapis.com/
. Sin embargo, el prefijo se omitió en las
entradas de la tabla.
Nombre de la métrica de PromQL Etapa de lanzamiento Nombre de la métrica de Cloud Monitoring |
|
---|---|
Categoría, tipo, unidad
Recursos supervisados Versión de GKE requerida |
Descripción Etiquetas |
node_collector_evictions_total
DGnode_collector_evictions_total/counter
|
|
Cumulative , Double , 1
prometheus_target 1.24+ |
Es la cantidad de expulsiones de nodos que ocurrieron desde que se inició
la instancia actual de NodeController.zone
|