Resuelva errores de programación de pods, fallos al extraer imágenes, cierres inesperados durante el inicio, terminaciones por OOM y problemas en tiempo de ejecución.
Para solucionar problemas desde la consola (consultar el estado del pod, los eventos y los registros, acceder a las terminales y ejecutar diagnósticos), consulte Common Troubleshooting Procedures.
Procedimiento de diagnóstico rápido
Para diagnosticar un pod con comportamiento anómalo, vaya a la página de detalles del elemento Pods correspondiente. Haga clic en la pestaña Events para revisar las descripciones de los eventos anómalos. Después, haga clic en la pestaña Logs para comprobar si hay registros anómalos recientes.
Pod en estado Pending
Si un pod muestra el estado Unschedulable en Status Details, o aparece un evento FailedScheduling en Events, vaya a para comprobar el estado de salud y los niveles de recursos (CPU y memoria) de los nodos. Compruebe también si las reglas de afinidad del pod (nodeSelector y nodeAffinity) y sus tolerancias son demasiado restrictivas. Consulte Scheduling issues.
Fallo al extraer la imagen (ImagePullBackOff/ErrImagePull)
En la página de detalles de Pods, vaya a la pestaña Container y compruebe la dirección de Image. Inicie sesión en el nodo del pod y ejecute crictl pull <image-address> o curl -v https://<image-address> para comprobar la conectividad de red con el repositorio de imágenes. En la esquina superior derecha, haga clic en Edit YAML y compruebe que el Secret especificado en el campo spec.imagePullSecrets de la carga de trabajo existe y es válido. Para continuar con la solución de problemas, consulte image pulling issues.
El pod no inicia (CrashLoopBackOff)
La aplicación se cierra de forma inesperada y se reinicia de manera repetida. En la página de detalles de Pods, haga clic en la pestaña Logs y seleccione Show the log of the last container exit para ver la causa del error. Para continuar con la solución de problemas, consulte Troubleshoot pod startup failures.
El pod está en ejecución pero no listo
La prueba de disponibilidad del pod falló. En la página Edit de la carga de trabajo Workloads correspondiente, compruebe que la ruta de la solicitud de comprobación de estado (por ejemplo, /healthz) y el puerto coinciden con los que proporciona la aplicación. Para continuar con la solución de problemas, consulte The pod is Running but not ready (Ready: False).
Deshabilite temporalmente la comprobación de estado. Luego, use curl desde la terminal del pod o desde el nodo host para comprobar que el endpoint responde correctamente.
El pod presenta OOMKilled
En la página de detalles de Pods, haga clic en la pestaña Logs y seleccione Show the log of the last container exit para ver los registros de OOM. Compruebe si la aplicación tiene una fuga de memoria o un error de falta de memoria (OOM). En aplicaciones Java, optimice el parámetro -Xmx. Ajuste el límite de recursos de memoria de la aplicación (resources.limits.memory) según sea necesario. Para continuar con la solución de problemas, consulte OOMKilled.
Si se configuró una prueba de actividad, el pod permanece en el estado OOMKilled solo por un breve periodo antes de reiniciarse automáticamente.
Flujo de trabajo de diagnóstico
Para diagnosticar un pod con comportamiento anómalo, inspeccione sus eventos, registros y configuración.
Fase 1: Problemas de programación
Pod no programado en un nodo
Si un pod permanece en el estado Pending durante un periodo prolongado, significa que no se programó en ningún nodo.
Mensaje de error | Descripción | Solución |
| El clúster no tiene nodos disponibles para programar el pod. |
|
| Ningún nodo disponible en el clúster satisface las solicitudes de CPU o memoria del pod. Un nodo no permite programación cuando el total de | En la página de detalles del clúster correspondiente, vaya a y compruebe la tasa de asignación de requests de CPU o memoria del nodo correspondiente. Pase el cursor sobre la tasa de asignación para ver los valores específicos de asignación de recursos.
Para ver el uso detallado de recursos del nodo, consulte Use kubectl to view node resource usage.
|
| Los nodos existentes no coinciden con la política de afinidad de nodo del pod ( |
|
|
|
|
| La programación falla debido a un conflicto de afinidad de nodo del volumen. Esto suele ocurrir porque un disco en la nube no se puede montar en zonas distintas. |
|
| La instancia ECS no es compatible con el tipo de disco en la nube especificado. | Consulte Instance families para confirmar los tipos de disco en la nube compatibles con su instancia ECS. Al montar, actualice el tipo de disco en la nube a uno que admita la instancia ECS. |
| El pod no se puede programar en un nodo porque le falta una tolerancia para uno de los taints del nodo. |
|
| El nodo no tiene suficiente almacenamiento efímero. |
|
| El pod no logró vincularse a una persistent volume claim (PVC). | Compruebe si se creó la PVC o el PV que especifica el pod. Ejecute |
El pod se programó pero permanece en Pending
Si un pod ya se programó pero sigue en Pending, siga estos pasos.
-
Si un pod usa
hostPort, solo se puede ejecutar un pod con esehostPortpor nodo. Por lo tanto,hostPortlimita el recuento deReplicasa la cantidad de nodos. Si el puerto ya está en uso, la programación falla.El uso de
hostPortaumenta la complejidad de la programación. Use un Service para exponer los pods. -
Si el pod no se configuró con
hostPort, siga los pasos a continuación para solucionar el problema.Consulte los eventos del pod con
kubectl describe pod <pod-name>. Entre las causas comunes se encuentran los fallos al extraer imágenes, la falta de recursos, las restricciones de políticas de seguridad y los errores de configuración.Si no encuentra eventos útiles, compruebe los registros de kubelet en el nodo con
grep -i <pod name> /var/log/messages* | less.
Fase 2: Problemas al descargar imágenes
ImagePullBackOff o ErrImagePull
Si el estado de un pod es ImagePullBackOff o ErrImagePull, significa que la descarga de la imagen falló. Revise los eventos del pod para identificar la causa.
Mensaje de error | Descripción | Solución sugerida |
| Se denegó el acceso al repositorio de imágenes porque no se especificó un elemento | Compruebe que exista el Secret indicado en el campo Si utiliza ACR, emplee un asistente de credenciales para descargar imágenes sin contraseña. Consulte Pull images from the same account. |
| No se pudo resolver la dirección del repositorio de imágenes durante una descarga por HTTPS. |
|
| El nodo no tiene suficiente espacio en disco. | Inicie sesión en el nodo (consulte Choose an ECS remote connection method) y ejecute |
| El repositorio de imágenes de terceros usa un certificado firmado por una autoridad certificadora (CA) desconocida o insegura. |
|
| La operación se canceló, posiblemente porque el archivo de imagen es demasiado grande. Kubernetes tiene un tiempo de espera predeterminado para descargar imágenes. Si la descarga no avanza durante un periodo determinado, Kubernetes asume que la operación falló o no responde, y cancela la tarea. |
|
| No se puede conectar al repositorio de imágenes debido a problemas de red. |
|
| La conexión agotó el tiempo de espera por problemas de red al descargar una imagen desde un repositorio en el extranjero. | Las descargas de imágenes desde repositorios en el extranjero, como Docker Hub, pueden fallar en los clústeres ACK debido a la inestabilidad de las redes de los proveedores. Para solucionarlo, considere las siguientes opciones:
|
| Docker Hub impone límites de velocidad a las solicitudes de descarga de imágenes. | Cargue la imagen en Container Registry (ACR) y descárguela desde un repositorio de imágenes de ACR. |
El estado | Es posible que se haya activado el mecanismo de limitación de velocidad de descarga de imágenes del kubelet. | Ajuste |
Fase 3: Problemas de inicio
El pod está en estado Init
Mensaje de error | Descripción | Solución |
Atascado en el estado | El pod tiene M contenedores init; N finalizaron, pero los M-N restantes no pudieron iniciarse. |
Consulte Depurar contenedores init. |
Atascado en el estado | Un contenedor init del pod no pudo iniciarse. | |
Atascado en el estado | Un contenedor init del pod no pudo iniciarse y se encuentra en un bucle de reinicio. |
El pod está en estado Creating
Mensaje de error | Descripción | Solución |
| Este comportamiento es esperado debido al diseño del plugin de red Flannel. | Actualice el componente Flannel a la versión v0.15.1.11-7e95fe23-aliyun o posterior. Consulte Flannel. |
En clústeres con una versión de Kubernetes anterior a la 1.20, puede producirse una fuga de direcciones IP si un pod se reinicia repetidamente o si los pods de un CronJob terminan sus tareas y salen rápidamente. | Actualice el clúster a Kubernetes 1.20 o posterior (se recomienda la más reciente). Consulte Manually upgrade a cluster. | |
Defectos en containerd y runC provocan este problema. | Para aplicar una corrección de emergencia, consulte Why does my pod fail to start with the error "no IP addresses available in range"? | |
| El plugin de red Terway mantiene una base de datos interna en el nodo para rastrear y gestionar las interfaces de red elásticas (ENI). Este error ocurre cuando el estado de la base de datos no coincide con la configuración real del dispositivo de red, lo que provoca que falle la asignación de ENI. |
|
| Es posible que el plugin de red Terway no haya podido solicitar una dirección IP al vSwitch. |
|
El pod no se inicia (CrashLoopBackOff)
Mensaje de error | Descripción | Solución |
El registro contiene |
| |
Los eventos del pod muestran | La comprobación de actividad falló, lo que provocó el reinicio de la aplicación. |
|
Los eventos del pod muestran | La comprobación de inicio falló, lo que provocó el reinicio de la aplicación. |
|
El registro del pod contiene | Espacio insuficiente en el disco en la nube. |
|
El inicio falla sin información de eventos. | Este problema ocurre cuando un contenedor requiere más recursos que los límites declarados, lo que provoca su fallo. | Compruebe si la configuración de recursos del pod es correcta. Puede habilitar resource profiling para obtener las configuraciones recomendadas de Request y Limit del contenedor. |
El registro del pod muestra | Existe un conflicto de puertos entre los contenedores del mismo pod. |
|
El registro del pod muestra | La carga de trabajo monta un Secret, pero el valor del Secret no está codificado en Base64. |
|
Problema específico de la aplicación. | Revise los registros del pod para solucionar el problema. | |
El pod está Running pero no listo (Ready: False)
Mensaje de error | Descripción | Solución |
| La comprobación de disponibilidad falló, lo que impide que el pod de destino reciba tráfico. |
|
El estado del pod es el mismo que el anterior. Los eventos del pod muestran | Una comprobación de inicio fallida provoca el reinicio del contenedor. Este error no debería generar un estado persistente de Running/NotReady, sino un estado CrashLoopBackOff. | Solucione este problema tal como se describe en la sección "El pod no se inicia (CrashLoopBackOff)" para las comprobaciones de tipo Startup. |
Fase 4: Problemas de ejecución de pods
OOMKilled
Cuando un contenedor supera su límite de memoria, se finaliza mediante un OOM kill. Consulte Asignar recursos de memoria a contenedores y pods.
Si el proceso finalizado es el proceso principal del contenedor, este podría reiniciarse de forma inesperada.
Cuando ocurre un evento OOM, aparece en la pestaña Events de la página de detalles del pod en la consola. Por ejemplo:
pod was OOM killed. node:XXX pod:XXX namespace:XXX.Configure un container replica exception alert para recibir notificaciones de OOM.
Nivel de OOM | Descripción | Solución recomendada |
Nivel del sistema operativo | Revise el registro del kernel en |
|
Nivel de cgroup | Revise el registro del kernel en |
|
Consulte Causes and solutions for OOM Killer.
Terminating
Causa posible | Descripción | Solución recomendada |
El nodo se encuentra en estado NotReady. | El pod se elimina automáticamente después de que el nodo se recupera del estado NotReady. | |
El pod tiene finalizers configurados. | Si un pod tiene finalizers configurados, Kubernetes ejecuta las operaciones de limpieza especificadas por estos antes de eliminarlo. Si una operación de limpieza no responde, el pod permanece en estado Terminating. | Compruebe la configuración de finalizers del pod con |
El hook preStop del pod no es válido o está bloqueado. | Si el pod tiene configurado un hook preStop, Kubernetes lo ejecuta antes de finalizar el contenedor. El pod permanece en estado Terminating mientras el hook se ejecuta. | Compruebe la configuración del hook preStop del pod con |
El pod tiene configurado un periodo de apagado controlado. | Si un pod tiene configurado un periodo de apagado controlado ( | Kubernetes elimina automáticamente el pod después de que el contenedor completa el apagado controlado. |
El contenedor no responde. | Cuando usted solicita detener o eliminar un pod, Kubernetes envía una señal |
|
Evicted
Causa posible | Descripción | Solución recomendada |
El nodo presenta presión de recursos debido a factores como el uso de memoria o de disco. | Es posible que el nodo experimente presión de memoria, de disco o de PID.
|
|
Ocurre una expulsión inesperada. | Un taint NoExecute agregado manualmente en el nodo del pod provocó una expulsión inesperada. | Compruebe si existe un taint NoExecute con |
La expulsión no avanza como se esperaba. |
| En un clúster pequeño (50 nodos o menos), si más del 55 % de los nodos presentan errores, la expulsión de pods se detiene. Consulte Límites de velocidad en la expulsión. |
En un clúster grande (más de 50 nodos), si la fracción de nodos con estado incorrecto supera el valor de | ||
Un pod se reprograma frecuentemente en su nodo original después de ser expulsado. | El kubelet expulsa pods según el uso real de recursos, mientras que el programador los ubica según las solicitudes de recursos. Como una expulsión libera recursos, el programador podría reprogramar un pod en el mismo nodo si sus solicitudes aún caben. | Ajuste las solicitudes de recursos del pod para que coincidan con los recursos asignables del nodo. Consulte Set CPU and memory resources for a container. Habilite resource profiling para obtener valores recomendados de solicitudes y límites. |
Completed
Todos los contenedores terminaron correctamente. Este comportamiento es común en trabajos y contenedores init.
Preguntas frecuentes
El pod se está ejecutando pero no funciona
Los errores en YAML pueden provocar que un pod entre en estado Running pero no funcione.
Compruebe la configuración del contenedor en los ajustes del pod.
-
Utilice los métodos a continuación para buscar errores ortográficos en su configuración YAML.
Si una clave YAML está mal escrita (por ejemplo,
commandcomocommnd), el clúster crea el recurso sin errores, pero no puede ejecutar la clave mal escrita durante la ejecución.El siguiente ejemplo, en el que
commandestá mal escrito comocommnd, describe cómo solucionar problemas de escritura.-
Agregue
--validateakubectl apply -fy ejecutekubectl apply --validate -f XXX.yaml.Si escribe mal una palabra, se reporta un error:
XXX] unknown field: commnd XXX] this may be a false alarm, see https://gXXXb.XXX/6842pods/test. -
Compare la salida
pod.yamlcon el archivo YAML original que usó para crear el pod.Nota[$Pod]es el nombre del pod con estado anómalo. Puede obtenerlo al ejecutar el comandokubectl get pods.kubectl get pods [$Pod] -o yaml > pod.yamlSi el archivo
pod.yamltiene más líneas que el archivo original, significa que el pod se creó como se esperaba y el clúster agregó valores predeterminados.Si faltan líneas de su archivo YAML original en
pod.yaml, esto indica un error ortográfico en el archivo original.
-
Revise los registros del pod para solucionar el problema.
Acceda al contenedor mediante una terminal y compruebe que los archivos locales dentro del contenedor sean los esperados.
Comprobar el uso de recursos del nodo con kubectl
-
Compruebe el uso de CPU y memoria de todos los nodos del clúster.
kubectl describe nodes | awk '/^Name:/{print "\n"$2} /Resource +Requests +Limits/{print $0} /^[ \t]+cpu.*%/{print $0} /^[ \t]+memory.*%/{print $0}'Salida esperada:
cn-hangzhou.192.168.0.xxx Resource Requests Limits cpu 1725m (44%) 10320m (263%) memory 1750Mi (11%) 16044Mi (109%) cn-hangzhou.192.168.16.xxx Resource Requests Limits cpu 1885m (48%) 16820m (429%) memory 2536Mi (17%) 25760Mi (179%)Un nodo con un uso alto de solicitudes podría no satisfacer los
requestsde un nuevo pod, lo que impide que se programe. -
Reemplace
YOUR_NODE_NAMEpor el nombre real del nodo para ver el uso de recursos de todos los pods en ese nodo.kubectl describe node YOUR_NODE_NAME | awk '/Non-terminated Pods/,/Allocated resources/{ if ($0 !~ /Allocated resources/) print }'Salida esperada:
Non-terminated Pods: (11 in total) Namespace Name CPU Requests CPU Limits Memory Requests Memory Limits Age --------- ---- ------------ ---------- --------------- ------------- --- arms-prom node-exporter-gp95p 20m (0%) 1020m (26%) 160Mi (1%) 1152Mi (7%) 6d21h csdr csdr-velero-77c8bbc9c7-w46lq 500m (12%) 1 (25%) 128Mi (0%) 2Gi (13%) 6d19h kube-system ack-cost-exporter-5b647ffc65-zdrsl 100m (2%) 1 (25%) 200Mi (1%) 1Gi (6%) 6d21h kube-system ack-node-local-dns-admission-controller-5dfd74f5f4-9rl6n 100m (2%) 1 (25%) 100Mi (0%) 1Gi (6%) 6d21h kube-system ack-node-problem-detector-daemonset-6wql2 200m (5%) 1200m (30%) 300Mi (2%) 1324Mi (9%) 6d21h kube-system coredns-7784559f6-dr9sn 100m (2%) 0 (0%) 100Mi (0%) 2Gi (13%) 6d21h kube-system csi-plugin-knz7j 130m (3%) 2 (51%) 176Mi (1%) 4Gi (27%) 6d21h kube-system kube-proxy-worker-rkbzv 100m (2%) 0 (0%) 100Mi (0%) 0 (0%) 6d21h kube-system loongcollector-ds-kw7cj 100m (2%) 2 (51%) 256Mi (1%) 2Gi (13%) 6d21h kube-system node-local-dns-pgzcn 25m (0%) 0 (0%) 30Mi (0%) 1Gi (6%) 6d21h kube-system terway-eniip-lnn8n 350m (8%) 1100m (28%) 200Mi (1%) 256Mi (1%) 6d21hPuede ajustar la configuración de
requestssegún el consumo real de recursos.
Desconexiones intermitentes de red desde los pods hacia las bases de datos
Si un pod se desconecta de forma intermitente de una base de datos, siga estos pasos.
1. Comprobar el pod
Revise los eventos del pod en busca de señales de inestabilidad en la conexión, como problemas de red, reinicios o recursos insuficientes.
Revise los registros del pod para identificar mensajes de error relacionados con la conexión a la base de datos, como tiempos de espera agotados, errores de autenticación o activaciones de reconexión.
Monitoree el uso de CPU y memoria del pod para asegurar que el agotamiento de recursos no provoque que la aplicación o el controlador de la base de datos fallen.
Revise los
requestsylimitsde recursos del pod para asegurar que cuente con suficiente CPU y memoria.
2. Comprobar el nodo
Compruebe si el nodo tiene escasez de recursos (memoria, disco). Consulte Monitor nodes.
Pruebe si existen interrupciones intermitentes de red entre el nodo y la base de datos de destino.
3. Comprobar la base de datos
Compruebe el estado y las métricas de rendimiento de la base de datos para detectar reinicios o cuellos de botella.
Revise la cantidad de conexiones anómalas y la configuración de tiempo de espera de conexión. Ajústelas según los requisitos de su aplicación.
Inspeccione los registros de la base de datos en busca de entradas relacionadas con desconexiones.
4. Comprobar el estado de los componentes del clúster
Los componentes del clúster con errores pueden interrumpir la comunicación de red de un pod.
kubectl get pod -n kube-system # Check the status of component pods.
Además, compruebe los siguientes componentes de red:
CoreDNS: compruebe el estado y los registros del componente para asegurar que el pod resuelva correctamente la dirección del servicio de base de datos.
Flannel: compruebe el estado y los registros del componente kube-flannel.
Terway: compruebe el estado y los registros del componente terway-eniip.
5. Analizar el tráfico de red
Puede usar tcpdump para capturar paquetes y analizar el tráfico de red. Esto le ayudará a identificar la causa del problema.
-
Obtenga la información del pod y del nodo:
Enumere los pods y sus nodos en un namespace específico:
kubectl get pod -n [namespace] -o wide -
Inicie sesión en el nodo de destino y ejecute los siguientes comandos para encontrar el PID del contenedor.
Containerd
-
Consulte el
CONTAINERdel contenedor.crictl ps |grep <Pod name keyword>Salida esperada:
CONTAINER IMAGE CREATED STATE a1a214d2***** 35d28df4***** 2 days ago Running -
Consulte el PID del contenedor mediante el
CONTAINER ID.crictl inspect a1a214d2***** |grep -i PIDSalida esperada:
"pid": 2309838, # The PID of the target container. "pid": 1 "type": "pid"
Docker
-
Consulte el
CONTAINER IDdel contenedor.docker ps |grep <pod name keyword>Salida esperada:
CONTAINER ID IMAGE COMMAND a1a214d2***** 35d28df4***** "/nginx -
Consulte el PID del contenedor mediante el
CONTAINER ID.docker inspect a1a214d2***** |grep -i PIDSalida esperada:
"Pid": 2309838, # The PID of the target container. "PidMode": "", "PidsLimit": null,
-
-
Capture los paquetes.
Capture los paquetes de red entre el pod y la base de datos de destino mediante el PID del contenedor.
nsenter -t <container PID> tcpdump -i any -n -s 0 tcp and host <database IP address>Capture los paquetes de red entre el pod y el host mediante el PID del contenedor.
nsenter -t <container PID> tcpdump -i any -n -s 0 tcp and host <node IP address>Capture los paquetes de red entre el host y la base de datos.
tcpdump -i any -n -s 0 tcp and host <database IP address>
6. Optimizar la aplicación
Implemente un mecanismo de reconexión automática en su aplicación para asegurar que restablezca las conexiones de forma automática durante un cambio o una migración de base de datos.
Use conexiones persistentes en lugar de conexiones de corta duración para comunicarse con la base de datos. Las conexiones persistentes reducen significativamente la sobrecarga de rendimiento y el consumo de recursos, lo que mejora la eficiencia general del sistema.
Solución de problemas desde la consola
Inicie sesión en la consola de ACK y vaya a la página de detalles de su clúster para solucionar problemas de pods.
Acciones | Consola |
Comprobar el estado de un pod |
|
Consultar la información básica de un pod |
|
Consultar la configuración de un pod |
|
Consultar los eventos de un pod |
|
Ver los registros de un pod |
Nota ACK se integra con Simple Log Service (SLS) para recopilar registros de contenedores. Consulte Collect container logs from an ACK cluster. |
Consultar los datos de monitoreo de un pod |
Nota ACK se integra con Managed Service for Prometheus para el monitoreo en tiempo real de clústeres y contenedores. Consulte Configure Managed Service for Prometheus. |
Usar una terminal para acceder a un contenedor y ver archivos locales |
|
Ejecutar diagnósticos de pod |
Nota Container Intelligent Service ofrece diagnósticos con un solo clic. Consulte Use cluster diagnostics. |
Eliminación inesperada de un pod
El kube-controller-manager (KCM) recolecta como basura los pods en estado Completed cuando su cantidad supera el umbral predeterminado de 12,500. El parámetro --terminated-pod-gc-threshold configura este umbral. Consulte la documentación de parámetros de KCM.
Recomendación: limpie periódicamente los pods en estado Completed para evitar que afecten la eficiencia del controlador.

> Containerd Configuration.
Los eventos del pod muestran