Un pod roto cuenta por qué falla
Cuando un pod de Kubernetes no funciona, el clúster no dice «falló». Te da un estado y una lista de sucesos. Con kubectl describe y kubectl logs encuentras la causa casi siempre.
Un pedido de la librería online se queda sin procesar a las diez de la noche. Nadie sabe por qué. Leer esos dos sitios, en el orden correcto, te ahorra horas de pruebas al azar.
Al final de esta lección
Nota
Puedo leer describe y logs para nombrar el fallo de un pod.
Palabras clave
| Palabra | Qué significa | Ejemplo |
|---|---|---|
| describe | la orden que cuenta todo sobre un objeto y sus sucesos | kubectl describe pod |
| logs | lo que el programa del pod ha escrito | kubectl logs |
| Suceso | una nota que deja Kubernetes sobre algo que pasó | |
| Pending | el pod existe, pero ningún nodo lo ha aceptado | |
| ImagePullBackOff | el pod no puede bajar su imagen y espera para reintentar | |
| CrashLoopBackOff | el pod arranca y se cae, y espera entre intentos |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
STATUS dice por dónde empezar a buscar
El estado de un pod apunta a la familia del fallo. Con ImagePullBackOff, el problema es la imagen. Con Pending, el pod no tiene sitio. Con CrashLoopBackOff, el programa arranca y se para.
Para verlo, crea tres Deployments rotos en un namespace propio, taller. Son tuyos, sirven para practicar y no se parecen a los de la práctica del laboratorio.
Ejemplo: del estado a la orden
| STATUS | Qué pasó | Qué orden usas |
|---|---|---|
| ErrImagePull o ImagePullBackOff | No se pudo bajar la imagen | kubectl describe pod |
| Pending | Ningún nodo acepta el pod | kubectl describe pod |
| CrashLoopBackOff o Error | El programa arranca y se para | kubectl logs |
| ContainerCreating | Se está preparando | Esperar y repetir get |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Crea el namespace taller
kubectl create namespace tallerSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Crea un Deployment con imagen inexistente
kubectl create deployment imagen-mala --image=busybox:9.9 -n taller -- sleep 3600Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Crea un Deployment sin ninguna réplica
kubectl create deployment sin-sitio --image=busybox:1.37.0 --replicas=0 -n taller -- sleep 3600Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Pide un nodo con una etiqueta inexistente
kubectl patch deployment sin-sitio -n taller -p '{"spec":{"template":{"spec":{"nodeSelector":{"disco":"ssd"}}}}}'Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Pídele una réplica
kubectl scale deployment sin-sitio --replicas=1 -n tallerSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Crea un programa que busca un archivo ausente
kubectl create deployment se-cae --image=busybox:1.37.0 -n taller -- cat /precios.txtSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Espera medio minuto antes de mirar
Un fallo tarda en verse: Kubernetes lo intenta varias veces antes de rendirse. Espera unos 30 segundos y mira los estados.
Verás tres pods. Uno dirá ErrImagePull o ImagePullBackOff, otro Pending, y el tercero Error o CrashLoopBackOff. Cuál de los dos aparece depende del instante.
Mira los estados de los tres pods
kubectl get pods -n tallerSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
describe muestra los sucesos del pod
kubectl describe pod imprime muchas líneas. La importante está al final, bajo Events: los sucesos, de más antiguo a más nuevo, con su motivo.
Con grep te quedas solo con la línea que buscas. En un pod con la imagen mala, el suceso Failed nombra la imagen que no se pudo bajar. En un pod sin sitio, FailedScheduling cuenta cuántos nodos había y por qué no valían.
Busca por qué no baja la imagen
kubectl describe pod -n taller -l app=imagen-mala | grep 'Failed to pull'Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Busca por qué ningún nodo acepta el pod
kubectl describe pod -n taller -l app=sin-sitio | grep FailedSchedulingSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
logs muestra lo que escribió el programa
Si el pod llegó a arrancar, su programa pudo escribir algo antes de pararse. kubectl logs lo muestra. Es la orden para CrashLoopBackOff.
Pero un pod que nunca arrancó no tiene log, porque su programa nunca corrió. Con Pending o con una imagen que no baja, logs no te cuenta nada y describe sí.
Lee el log del programa que se cae
kubectl logs deployment/se-cae -n tallerSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Pide el log del pod sin imagen
kubectl logs deployment/imagen-mala -n tallerSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Un error frecuente
Advertencia
Mucha gente cree que kubectl logs explica cualquier pod roto. Solo sirve si el programa llegó a correr y escribió algo. Si el pod está en Pending o no baja su imagen, empieza por describe: sus sucesos tienen la causa.
Arregla la imagen del primer Deployment
kubectl set image deployment/imagen-mala busybox=busybox:1.37.0 -n tallerSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Espera a que el pod nuevo esté listo
kubectl rollout status deployment/imagen-mala -n tallerSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Borra el namespace taller
kubectl delete namespace tallerSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.