Solucionar problemas con cargas de trabajo implementadas


En esta página se explica cómo resolver errores en las cargas de trabajo desplegadas en Google Kubernetes Engine (GKE).

Para obtener consejos más generales sobre cómo solucionar problemas de tus aplicaciones, consulta Solución de problemas de aplicaciones en la documentación de Kubernetes.

Todos los errores: comprueba el estado del pod

Si hay problemas con los pods de una carga de trabajo, Kubernetes actualiza el estado del pod con un mensaje de error. Para ver estos errores, comprueba el estado de un pod mediante la consola Google Cloud o la herramienta de línea de comandos kubectl.

Consola

Sigue estos pasos:

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

    Ve a Cargas de trabajo.

  2. Selecciona la carga de trabajo que quieras investigar. En la pestaña Vista general se muestra el estado de la carga de trabajo.

  3. En la sección Pods gestionados, haz clic en cualquier mensaje de estado de error.

kubectl

Para ver todos los pods que se están ejecutando en tu clúster, ejecuta el siguiente comando:

kubectl get pods

El resultado debería ser similar al siguiente:

NAME       READY  STATUS             RESTARTS  AGE
POD_NAME   0/1    CrashLoopBackOff   23        8d

Los posibles errores se indican en la columna Status.

Para obtener más información sobre un pod específico, ejecuta el siguiente comando:

kubectl describe pod POD_NAME

Sustituye POD_NAME por el nombre del pod que quieras investigar.

En el resultado, el campo Events muestra más información sobre los errores.

Si quieres obtener más información, consulta los registros del contenedor:

kubectl logs POD_NAME

Estos registros pueden ayudarte a identificar si un comando o un código del contenedor ha provocado que el pod falle.

Una vez que haya identificado el error, consulte las siguientes secciones para intentar solucionarlo.

Error: CrashLoopBackOff

El estado CrashLoopBackOff no significa que haya un error específico, sino que indica que un contenedor falla repetidamente después de reiniciarse.

Para obtener más información, consulta Solucionar problemas de eventos CrashLoopBackOff.

Errores: ImagePullBackOff y ErrImagePull

El estado ImagePullBackOff o ErrImagePull indica que la imagen usada por un contenedor no se puede cargar desde el registro de imágenes.

Para obtener información sobre cómo solucionar problemas relacionados con estos estados, consulta Solucionar problemas de extracción de imágenes.

Error: Pod unschedulable

El estado PodUnschedulable indica que tu pod no se puede programar debido a que no tiene suficientes recursos o a que hay algún error de configuración.

Si has configurado métricas del plano de control, puedes consultar más información sobre estos errores en las métricas del programador y en las métricas del servidor de la API.

Usar el manual de procedimientos interactivo de pods no programables

Puedes solucionar errores de PodUnschedulable con el manual interactivo de la Google Cloud consola:

  1. Ve al manual interactivo de pods no programables:

    Ir a la guía

  2. En la lista desplegable Clúster, selecciona el clúster en el que quieras solucionar problemas. Si no encuentras tu clúster, introduce su nombre en el campo Filtrar.

  3. En la lista desplegable Espacio de nombres, seleccione el espacio de nombres que quiera solucionar. Si no encuentras tu espacio de nombres, introdúcelo en el campo Filtrar.

  4. Para identificar la causa, consulta cada una de las secciones de la guía:

    1. Investigar la CPU y la memoria
    2. Investigar el número máximo de pods por nodo
    3. Investigar el comportamiento de la herramienta de ajuste automático de escala
    4. Investigar otros modos de fallo
    5. Correlacionar eventos de cambio
  5. Opcional: Para recibir notificaciones sobre futuros PodUnschedulable errores, en la sección Consejos para la mitigación futura, selecciona Crear alerta .

Error: Recursos insuficientes

Es posible que se produzca un error que indique que no hay suficiente CPU, memoria u otro recurso. Por ejemplo, No nodes are available that match all of the predicates: Insufficient cpu (2) indica que, en dos nodos, no hay suficiente CPU disponible para satisfacer las solicitudes de un pod.

