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:
En la Google Cloud consola, ve a la página Cargas de trabajo.
Selecciona la carga de trabajo que quieras investigar. En la pestaña Vista general se muestra el estado de la carga de trabajo.
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:
Ve al manual interactivo de pods no programables:
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.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.Para identificar la causa, consulta cada una de las secciones de la guía:
- Investigar la CPU y la memoria
- Investigar el número máximo de pods por nodo
- Investigar el comportamiento de la herramienta de ajuste automático de escala
- Investigar otros modos de fallo
- Correlacionar eventos de cambio
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:
Ve a la página Google Kubernetes Engine en la Google Cloud consola.
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:
En la lista, haz clic en el nodo que quieras investigar.
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:
Consulta la
Maximum pods per node
configuración en la pestaña Nodos de los detalles del clúster de GKE en la Google Cloud consola.Obtener una lista de nodos:
kubectl get nodes
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
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
Si no encuentras una solución a tu problema en la documentación, consulta la sección Obtener asistencia para obtener más ayuda, incluidos consejos sobre los siguientes temas:
- Abrir un caso de asistencia poniéndose en contacto con el equipo de Atención al Cliente de Cloud.
- Obtener asistencia de la comunidad haciendo preguntas en Stack Overflow
y usando la etiqueta
google-kubernetes-engine
para buscar problemas similares. También puedes unirte al#kubernetes-engine
canal de Slack para obtener más ayuda de la comunidad. - Abrir errores o solicitudes de funciones mediante el seguimiento de problemas público.