Troubleshooting en Kubernetes: proceso paso a paso
Cuando algo falla en un cluster de Kubernetes lo peor que puedes hacer es lanzar comandos al azar. Tener un proceso ordenado para aislar el problema te ahorra horas y evita "soluciones" que en realidad solo mueven el síntoma.
A continuación dejamos el proceso que seguimos cuando un despliegue no se comporta como esperamos, junto con las principales categorías de errores que conviene revisar.
Proceso de resolución
Verifica el estado del Deployment
kubectl get deployment <nombre> -n <ns>
kubectl rollout status deployment/<nombre> -n <ns>¿Los replicas deseados coinciden con los disponibles? Si no, sigue bajando.
Describe el Deployment
kubectl describe deployment <nombre> -n <ns>La sección
Conditionsy los eventos al final suelen contar la historia: imagen inválida, problemas de selector, recursos insuficientes, etc.Verifica los Pods (Ready / Estado)
kubectl get pods -n <ns> -o widePresta atención a
STATUS(Pending,CrashLoopBackOff,ImagePullBackOff,Error,OOMKilled) y a la columnaREADY.Revisa los logs del Pod
kubectl logs <pod> -n <ns>
kubectl logs <pod> -n <ns> --previous # logs del contenedor anterior si crasheó
kubectl logs <pod> -n <ns> -c <container>Revisa al Kubelet del nodo Si los pods están
Pendingo sus contenedores no arrancan, conéctate al nodo y mira el kubelet:journalctl -u kubelet -fSube al Control Plane
- ¿Hay pods del control plane en
PendingoError?kubectl get pods -n kube-system - Revisa logs del
kube-apiserver,kube-controller-managerykube-scheduler. - Confirma que hay recursos suficientes (CPU, memoria, disco) en los nodos.
- ¿Hay pods del control plane en
Categorías de errores a revisar
Cuando el proceso anterior no te lleva a la causa, conviene barrer estas áreas:
- Errores desde la línea de comandos. ¿El recurso siquiera se aplicó?
kubectl applysuele ser muy explícito. - Logs y estado de los pods. Estado actual + logs previos suelen revelar fallos de configuración o de runtime.
- Shell dentro del pod para DNS y red.
kubectl exec -it <pod> -- sh
# dentro: getent hosts mi-servicio, curl, wget, etc. - Logs del nodo y recursos disponibles. Capacidad insuficiente impide el scheduling.
- Seguridad: RBAC, SELinux o AppArmor. Pueden bloquear ServiceAccounts o llamadas al API. Verifica con:
kubectl auth can-i <verbo> <recurso> --as=system:serviceaccount:<ns>:<sa> - Llamadas al
kube-apiserver. Los controllers comunican estado constantemente; un apiserver lento o sobrecargado afecta a todos. - Habilitar auditoría. El audit log del apiserver es invaluable para reconstruir qué pasó.
- Red entre nodos, DNS y firewall. Comprueba que los nodos se ven entre sí en los puertos requeridos por el CNI y que
CoreDNSestá sano.
Resumen mental
Deployment → describe → Pods → logs → kubelet → control plane → red/DNS/RBAC.
Siempre de lo más alto a lo más bajo. Cuando un equipo nuevo adopta este patrón, la mayoría de los incidentes se resuelven sin necesidad de escalarlos.