Si las solicitudes de recursos de tu Pod superan las de un solo nodo de cualquier grupo de nodos apto, GKE no programa el Pod y tampoco activa el escalado para añadir un nuevo nodo. Para que GKE pueda programar el pod, debes solicitar menos recursos para el pod o crear un nuevo grupo de nodos con recursos suficientes.

También puedes habilitar el aprovisionamiento automático de nodos para que GKE pueda crear automáticamente grupos de nodos con nodos en los que se puedan ejecutar los pods no programados.

La solicitud de CPU predeterminada es de 100 m o el 10% de una CPU (o un núcleo). Si quieres solicitar más o menos recursos, especifica el valor en la especificación del pod, en spec: containers: resources: requests.

Error: MatchNodeSelector

MatchNodeSelector indica que no hay ningún nodo que coincida con el selector de etiquetas del pod.

Para verificarlo, comprueba las etiquetas especificadas en el campo nodeSelector de la especificación del pod, en spec: nodeSelector.

Para ver cómo se etiquetan los nodos de tu clúster, ejecuta el siguiente comando:

kubectl get nodes --show-labels

Para adjuntar una etiqueta a un nodo, ejecuta el siguiente comando:

kubectl label nodes NODE_NAME LABEL_KEY=LABEL_VALUE

Haz los cambios siguientes:

  • NODE_NAME: el nodo al que quieres añadir una etiqueta.
  • LABEL_KEY: la clave de la etiqueta.
  • LABEL_VALUE: el valor de la etiqueta.

Para obtener más información, consulta el artículo Asignar pods a nodos de la documentación de Kubernetes.

Error: PodToleratesNodeTaints

PodToleratesNodeTaints indica que el pod no se puede programar en ningún nodo porque no tiene tolerancias que correspondan a las intolerancias de nodo existentes.

Para comprobar si este es el caso, ejecuta el siguiente comando:

kubectl describe nodes NODE_NAME

En el resultado, comprueba el campo Taints, que muestra los pares clave-valor y los efectos de la programación.

Si el efecto indicado es NoSchedule, no se puede programar ningún pod en ese nodo a menos que tenga una tolerancia coincidente.

Una forma de resolver este problema es eliminar el taint. Por ejemplo, para quitar una marca NoSchedule, ejecuta el siguiente comando:

kubectl taint nodes NODE_NAME key:NoSchedule-

Error: PodFitsHostPorts

El error PodFitsHostPorts significa que un nodo está intentando usar un puerto que ya está ocupado.

Para resolver el problema, sigue las prácticas recomendadas de Kubernetes y usa un NodePort en lugar de un hostPort.

Si tienes que usar un hostPort, consulta los manifiestos de los pods y asegúrate de que todos los pods del mismo nodo tengan valores únicos definidos para hostPort.

Error: Does not have minimum availability

Si un nodo tiene recursos suficientes, pero sigue viendo el mensaje Does not have minimum availability , compruebe el estado del pod. Si el estado es SchedulingDisabled o Cordoned, el nodo no puede programar nuevos pods. Puedes consultar el estado de un nodo mediante la Google Cloud consola o la herramienta de línea de comandos kubectl.

Consola

Sigue estos pasos:

  1. Ve a la página Google Kubernetes Engine en la Google Cloud consola.

    Ir a Google Kubernetes Engine

  2. Selecciona el clúster que quieras investigar. En la pestaña Nodos se muestran los nodos y su estado.

Para habilitar la programación en el nodo, sigue estos pasos:

  1. En la lista, haz clic en el nodo que quieras investigar.

  2. En la sección Node Details (Detalles del nodo), haz clic en Uncordon (Desacordonar).

kubectl

Para obtener el estado de tus nodos, ejecuta el siguiente comando:

kubectl get nodes

Para habilitar la programación en el nodo, ejecuta el siguiente comando:

kubectl uncordon NODE_NAME

Error: Se ha alcanzado el límite máximo de pods por nodo

