Cuando tus Pods en Google Kubernetes Engine (GKE) se atascan en un estado Pending y no se agregan nodos nuevos, a menudo indica un problema con la función de aumento de escala del escalador automático del clúster. Este problema puede impedir que tus aplicaciones se escalen para satisfacer la demanda, retrasar las implementaciones y afectar la disponibilidad del servicio.
Usa esta página para diagnosticar y resolver problemas comunes que impiden que el escalador automático del clúster agregue nodos nuevos. Solucionar estos problemas permite que el programador de Kubernetes coloque tus cargas de trabajo de inmediato y ayuda a que tu clúster se adapte a una carga cada vez mayor.
Esta información es importante para los desarrolladores de aplicaciones, que necesitan que sus aplicaciones y servicios se programen y ejecuten de forma confiable, y para los administradores y operadores de la plataforma, que son responsables de garantizar que el clúster pueda aprovisionar recursos de forma dinámica para satisfacer los requisitos de la carga de trabajo y mantener los niveles de servicio. Para obtener más información sobre los roles comunes y las tareas de ejemplo a los que hacemos referencia en el contenido de Google Cloud , consulta Roles y tareas comunes del usuario de GKE.
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 del clúster verifica si hay Pods no programables. Un Pod no se puede programar 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 satisfechos.
Cuando el escalador automático de clústeres encuentra Pods no programables, evalúa si agregar un nodo permitiría programar el Pod. Si agregar un nodo permite que se programe un Pod, el escalador automático del clúster 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 no programables
Para determinar si tu clúster necesita escalar verticalmente, verifica si hay Pods no programados:
En la consola de Google Cloud , ve a la página Cargas de trabajo.
En el campo Filtro, ingresa
unschedulabley presiona Intro.Si se muestran Pods, significa que tienes Pods no programables. Para solucionar problemas relacionados con Pods no programables, consulta Error: Pod no programable. Resolver la causa subyacente de los Pods no programables a menudo puede permitir que el escalador automático del clúster realice un ajuste de escala vertical. Para identificar y resolver errores específicos del escalador automático de clústeres, explora las siguientes secciones.
Si no se muestran Pods, el escalador automático del clúster no necesita aumentar la escala y funciona según lo esperado.
Comprueba si antes tenías Pods no programables
Si estás investigando qué causó la falla del escalador automático de clústeres en el pasado, verifica si hubo Pods no programables anteriormente:
En la consola de Google Cloud , accede 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_IDcon el ID del proyecto.Haz clic en Ejecutar consulta.
Si se muestran resultados, 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 aumento de escala 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 Google Cloud consola.
- 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 verticalmente y ofrecen sugerencias para resolver el error y ver los registros pertinentes 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 , accede a la página Clústeres de Kubernetes.
Revisa la columna Notificaciones. Las siguientes notificaciones están asociadas con problemas de aumento de la escala verticalmente:
Can't scale upCan't scale up podsCan'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 aumento de escala, 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 , accede 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 aumento vertical de la escala, 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 expande.
Situación: Durante la última hora, se marcó un Pod como no programable. El escalador automático de clústeres no aprovisionó nodos nuevos 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
scaleUpque 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
EventResultque contenga el mismoeventIdque el eventoscaleUp. Luego, puedes consultar el campoerrorMsgy la lista de posibles mensajes de error de scaleUp.Como no encontraste ningún evento
scaleUp, sigues buscando eventosnoScaleUpy 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
noScaleUppara tu Pod y todos los MIG en el camporejectedMigstienen 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 errores para los Pods pendientes. Los parámetros son el nombre del predicado que falló y el motivo por el 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 del clúster. Borra el selector del manifiesto del Pod y vuelve a crear el Pod. El escalador automático de clústeres agrega un nodo nuevo y se programa el Pod.
Cómo resolver errores de aumento de escala
Si usas ComputeClasses personalizadas y los problemas de aumento de escala están relacionados con las configuraciones de nodos específicos definidas en tu ComputeClass, consulta Soluciona problemas de ComputeClass personalizadas.
Después de identificar el error, usa las siguientes tablas para ayudarte a comprender qué lo causó y cómo resolverlo.
Errores scaleUp
Puedes encontrar mensajes de error para los eventos scaleUp en el evento eventResult correspondiente, dentro del campo resultInfo.results[].errorMsg.
Cuando una operación de escalamiento vertical falla porque supera una cuota, se produce un error de creación de nodos que activa un período de retirada del sistema, el cual puede durar hasta 30 minutos. Para obtener más información, consulta Períodos de retirada.
| 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 alojar la solicitud debido a la falta de disponibilidad actual de un recurso de Compute Engine, como las GPU o CPU. | Son los IDs de MIG con errores. | Sigue los pasos para solucionar problemas relacionados con la 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. | Son los 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 a que se agotó el tiempo de espera. | Son los IDs de MIG con errores. | Si las instancias se inician, pero no se registran en el plano de control, sigue los pasos para solucionar problemas de registro de instancias. Este mensaje debe ser momentáneo. Si persiste, comunícate con Atención al cliente de Cloud para investigar en más detalle. |
"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 agregar nodos o Pods nuevos. | Son los IDs de MIG con errores. | Sigue los pasos para solucionar problemas incluidos en No hay suficiente espacio de direcciones IP libre para los Pods. |
"scale.up.error.service.account.deleted" |
No se puede escalar verticalmente porque se borró la cuenta de servicio. | Son los 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 investigar en más detalle. |
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 verticalmente 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 (se bloqueó de manera temporal). Este mensaje puede aparecer durante eventos de escalamiento vertical con una gran cantidad de Pods. | Este mensaje debe ser momentáneo. Verifica este error después de unos minutos. Si este mensaje persiste, comunícate con Atención al cliente de Cloud para investigar en más detalle. |
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 este proceso no está habilitado a nivel del clúster. Si el aprovisionamiento automático de nodos está inhabilitado, 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 a nivel de MIG de noScaleUp
Los mensajes de motivos a nivel de 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. | Son los 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 el motivo por el que 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 errores para los Pods pendientes. | Es el nombre del predicado con errores 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 a nivel de grupo de Pods de noScaleUp
Los mensajes de motivos de aprovisionamiento automático de nodos a nivel de grupo de Pods 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 programar 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 del clúster. | Es el 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 del 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. | Es el tipo de GPU solicitado. | Verifica la configuración del Pod pendiente para el tipo de GPU y 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. | Es el nombre de la zona en cuestión y los 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 , accede 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_MESSAGEpor el mensaje que deseas investigar. Por ejemplo,scale.up.error.out.of.resourcesHaz 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 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.resourcesscale.up.error.quota.exceededscale.up.error.waiting.for.instances.timeoutscale.up.error.ip.space.exhaustedscale.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 aumento de escala
En las siguientes secciones, se te ayudará a resolver errores que requieren varios pasos o que no tienen un mensaje de evento asociado del escalador automático de clústeres.
El Pod no cabe en el nodo
Síntomas:
Tus Pods permanecen en estado Pending con el mensaje de error PodUnschedulable, o bien tu clúster muestra el mensaje de error Pods unschedulable, y el escalador automático del clúster no se ajusta para agregar nodos.
Causa:
El escalador automático del clúster solo agrega nodos a un grupo de nodos si el tipo de máquina proporciona suficientes recursos, como CPU, GPU, memoria y almacenamiento, para un Pod pendiente. Si las solicitudes de recursos de un Pod superan los recursos de un solo nodo, el escalador automático del clúster no realiza el escalamiento vertical porque el Pod aún no puede ajustarse a un nodo nuevo.
Además, los recursos asignables de un nodo son menores que sus recursos totales porque los componentes del sistema reservan una parte de esos recursos. Para obtener más información sobre cómo GKE calcula los recursos asignables, consulta Recursos asignables de nodos.
Solución:
Para verificar si las solicitudes de recursos de un Pod superan los recursos que proporcionan tus nodos y resolver el problema, completa los siguientes pasos. En este ejemplo, se verifican los recursos de CPU, pero los mismos pasos se aplican a los recursos de GPU, memoria y almacenamiento:
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, haz clic en la pestaña YAML.
Anota las solicitudes de recursos de cada contenedor en el Pod para encontrar las solicitudes de recursos totales. Por ejemplo, en la siguiente configuración del Pod, este necesita 2 CPU virtuales:
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 , accede a la página Clústeres de Kubernetes.
Haz clic en el nombre del clúster que muestra el mensaje de error
Pods unschedulable.En la página Detalles del clúster, haz clic en la pestaña Nodos.
En la sección Grupos de nodos, observa el 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 usan el tipo de máquina
n1-standard-1, los nodos solo tienen 1 CPU virtual. Con una configuración como esta, el escalador automático de clústeres no activa un ajuste de escala vertical porque el Pod aún no cabe en un nodo nuevo. Para 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.Resuelve la discrepancia según las necesidades de tu carga de trabajo:
- Si el Pod requiere los recursos solicitados: Crea un grupo de nodos con un tipo de máquina que pueda admitir las solicitudes de recursos del Pod.
- Si las solicitudes de recursos del Pod no son precisas: Actualiza la definición del Pod para que pueda caber en los nodos existentes.
Los clústeres en mal estado impiden la expansión
Síntomas:
El escalador automático de clústeres detiene todas las operaciones de ajuste de escala, y el ConfigMap cluster-autoscaler-status contiene un evento con el tipo Warning y ClusterUnhealthy que se indica como el motivo.
Para ver el ConfigMap de cluster-autoscaler-status, ejecuta el siguiente comando:
kubectl describe configmap cluster-autoscaler-status -n kube-system
Causa:
El escalador automático de clústeres no escala verticalmente si considera que un clúster no está en buen estado. El escalador automático del clúster determina el estado del clúster en función de la proporción de nodos en buen estado y listos, no en función del estado del plano de control. 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 detiene todas las operaciones.
El escalador automático de clústeres también considera que un nodo listo es NotReady cuando tiene un taint con el prefijo ignore-taint.cluster-autoscaler.kubernetes.io/.
El escalador automático de clústeres trata el nodo como NotReady mientras ese taint esté presente.
Solución:
Para resolver este problema, disminuye la cantidad de nodos en mal estado. Para ello, realiza una o ambas de las siguientes acciones:
- Investiga y repara los nodos en mal estado o
NotReadypara que menos del 45% de los nodos del clúster estén en mal estado. - Si los nodos listos tienen un efecto secundario con el prefijo
ignore-taint.cluster-autoscaler.kubernetes.io/, quita el efecto secundario.
¿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 no encuentras una solución a tu problema en la documentación, consulta Obtener asistencia para obtener más ayuda, como asesoramiento en los siguientes temas:
- Comunicarse con Atención al cliente de Cloud para abrir un caso de asistencia.
- Hacer preguntas en StackOverflow para obtener asistencia de
la comunidad y usar la etiqueta
google-kubernetes-enginepara buscar problemas similares. También puedes unirte al canal de Slack#kubernetes-enginepara obtener más Asistencia de la comunidad. - Abrir problemas o solicitudes de funciones con la herramienta de seguimiento de errores pública.