Solución de problemas de fallos de Pods de Kubernetes: Una guía completa
Los Pods de Kubernetes son las unidades desplegables más pequeñas del ecosistema, ya que ejecutan los contenedores que impulsan su aplicación. Cuando un Pod falla, afecta directamente la disponibilidad y fiabilidad de su servicio. Diagnosticar los fallos de los Pods de forma rápida y precisa es una habilidad fundamental para cualquier administrador o desarrollador de Kubernetes.
Esta guía proporciona un enfoque estructurado paso a paso para diagnosticar los escenarios de fallo de Pod más comunes. Cubriremos los comandos esenciales de kubectl utilizados para la inspección, interpretaremos varios estados de Pod y describiremos soluciones prácticas para restaurar sus aplicaciones a un estado estable y en ejecución.
Los tres pilares del diagnóstico de Pods
La solución de problemas comienza utilizando tres comandos principales de kubectl para recopilar toda la información disponible sobre el Pod que está fallando.
1. Verificación del estado inicial (kubectl get pods)
El primer paso es siempre determinar el estado actual del Pod y sus contenedores. Preste mucha atención a las columnas STATUS (ESTADO) y READY (LISTO).
kubectl get pods -n my-namespace
Interpretación del estado del Pod
| Estado | Significado | Acción inicial |
|---|---|---|
| Running | El Pod está sano, todos los contenedores se están ejecutando. | (Probablemente no haya problemas, a menos que la sonda de preparación falle). |
| Pending | Kubernetes ha aceptado el Pod, pero los contenedores aún no se han creado. | Comprobar los eventos de programación o el estado de extracción de la imagen. |
| CrashLoopBackOff | El contenedor se inicia, falla y Kubelet intenta reiniciarlo repetidamente. | Revisar los registros de la aplicación (kubectl logs --previous). |
| ImagePullBackOff | Kubelet no puede extraer la imagen de contenedor requerida. | Comprobar el nombre de la imagen, la etiqueta y las credenciales del registro. |
| Error | El Pod terminó debido a un error de tiempo de ejecución o a un comando de inicio fallido. | Revisar los registros y los eventos de describe. |
| Terminating/Unknown | El Pod se está apagando o el host Kubelet no responde. | Comprobar el estado del nodo. |
2. Inspección profunda (kubectl describe pod)
Si el estado es diferente de Running, el comando describe proporciona un contexto crucial, detallando las decisiones de programación, la asignación de recursos y los estados de los contenedores.
kubectl describe pod [POD_NAME] -n my-namespace
Concéntrese en estas secciones de la salida:
- Containers/Init Containers: Compruebe el
State(Estado) (especialmenteWaitingoTerminated) y elLast State(Último estado) (donde a menudo se registra el motivo del fallo, p. ej.,Reason: OOMKilled). - Resource Limits: Verifique que
Limits(Límites) yRequests(Solicitudes) estén configurados correctamente. - Events: Esta es la sección más crítica. Los eventos muestran el historial del ciclo de vida, incluidos los fallos de programación, los problemas de montaje de volúmenes y los intentos de extracción de imágenes.
Consejo: Si la sección
Eventsmuestra un mensaje como "0/N nodes available" (0/N nodos disponibles), es probable que el Pod no se pueda programar debido a recursos insuficientes (CPU, memoria) o a que no se cumplen las reglas de afinidad.
3. Revisión de registros (kubectl logs)
Para problemas de aplicación en tiempo de ejecución, los registros proporcionan el rastreo de pila o los mensajes de error que explican por qué terminó el proceso.
# Comprobar los registros del contenedor actual
kubectl logs [POD_NAME] -n my-namespace
# Comprobar los registros de un contenedor específico dentro del Pod
kubectl logs [POD_NAME] -c [CONTAINER_NAME] -n my-namespace
# Crucial para CrashLoopBackOff: Comprobar los registros de la ejecución fallida *anterior*
kubectl logs [POD_NAME] --previous -n my-namespace
Escenarios comunes de fallo de Pod y soluciones
La mayoría de los fallos de Pods entran en unos pocos patrones reconocibles, cada uno de los cuales requiere un enfoque de diagnóstico específico.
Escenario 1: CrashLoopBackOff
Este es el fallo de Pod más frecuente. Indica que el contenedor se está iniciando correctamente, pero la aplicación dentro del contenedor se está cerrando inmediatamente (con un código de salida distinto de cero).
Diagnóstico:
1. Utilice kubectl logs --previous para ver el rastreo de la pila o el motivo de la salida.
2. Utilice kubectl describe para comprobar el Exit Code (Código de salida) en la sección Last State (Último estado).
Causas comunes y soluciones:
- Código de salida 1/2: Error general de la aplicación, archivo de configuración faltante, fallo de conectividad con la base de datos o bloqueo de la aplicación debido a una entrada incorrecta.
- Solución: Depure el código de la aplicación o compruebe los ConfigMaps/Secrets que se están montando.
- Dependencias faltantes: El script de punto de entrada requiere archivos o entornos que no están presentes.
- Solución: Verifique el Dockerfile y el proceso de compilación de la imagen.
Escenario 2: ImagePullBackOff / ErrImagePull
Esto ocurre cuando Kubelet no puede obtener la imagen de contenedor especificada en la definición del Pod.
Diagnóstico:
1. Compruebe la sección Events de kubectl describe para ver el mensaje de error específico (p. ej., 404 Not Found o authentication required).
Causas comunes y soluciones:
- Error tipográfico o etiqueta incorrecta: El nombre de la imagen o la etiqueta son incorrectos.
- Solución: Corrija el nombre de la imagen en la especificación de Deployment o Pod.
- Acceso al registro privado: El clúster no tiene credenciales para extraer de un registro privado (como Docker Hub, GCR, ECR).
- Solución: Asegúrese de que se haga referencia a un
imagePullSecretapropiado en la especificación del Pod y de que el Secret exista en el espacio de nombres.
- Solución: Asegúrese de que se haga referencia a un
# Fragmento de especificación de Pod de ejemplo para usar un secreto de extracción
spec:
containers:
...
imagePullSecrets:
- name: my-registry-secret
Escenario 3: Estado Pending (Atascado)
Un Pod permanece en estado Pending (Pendiente), lo que normalmente indica que no se puede programar en un Nodo o que está esperando recursos (como un PersistentVolume).
Diagnóstico:
1. Ejecute kubectl describe y mire la sección Events.
Causas comunes y soluciones:
- Agotamiento de recursos: Al clúster le faltan Nodos con suficiente CPU o Memoria disponible para satisfacer las
requestsdel Pod.- Solución: Aumente el tamaño del clúster o reduzca las solicitudes de recursos del Pod (si es factible).
- Ejemplo de mensaje de evento:
0/4 nodes are available: 4 Insufficient cpu.(0/4 nodos disponibles: 4 CPU insuficientes.)
- Problemas de vinculación de volúmenes: El Pod requiere un
PersistentVolumeClaim(PVC) que no se puede vincular a unPersistentVolume(PV) subyacente.- Solución: Compruebe el estado del PVC (
kubectl get pvc) y asegúrese de que el StorageClass funcione.
- Solución: Compruebe el estado del PVC (
Escenario 4: OOMKilled (Fuera de la memoria agotada)
Aunque esto normalmente da como resultado un estado CrashLoopBackOff, la causa subyacente es específica: el contenedor utilizó más memoria que el límite definido en su especificación, lo que provocó que el sistema operativo host (a través de Kubelet) lo terminara forzosamente.
Diagnóstico:
1. Compruebe kubectl describe -> Last State (Último estado) -> Reason: OOMKilled (Motivo: OOMKilled).
Soluciones:
- Aumentar límites: Aumente el
limitde memoria en la especificación del Pod, proporcionando más margen. - Optimizar la aplicación: Analice la aplicación para reducir su huella de memoria.
- Establecer solicitudes: Asegúrese de que las
requestsestén cerca del uso real en estado estacionario para mejorar la fiabilidad de la programación.
resources:
limits:
memory: "512Mi" # Aumente este valor
requests:
memory: "256Mi"
Prevención de fallos futuros: Mejores prácticas
Las aplicaciones robustas requieren una configuración cuidadosa para evitar errores comunes de implementación.
Utilice sondas de actividad (Liveness) y de preparación (Readiness)
La implementación adecuada de las sondas permite a Kubernetes gestionar de forma inteligente el estado de salud del contenedor:
- Liveness Probes (Sondas de actividad): Determinan si el contenedor está lo suficientemente sano para seguir ejecutándose. Si la sonda de actividad falla, Kubelet reiniciará el contenedor (resolviendo bloqueos suaves).
- Readiness Probes (Sondas de preparación): Determinan si el contenedor está listo para atender tráfico. Si la sonda de preparación falla, el Pod se elimina de los puntos finales del servicio, lo que evita solicitudes fallidas mientras el contenedor se recupera.
Aplicar límites y solicitudes de recursos
Defina siempre los requisitos de recursos para los contenedores. Esto evita que los Pods consuman recursos excesivos (lo que provoca inestabilidad del Nodo) y garantiza que el programador pueda colocar el Pod en un Nodo con capacidad suficiente.
Utilice contenedores de inicialización (Init Containers) para la configuración
Si un Pod requiere una comprobación de dependencias o una configuración de datos antes de que se inicie la aplicación principal (por ejemplo, esperar a que se complete una migración de base de datos), utilice un Init Container. Si el Init Container falla, el Pod lo reiniciará repetidamente, aislando de forma limpia los errores de configuración de los errores de tiempo de ejecución de la aplicación.
Conclusión
Dominar la solución de problemas de los Pods de Kubernetes se basa en un enfoque metódico, que depende en gran medida de la salida de kubectl get, kubectl describe y kubectl logs. Al analizar sistemáticamente el estado del Pod, leer el historial de eventos y comprender los códigos de salida comunes, puede diagnosticar y resolver rápidamente los fallos de CrashLoopBackOff, ImagePullBackOff y los relacionados con recursos, garantizando así un tiempo de actividad constante de la aplicación.