En esta página, se muestra cómo descubrir y resolver problemas con el escalador automático de clústeres que no escala los nodos en tus clústeres de Google Kubernetes Engine (GKE).
Esta página está dirigida a los desarrolladores de aplicaciones que desean resolver una situación inesperada o negativa con su app o servicio, y a los administradores y operadores de la plataforma que desean evitar interrupciones en la entrega de productos y servicios.
Comprende cuándo el escalador automático de clústeres escala verticalmente tus nodos
Antes de continuar con los pasos para solucionar problemas, puede ser útil comprender cuándo el escalador automático de clústeres intentaría aumentar la escala verticalmente de tus nodos. El escalador automático del clúster solo agrega nodos cuando los recursos existentes son insuficientes.
Cada 10 segundos, el escalador automático de clústeres verifica si hay pods que no se pueden programar. Un Pod se vuelve no programable cuando el programador de Kubernetes no puede colocarlo en ningún nodo existente debido a recursos insuficientes, restricciones de nodos o requisitos de Pod no cumplidos.
Cuando el escalador automático de clústeres encuentra Pods no programables, evalúa si agregar un nodo permitiría que se programe el Pod. Si agregar un nodo permitiera que un pod se programe, el escalador automático de clústeres agrega un nodo nuevo al grupo de instancias administrado (MIG). Luego, el programador de Kubernetes puede programar el Pod en el nodo aprovisionado recientemente.
Comprueba si tienes Pods que no se pueden programar
Para determinar si tu clúster necesita escalar verticalmente, busca Pods no programados:
En la consola de Google Cloud , ve a la página Cargas de trabajo.
En el campo Filtrar de
, ingresaunschedulable
y presiona Intro.Si hay pods en la lista, significa que tienes pods no programables. Para solucionar problemas de Pods no programables, consulta Error: Pod no programable. A menudo, resolver la causa subyacente de los Pods no programables puede permitir que el escalador automático de clústeres escale. Para identificar y resolver errores específicos del escalador automático del clúster, explora las siguientes secciones.
Si no hay Pods en la lista, el escalador automático del clúster no necesita escalar verticalmente y funciona como se espera.
Comprueba si antes tenías Pods que no se podían programar
Si estás investigando qué causó que el escalador automático de clústeres fallara en el pasado, revisa si hay pods que no se podían programar:
En la consola de Google Cloud , ve a la página Explorador de registros.
Especifica un período para las entradas de registro que deseas ver.
En el panel de consultas, ingresa la siguiente consulta:
logName="projects/PROJECT_ID/logs/events" jsonPayload.source.component="default-scheduler" jsonPayload.reason="FailedScheduling"
Reemplaza
PROJECT_ID
con el ID del proyecto.Haz clic en Ejecutar consulta.
Si hay algún resultado, significa que tenías Pods no programables en el período que especificaste.
Comprueba si el problema se debe a una limitación
Después de confirmar que tienes pods no programados, asegúrate de que el problema con el escalador automático de clústeres no se deba a una de las limitaciones del escalador automático de clústeres.
Ver errores
A menudo, puedes diagnosticar la causa de los problemas de escalamiento si ves los mensajes de error:
Si ya viste un mensaje de error, consulta la tabla de mensajes de error para obtener sugerencias sobre cómo resolverlo.
Si aún no ves un mensaje, usa una de las siguientes opciones:
- Problemas con menos de 72 horas de antigüedad: Consulta las notificaciones de errores en la consola de Google Cloud .
- Problemas con más de 72 horas de antigüedad: Consulta los errores en los eventos de Cloud Logging.
Cómo ver errores en las notificaciones
Si el problema que observaste ocurrió hace menos de 72 horas, consulta las notificaciones sobre errores en la consola de Google Cloud . Estas notificaciones proporcionan estadísticas valiosas sobre por qué el escalador automático de clústeres no aumentó la escala y ofrecen sugerencias para resolver el error y ver los registros relevantes para una investigación más detallada.
Para ver las notificaciones en la consola de Google Cloud , completa los siguientes pasos:
En la consola de Google Cloud , ve a la página Clústeres de Kubernetes.
Revisa la columna Notificaciones. Las siguientes notificaciones están asociadas con problemas de escalamiento vertical:
Can't scale up
Can't scale up pods
Can't scale up a node pool
Haz clic en la notificación relevante para ver un panel con detalles sobre lo que causó el problema y las acciones recomendadas para resolverlo.
Opcional: Para ver los registros de este evento, haz clic en Registros. Esta acción te dirige al explorador de registros con una consulta prepropagada para ayudarte a investigar más a fondo el evento de escalamiento. Para obtener más información sobre cómo funcionan los eventos de escalamiento vertical, consulta Cómo ver eventos del escalador automático de clústeres.
Si los problemas persisten después de revisar los consejos de la notificación, consulta las tablas de mensajes de error para obtener más ayuda.
Cómo ver errores en los eventos
Si el problema que observaste ocurrió hace más de 72 horas, consulta los eventos en Cloud Logging. Cuando se produce un error, suele registrarse en un evento.
Para ver los registros del escalador automático de clústeres en la consola de Google Cloud , completa los siguientes pasos:
En la consola de Google Cloud , ve a la página Clústeres de Kubernetes.
Selecciona el nombre del clúster que deseas investigar para ver su página Detalles del clúster.
En la página Detalles del clúster, haz clic en la pestaña Registros.
En la pestaña Registros, haz clic en la pestaña Registros del escalador automático para ver los registros.
Si deseas aplicar filtros más avanzados para limitar los resultados, haz clic en el botón de la flecha ubicada en el lado derecho de la página a fin de ver los registros en Explorador de registros (opcional).
Para obtener más información sobre el funcionamiento de los eventos de escalamiento vertical, consulta Cómo ver eventos del escalador automático de clústeres. Para ver un ejemplo de cómo usar Cloud Logging, consulta el siguiente ejemplo de solución de problemas.
Ejemplo: Soluciona un problema que tiene más de 72 horas
En el siguiente ejemplo, se muestra cómo investigar y resolver un problema con un clúster que no se escala.
Situación: Durante la última hora, se marcó un Pod como no programable. El escalador automático de clústeres no aprovisionó ningún nodo nuevo para programar el pod.
Solución:
- Como el problema ocurrió hace más de 72 horas, lo investigas con Cloud Logging en lugar de mirar los mensajes de notificación.
- En Cloud Logging, encontrarás los detalles de registro para los eventos del escalador automático de clústeres, como se describe en Cómo ver errores en los eventos.
Buscas eventos
scaleUp
que contengan el pod que estás investigando en el campotriggeringPods
. Podrías filtrar las entradas de registro, incluido el filtrado por un valor de campo JSON particular. Obtén más información en Consultas avanzadas de registros.No encontrarás ningún evento de escalamiento vertical. Sin embargo, si lo hiciste, puedes intentar encontrar un
EventResult
que contenga el mismoeventId
que el eventoscaleUp
. Luego, puedes mirar el campoerrorMsg
y consultar la lista de mensajes de error de scaleUp posibles.Como no encontraste ningún evento
scaleUp
, continúas buscando eventosnoScaleUp
y revisas los siguientes campos:unhandledPodGroups
: contiene información sobre el pod (o el controlador del pod).reason
: proporciona motivos globales que indican que el escalamiento vertical podría estar bloqueado.skippedMigs
: proporciona los motivos por los que se pueden omitir algunos MIG.
Encontraste un evento
noScaleUp
para tu pod y todos los MIG en el camporejectedMigs
tienen el mismo ID de mensaje de motivo de"no.scale.up.mig.failing.predicate"
con dos parámetros:"NodeAffinity"
y"node(s) did not match node selector"
.
Solución:
Después de consultar la lista de mensajes de error, descubres que el escalador automático de clústeres no puede escalar verticalmente un grupo de nodos debido a un predicado de programación con fallas para los Pods pendientes. Los parámetros son el nombre del predicado con errores y la razón por la que falló.
Para resolver el problema, revisas el manifiesto del pod y descubres que tiene un selector de nodos que no coincide con ningún MIG en el clúster. Borra el selector del manifiesto del pod y vuelve a crearlo. El escalador automático de clústeres agrega un nodo nuevo y se programa el pod.
Cómo resolver errores de escalamiento
Después de identificar el error, usa las siguientes tablas para ayudarte a comprender qué lo causó y cómo resolverlo.
Errores de scaleUp
Puedes encontrar mensajes de error de eventos para los eventos scaleUp
en el evento eventResult
correspondiente, en el campo resultInfo.results[].errorMsg
.
Mensaje | Detalles | Parámetros | Mitigación |
---|---|---|---|
"scale.up.error.out.of.resources" |
Los errores de recursos se producen cuando intentas solicitar recursos nuevos en una zona que no puede admitir tu solicitud debido a la falta de disponibilidad actual de un recurso de Compute Engine, como GPU o CPU. | IDs de MIG con errores. | Sigue los pasos para solucionar problemas de disponibilidad de recursos en la documentación de Compute Engine. |
"scale.up.error.quota.exceeded" |
El evento scaleUp falló porque algunos de los MIG no se pudieron aumentar debido a que se superó la cuota de Compute Engine. | IDs de MIG con errores. | Consulta la pestaña Errores del MIG en la consola de Google Cloud para ver qué cuota se está excediendo. Una vez que sepas qué cuota se está excediendo, sigue las instrucciones para solicitar un aumento de cuota. |
"scale.up.error.waiting.for.instances.timeout" |
No se pudo escalar verticalmente el grupo de instancias administrado debido al tiempo de espera. | IDs de MIG con errores. | Este mensaje debe ser transitorio. Si persiste, comunícate con Atención al cliente de Cloud para realizar una investigación más detallada. |
"scale.up.error.ip.space.exhausted" |
No se puede escalar verticalmente porque las instancias de algunos de los grupos de instancias administrados se quedaron sin IP. Esto significa que el clúster no tiene suficiente espacio de direcciones IP sin asignar para usar en la adición de nodos o Pods nuevos. | IDs de MIG con errores. | Sigue los pasos para solucionar problemas que se indican en No hay suficiente espacio de direcciones IP gratuito para Pods. |
"scale.up.error.service.account.deleted" |
No se puede escalar verticalmente porque se borró la cuenta de servicio. | IDs de MIG con errores. | Intenta recuperar la cuenta de servicio. Si ese procedimiento no funciona, comunícate con Atención al cliente de Cloud para realizar una investigación más detallada. |
Motivos de un evento noScaleUp
Un evento noScaleUp
se emite de forma periódica cuando hay Pods no programables en el clúster y el escalador automático de clústeres no puede escalar el clúster para alojar los Pods. Los eventos noScaleUp
se basan en el mejor esfuerzo y no abarcan todos los casos posibles.
Motivos de nivel superior de NoScaleUp
Los mensajes de motivo de nivel superior para los eventos noScaleUp
aparecen en el campo noDecisionStatus.noScaleUp.reason
. El mensaje contiene un motivo de nivel superior que explica por qué el escalador automático de clústeres no puede escalar verticalmente el clúster.
Mensaje | Detalles | Mitigación |
---|---|---|
"no.scale.up.in.backoff" |
No se escaló verticalmente porque este proceso está en un período de retirada (bloqueado temporalmente). Este mensaje puede ocurrir durante eventos de escalamiento vertical con una gran cantidad de Pods. | Este mensaje debe ser transitorio. Verifica este error después de unos minutos. Si este mensaje persiste, comunícate con Atención al cliente de Cloud para realizar una investigación más detallada. |
Motivos de aprovisionamiento automático de nodos de nivel superior de noScaleUp
Los mensajes de motivo de aprovisionamiento automático de nodos de nivel superior para eventos noScaleUp
aparecen en el campo noDecisionStatus.noScaleUp.napFailureReason
. El mensaje contiene un motivo de nivel superior que explica por qué el escalador automático de clústeres no puede aprovisionar nuevos grupos de nodos.
Mensaje | Detalles | Mitigación |
---|---|---|
"no.scale.up.nap.disabled" |
El aprovisionamiento automático de nodos no pudo escalarse verticalmente porque no está habilitado a nivel del clúster. Si se inhabilita el aprovisionamiento automático de nodos, los nodos nuevos no se aprovisionarán de forma automática si el Pod pendiente tiene requisitos que ningún grupo de nodos existente puede satisfacer. |
Revisa la configuración del clúster y consulta Habilita el aprovisionamiento automático de nodos. |
Motivos de nivel de MIG de noScaleUp
Los mensajes de motivo de nivel MIG para los eventos noScaleUp
aparecen en los campos noDecisionStatus.noScaleUp.skippedMigs[].reason
y noDecisionStatus.noScaleUp.unhandledPodGroups[].rejectedMigs[].reason
.
El mensaje contiene un motivo por el que el escalador automático de clústeres no puede aumentar el tamaño de un MIG en particular.
Mensaje | Detalles | Parámetros | Mitigación |
---|---|---|---|
"no.scale.up.mig.skipped" |
No se puede escalar verticalmente un MIG porque se omitió durante la simulación. | Motivos por los que se omitió el MIG (por ejemplo, falta un requisito de Pod). | Revisa los parámetros incluidos en el mensaje de error y aborda por qué se omitió el MIG. |
"no.scale.up.mig.failing.predicate" |
No se puede escalar verticalmente un grupo de nodos debido a un predicado de programación con fallas para los Pods pendientes. | El nombre del predicado que falló y los motivos por los que falló | Revisa los requisitos del Pod, como las reglas de afinidad, los taints o las tolerancias, y los requisitos de los recursos |
Motivos de aprovisionamiento automático de nodos de nivel de grupo de pods
Los mensajes de motivo de aprovisionamiento automático de nodos de nivel de grupo para los eventos noScaleUp
aparecen en el campo noDecisionStatus.noScaleUp.unhandledPodGroups[].napFailureReasons[]
. El mensaje contiene un motivo por el que el escalador automático de clústeres no puede aprovisionar un grupo de nodos nuevo para alojar un grupo de pods en particular.
Mensaje | Detalles | Parámetros | Mitigación |
---|---|---|---|
"no.scale.up.nap.pod.gpu.no.limit.defined" |
El aprovisionamiento automático de nodos no pudo aprovisionar ningún grupo de nodos porque un Pod pendiente tiene una solicitud de GPU, pero los límites de recursos de GPU no se definen a nivel de clúster. | Tipo de GPU solicitado | Revisa la solicitud de GPU del Pod pendiente y actualiza la configuración para los límites de GPU del aprovisionamiento automático de nodos a nivel de clúster. |
"no.scale.up.nap.pod.gpu.type.not.supported" |
El aprovisionamiento automático de nodos no aprovisionó ningún grupo de nodos para el Pod porque tiene solicitudes de un tipo de GPU desconocido. | Tipo de GPU solicitado | Verifica la configuración del Pod pendiente para el tipo de GPU a fin de asegurarte de que coincida con un tipo de GPU compatible. |
"no.scale.up.nap.pod.zonal.resources.exceeded" |
El aprovisionamiento automático de nodos no aprovisionó ningún grupo de nodos para el Pod en esta zona porque hacerlo infringiría los límites de recursos máximos en todo el clúster, excedería los recursos disponibles en la zona o no existiría ningún tipo de máquina que pueda ajustarse a la solicitud. | Es el nombre de la zona en cuestión. | Revisa y actualiza los límites de recursos máximos en todo el clúster, las solicitudes de recursos de Pods o las zonas disponibles para el aprovisionamiento automático de nodos. |
"no.scale.up.nap.pod.zonal.failing.predicates" |
El aprovisionamiento automático de nodos no aprovisionó ningún grupo de nodos para el pod en esta zona debido a errores en los predicados. | Nombre de la zona en cuestión y motivos por los que fallaron los predicados. | Revisa los requisitos del Pod pendiente, como las reglas de afinidad, los taints, las tolerancias o los requisitos de los recursos. |
Realiza una investigación más detallada
En las siguientes secciones, se proporciona orientación para usar el Explorador de registros y
gcpdiag
para obtener estadísticas adicionales sobre tus errores.
Investiga errores en el Explorador de registros
Si quieres investigar más el mensaje de error, consulta los registros específicos de tu error:
En la consola de Google Cloud , ve a la página Explorador de registros.
En el panel de consultas, ingresa la siguiente consulta:
resource.type="k8s_cluster" log_id("container.googleapis.com/cluster-autoscaler-visibility") jsonPayload.resultInfo.results.errorMsg.messageId="ERROR_MESSAGE"
Reemplaza
ERROR_MESSAGE
por el mensaje que deseas investigar. Por ejemplo,scale.up.error.out.of.resources
Haz clic en Ejecutar consulta.
Cómo depurar algunos errores con gcpdiag
gcpdiag
es una herramienta de código abierto creada con la asistencia de los ingenieros técnicos de Google Cloud. No es un producto de Google Cloud compatible oficialmente.
Si recibiste uno de los siguientes mensajes de error, puedes usar gcpdiag
para solucionar el problema:
scale.up.error.out.of.resources
scale.up.error.quota.exceeded
scale.up.error.waiting.for.instances.timeout
scale.up.error.ip.space.exhausted
scale.up.error.service.account.deleted
Para obtener una lista y una descripción de todas las marcas de la herramienta gcpdiag
, consulta las instrucciones de uso de gcpdiag
.
Cómo resolver errores complejos de escalamiento
En las siguientes secciones, se ofrece orientación para resolver errores en los que las mitigaciones implican varios pasos y errores que no tienen un mensaje de evento del escalador automático de clústeres asociado.
Problema: El pod no se ajusta al nodo
El escalador automático del clúster solo programa un pod en un nodo si hay un nodo con recursos suficientes, como GPUs, memoria y almacenamiento, para satisfacer los requisitos del pod. Para determinar si esta es la razón por la que el escalador automático del clúster no aumentó la escala, compara las solicitudes de recursos con los recursos proporcionados.
En el siguiente ejemplo, se muestra cómo verificar los recursos de la CPU, pero los mismos pasos se aplican a las GPUs, la memoria y los recursos de almacenamiento. Para comparar las solicitudes de CPU con las CPUs aprovisionadas, completa los siguientes pasos:
En la consola de Google Cloud , ve a la página Cargas de trabajo.
Haz clic en el mensaje de error
PodUnschedulable
.En el panel Detalles, haz clic en el nombre del Pod. Si hay varios Pods, comienza con el primero y repite el siguiente proceso para cada uno.
En la página Detalles del pod, ve a la pestaña Eventos.
En la pestaña Eventos, ve a la pestaña YAML.
Anota las solicitudes de recursos de cada contenedor en el Pod para saber cuál es el total de solicitudes de recursos. Por ejemplo, en la siguiente configuración de Pod, el Pod necesita 2 vCPU:
resources: limits: cpu: "3" requests: cpu: "2"
Consulta los detalles del grupo de nodos del clúster con el Pod no programado:
En la consola de Google Cloud , ve a la página Clústeres de Kubernetes.
Haz clic en el nombre del clúster que tiene el mensaje de error
Pods unschedulable
.En la página Detalles del clúster, ve a la pestaña Nodos.
En la sección Grupos de nodos, toma nota del valor en la columna Tipo de máquina. Por ejemplo,
n1-standard-1
.Compara la solicitud de recursos con las CPU virtuales que proporciona el tipo de máquina. Por ejemplo, si un pod solicita 2 CPU virtuales, pero los nodos disponibles tienen el tipo de máquina
n1-standard-1
, los nodos solo tendrían 1 CPU virtual. Con una configuración como esta, el escalador automático de clústeres no activaría el escalamiento vertical porque, incluso si agregara un nodo nuevo, este Pod no cabría en él. Si quieres obtener más información sobre los tipos de máquinas disponibles, consulta la guía de comparación y recursos de familias de máquinas en la documentación de Compute Engine.
Además, ten en cuenta que los recursos asignables de un nodo son menores que los recursos totales, ya que se necesita una parte para ejecutar los componentes del sistema. Para obtener más información sobre cómo se calcula esto, consulta Recursos asignables del nodo.
Para resolver este problema, decide si las solicitudes de recursos definidas para la carga de trabajo son adecuadas para tus necesidades. Si no se debe cambiar el tipo de máquina, crea un grupo de nodos con un tipo de máquina que admita la solicitud que proviene del Pod. Si las solicitudes de recursos del pod no son precisas, actualiza la definición del pod para que los pods se ajusten a los nodos.
Problema: Los clústeres en mal estado impiden el escalamiento
Es posible que el escalador automático del clúster no realice la escalamiento si considera que un clúster no está en buen estado. El estado no saludable del clúster no se basa en el estado del plano de control, sino en la proporción de nodos en buen estado y listos. Si el 45% de los nodos de un clúster no están en buen estado o no están listos, el escalador automático de clústeres detendrá todas las operaciones.
Si este es el motivo por el que el escalador automático de clústeres no aumenta la escala, hay un evento en el ConfigMap del escalador automático de clústeres con el tipo Warning
con ClusterUnhealthy
como motivo.
Para ver el ConfigMap, ejecuta el siguiente comando:
kubectl describe configmap cluster-autoscaler-status -n kube-system
Para resolver este problema, disminuye la cantidad de nodos inestables.
También es posible que algunos de los nodos estén listos, aunque el escalador automático de clústeres no los considere así. Esto sucede cuando hay un taint con el prefijo ignore-taint.cluster-autoscaler.kubernetes.io/
en un nodo. El escalador automático de clústeres considera que un nodo es NotReady
, siempre que esa contaminación esté presente.
Si el comportamiento se debe a la presencia de la contaminación ignore-taint.cluster-autoscaler.kubernetes.io/.*
, quítala.
¿Qué sigue?
- Revisa las Preguntas frecuentes sobre el escalador automático de clústeres de Kubernetes.
- Mira un video de YouTube sobre cómo solucionar problemas de escalamiento.
- Si necesitas asistencia adicional, comunícate con Atención al cliente de Cloud.