Si todos los nodos del clúster alcanzan el límite de Número máximo de pods por nodo, los pods se quedarán en el estado Unschedulable. En la pestaña Eventos del pod, verás un mensaje que incluye la frase Too many pods.

Para solucionar este error, siga estos pasos:

  1. Consulta la Maximum pods per nodeconfiguración en la pestaña Nodos de los detalles del clúster de GKE en la Google Cloud consola.

  2. Obtener una lista de nodos:

    kubectl get nodes
    
  3. En cada nodo, comprueba el número de pods que se están ejecutando en él:

    kubectl get pods -o wide | grep NODE_NAME | wc -l
    
  4. Si se alcanza el límite, añade un nuevo grupo de nodos o añade nodos adicionales al grupo de nodos actual.

Problema: se ha alcanzado el tamaño máximo del grupo de nodos con el autoescalador de clúster habilitado

Si el grupo de nodos ha alcanzado su tamaño máximo según la configuración de su escalador automático de clústeres, GKE no activará el escalado vertical del pod que, de lo contrario, se programaría con este grupo de nodos. Si quieres que el pod se programe con este grupo de nodos, cambia la configuración de la herramienta de escalado automático de clústeres.

Problema: Se ha alcanzado el tamaño máximo del grupo de nodos con la herramienta de adaptación dinámica de clústeres inhabilitada

Si el grupo de nodos ha alcanzado el número máximo de nodos y el autoescalador de clúster está inhabilitado, GKE no puede programar el pod con el grupo de nodos. Aumenta el tamaño de tu grupo de nodos o habilita el autoescalador de clústeres para que GKE cambie el tamaño de tu clúster automáticamente.

Error: Unbound PersistentVolumeClaims

Unbound PersistentVolumeClaims indica que el pod hace referencia a una PersistentVolumeClaim que no está vinculada. Este error puede producirse si tu PersistentVolume no se ha aprovisionado. Para comprobar que el aprovisionamiento ha fallado, puedes obtener los eventos de tu PersistentVolumeClaim y buscar errores.

Para obtener eventos, ejecuta el siguiente comando:

kubectl describe pvc STATEFULSET_NAME-PVC_NAME-0

Haz los cambios siguientes:

  • STATEFULSET_NAME: el nombre del objeto StatefulSet.
  • PVC_NAME: el nombre del objeto PersistentVolumeClaim.

Esto también puede ocurrir si se ha producido un error de configuración durante el preaprovisionamiento manual de un PersistentVolume y su vinculación con un PersistentVolumeClaim.

Para resolver este error, vuelve a preaprovisionar el volumen.

Error: cuota insuficiente

Verifica que tu proyecto tenga suficiente cuota de Compute Engine para que GKE pueda aumentar la escala de tu clúster. Si GKE intenta añadir un nodo a tu clúster para programar el pod y el escalado vertical supera la cuota disponible de tu proyecto, recibirás el mensaje de error scale.up.error.quota.exceeded.

Para obtener más información, consulta Errores de ScaleUp.

Problema: APIs obsoletas

Asegúrate de que no estás usando APIs obsoletas que se hayan eliminado con la versión secundaria de tu clúster. Para obtener más información, consulta Desactivaciones de funciones y APIs.

Error: No había puertos libres para los puertos de Pod solicitados

Si ves un error similar al siguiente, es probable que tengas varios pods en el mismo nodo con el mismo valor definido en el campo hostPort:

0/1 nodes are available: 1 node(s) didn't have free ports for the requested pod ports. preemption: 0/1 nodes are available: 1 No preemption victims found for incoming pod.

Al vincular un pod a un hostPort, se limita el lugar donde GKE puede programar el pod, ya que cada combinación de hostIP, hostPort y protocol debe ser única.

Para resolver el problema, sigue las prácticas recomendadas de Kubernetes y usa un NodePort en lugar de un hostPort.

Si tienes que usar un hostPort, consulta los manifiestos de los pods y asegúrate de que todos los pods del mismo nodo tengan valores únicos definidos para hostPort.

Siguientes pasos