Un pod se encuentra atascado en el estado `Pending` y no se está programando.
→Ejecute `kubectl describe pod <nombre-del-pod>`. Revise la sección `Events` en busca de mensajes del scheduler.
Por qué: El comando `describe` es la herramienta principal para esto. Mostrará razones como "Insufficient cpu/memory", "node(s) had taints the pod didn't tolerate", o "didn't match node selector".
Un pod se inicia y falla repetidamente, con un estado `CrashLoopBackOff`.
→1. `kubectl logs <nombre-del-pod> --previous` para ver los logs del contenedor que falló. 2. `kubectl describe pod <nombre-del-pod>` para verificar el código de salida y la razón.
Por qué: `CrashLoopBackOff` significa que la aplicación dentro del contenedor está saliendo. Los logs de la instancia anterior (`--previous`) son cruciales, ya que el contenedor actual podría no haber registrado nada útil aún. El código de salida también puede indicar el tipo de error.
Un pod no se inicia con estado `ImagePullBackOff` o `ErrImagePull`.
→`kubectl describe pod <nombre-del-pod>` para ver el mensaje del evento. Verifique que el nombre y la etiqueta de la imagen sean correctos. Para registros privados, asegúrese de que `imagePullSecrets` esté configurado y que el secreto sea válido.
Por qué: Este es un problema del registro o del nombre de la imagen, no un problema de la aplicación. Las causas comunes son errores tipográficos, etiquetas incorrectas o fallos de autenticación con un registro privado.
Un nodo tiene un estado `NotReady`.
→Conéctese por SSH al nodo afectado. Verifique el estado del servicio kubelet con `systemctl status kubelet`. Vea sus logs con `journalctl -u kubelet`.
Por qué: El `kubelet` es el agente responsable de informar sobre la salud del nodo. Si está caído o no puede comunicarse con el servidor API, el nodo se marcará como NotReady. Sus logs son el primer lugar donde buscar.
Existe un servicio, pero el tráfico no llega a los pods de backend.
→1. `kubectl describe svc <nombre-del-servicio>` y verifique que el `Selector` coincida con las etiquetas de los pods. 2. `kubectl get endpoints <nombre-del-servicio>` y asegúrese de que liste las IPs correctas de los pods. Si no, las etiquetas no coinciden.
Por qué: El vínculo entre un Service y sus Pods es el selector de etiquetas. Si el selector es incorrecto o los pods no tienen las etiquetas correctas, el objeto Endpoints estará vacío y el servicio no tendrá a dónde enrutar el tráfico.
Los pods no pueden resolver nombres de servicio o nombres de host externos.
→1. Verifique si los pods de CoreDNS se están ejecutando en `kube-system`. 2. Revise los logs de CoreDNS. 3. Ejecute un pod de depuración (por ejemplo, `busybox`) y use `nslookup` para probar la resolución desde dentro del clúster.
Por qué: DNS es una dependencia crítica del clúster. Las fallas generalmente se remontan a la implementación de CoreDNS en sí, su configuración (en un ConfigMap) o políticas de red que bloquean el tráfico DNS en el puerto UDP/TCP 53.
Un nodo debe ser puesto fuera de línea para mantenimiento.
→Primero, `kubectl cordon <nombre-del-nodo>` para marcarlo como no programable. Luego, `kubectl drain <nombre-del-nodo> --ignore-daemonsets` para desalojar de forma segura todos los pods de usuario.
Por qué: `cordon` evita que se programen nuevos pods. `drain` respeta los PodDisruptionBudgets y desaloja los pods con gracia. Se necesita `--ignore-daemonsets` porque los pods de DaemonSet no pueden ser desalojados.
Identificar qué pods o nodos están consumiendo la mayor cantidad de CPU o memoria.
→Utilice `kubectl top pods` y `kubectl top nodes`. Esto requiere que `metrics-server` esté implementado en el clúster.
Por qué: `kubectl top` proporciona una vista rápida y en tiempo real del consumo de recursos, esencial para identificar aplicaciones que consumen muchos recursos o presión de recursos en un nodo.
Un pod ha estado en estado `Terminating` durante mucho tiempo y no se elimina.
→Fuerce la eliminación del pod con `kubectl delete pod <nombre-del-pod> --grace-period=0 --force`.
Por qué: Esto puede suceder si un finalizer está atascado o el kubelet no puede limpiar los recursos. La eliminación forzada elimina el pod del servidor API inmediatamente, pero debe usarse como último recurso ya que puede dejar recursos huérfanos en el nodo.