Soluciona problemas relacionados con el escalador automático de clústeres que no escala verticalmente


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:

  1. En la consola de Google Cloud , ve a la página Cargas de trabajo.

    Ir a Cargas de trabajo

  2. En el campo Filtrar de , ingresa unschedulable 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:

  1. En la consola de Google Cloud , ve a la página Explorador de registros.

    Ir al Explorador de registros

  2. Especifica un período para las entradas de registro que deseas ver.

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

  4. 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:

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:

  1. En la consola de Google Cloud , ve a la página Clústeres de Kubernetes.

    Ir a clústeres de Kubernetes

  2. 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
  3. 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.

  4. 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:

  1. En la consola de Google Cloud , ve a la página Clústeres de Kubernetes.

    Ir a clústeres de Kubernetes

  2. Selecciona el nombre del clúster que deseas investigar para ver su página Detalles del clúster.

  3. En la página Detalles del clúster, haz clic en la pestaña Registros.

  4. En la pestaña Registros, haz clic en la pestaña Registros del escalador automático para ver los registros.

  5. 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:

  1. Como el problema ocurrió hace más de 72 horas, lo investigas con Cloud Logging en lugar de mirar los mensajes de notificación.
  2. 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.
  3. Buscas eventos scaleUp que contengan el pod que estás investigando en el campo triggeringPods. 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.

  4. No encontrarás ningún evento de escalamiento vertical. Sin embargo, si lo hiciste, puedes intentar encontrar un EventResult que contenga el mismo eventId que el evento scaleUp. Luego, puedes mirar el campo errorMsg y consultar la lista de mensajes de error de scaleUp posibles.

  5. Como no encontraste ningún evento scaleUp, continúas buscando eventos noScaleUp 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.
  6. Encontraste un evento noScaleUp para tu pod y todos los MIG en el campo rejectedMigs 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:

  1. En la consola de Google Cloud , ve a la página Explorador de registros.

    Ir al Explorador de registros

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

  3. 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:

  1. En la consola de Google Cloud , ve a la página Cargas de trabajo.

    Ir a Cargas de trabajo

  2. Haz clic en el mensaje de error PodUnschedulable.

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

  4. En la página Detalles del pod, ve a la pestaña Eventos.

  5. En la pestaña Eventos, ve a la pestaña YAML.

  6. 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"
    
  7. Consulta los detalles del grupo de nodos del clúster con el Pod no programado:

    1. En la consola de Google Cloud , ve a la página Clústeres de Kubernetes.

      Ir a clústeres de Kubernetes

    2. Haz clic en el nombre del clúster que tiene el mensaje de error Pods unschedulable.

    3. En la página Detalles del clúster, ve a la pestaña Nodos.

  8. En la sección Grupos de nodos, toma nota del valor en la columna Tipo de máquina. Por ejemplo, n1-standard-1.

  9. 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?