Kubernetes · Cheatsheet 06
Problemas comunes
Buscá por el STATUS del Pod o por el texto del error. Cada tarjeta: qué ves → por qué pasa → cómo se arregla.
0
El camino de diagnóstico
Casi todo se resuelve con estos 3 comandos, en este orden.
✓
Y para el namespace entero: kubectl get events --sort-by=.lastTimestamp.
1
Estado del Pod
ImagePullBackOff / ErrImagePull
Failed to pull image "chanchito:latest": pull access denied, repository does not exist- Causa
- La imagen no existe en el registry, el tag está mal, es privada, o es una imagen local y Kubernetes intenta bajarla de Docker Hub (pasa siempre con
:latest). - Solución
- Tag fijo +
imagePullPolicy: IfNotPresent, y que la imagen esté en el nodo:
Imagen privada:docker build -t chanchito:1 . # minikube / kind: minikube image load chanchito:1 kind load docker-image chanchito:1imagePullSecretscon un Secretdocker-registry.
CrashLoopBackOff
chanchito-7d9f8-x2k4 0/1 CrashLoopBackOff 5 (32s ago)- Causa
- El contenedor arranca y se cae una y otra vez: error en la app, variable faltante, no conecta a la DB, comando mal, o una
livenessProbeque la mata. - Solución
# log del intento que murió kubectl logs <pod> --previous # Last State, Exit Code, probes kubectl describe pod <pod>
Pending
0/1 nodes are available: 1 Insufficient memory.- Causa
- El scheduler no encuentra un nodo:
requestsdemasiado altos, PVC sin enlazar (unbound PersistentVolumeClaims) o taints en los nodos. - Solución
- Leé el evento en
kubectl describe pod. Bajárequests, dale más RAM a Docker Desktop, o revisákubectl get pvc(tiene que estar Bound).
CreateContainerConfigError
Error: secret "mongo-secret" not found- Causa
- El Pod referencia un Secret/ConfigMap (o una clave dentro) que no existe en ese namespace.
- Solución
Crealo antes o corregí el nombre/clave. El Pod arranca solo cuando aparece.kubectl get secret,cm kubectl describe secret mongo-secret
OOMKilled (exit code 137)
Last State: Terminated Reason: OOMKilled Exit Code: 137- Causa
- El contenedor superó
limits.memory. - Solución
- Subí el límite (ej.
512Mi) o reducí el consumo. Mirá el uso real conkubectl top pod.
Running pero 0/1 READY
- Causa
- La
readinessProbefalla: path o puerto incorrecto, o la app tarda más queinitialDelaySeconds. Mientras tanto el Service no le manda tráfico. - Solución
kubectl describe pod→ “Readiness probe failed: …”. Corregí path/puerto o aumentá el delay.
Borro un Pod y vuelve a aparecer
- Causa
- Es de un Deployment: el estado deseado dice N réplicas y el controller lo recrea. No es un error.
- Solución
# apagar sin borrar kubectl scale deploy chanchito --replicas=0 # borrar de verdad kubectl delete deploy chanchito
Pod trabado en Terminating
- Causa
- El proceso no responde a SIGTERM, el nodo se perdió, o un finalizer bloquea.
- Solución
kubectl delete pod <pod> --grace-period=0 --force
2
Red y Services
El Service no responde (endpoints vacíos)
kubectl get endpoints chanchito
NAME ENDPOINTS AGE
chanchito <none> 5m- Causa
- El
selectordel Service no coincide con loslabelsde los Pods, o los Pods no están Ready. - Solución
Compará los labels con el campo Selector.Ver diagrama de labels.kubectl get pods --show-labels kubectl describe svc chanchito
connection refused a través del Service
- Causa
- Hay endpoints pero
targetPortno es el puerto donde escucha la app (ej. 80 en vez de 3000), o la app escucha solo en127.0.0.1. - Solución
targetPort=containerPort= puerto real. La app debe escuchar en0.0.0.0. Probá directo:kubectl port-forward pod/<pod> 3000:3000.
ENOTFOUND monguito
getaddrinfo ENOTFOUND monguito- Causa
- No existe un Service llamado así en el mismo namespace (el nombre del Deployment o del Pod no sirve como host).
- Solución
Si está en otro namespace:kubectl get svc kubectl run tmp --rm -it --image=busybox -- nslookup monguitomonguito.<namespace>.
localhost:30080 no abre
- Causa
- Depende del cluster: Docker Desktop publica NodePorts en
localhost; minikube y kind no. - Solución
minikube service chanchito --url # funciona en todos: kubectl port-forward svc/chanchito 3000:80
nodePort fuera de rango
spec.ports[0].nodePort: Invalid value: 3000: provided port is not in the valid range. The range of valid ports is 30000-32767- Solución
- Usá un valor entre
30000y32767, u omitilo para que se asigne solo.
Ingress devuelve 404 o no hace nada
- Causa
- No hay Ingress controller instalado,
ingressClassNameno coincide, o elhostno es el que escribís en el navegador. - Solución
kubectl get ingressclass kubectl describe ingress chanchito
port-forward: puerto ocupado
Unable to listen on port 3000: ... bind: address already in use- Solución
- Otro proceso (¿tu
docker compose?) usa ese puerto. Usá otro local:kubectl port-forward svc/chanchito 3001:80.
3
kubectl y YAML
No conecta al cluster
The connection to the server localhost:8080 was refused - did you specify the right host or port?- Causa
- No hay cluster corriendo o no hay kubeconfig/contexto seleccionado.
- Solución
- Encendé Kubernetes en Docker Desktop (o
minikube start) y:kubectl config get-contexts kubectl config use-context docker-desktop
No resources found
No resources found in default namespace.- Causa
- Lo creaste en otro namespace o estás en otro contexto/cluster.
- Solución
kubectl get pods -A kubectl config current-context
Error de YAML / campo desconocido
error converting YAML to JSON: yaml: line 12: mapping values are not allowed in this context
strict decoding error: unknown field "spec.template.spec.contaners"- Causa
- Indentación/tabs, o un nombre de campo mal escrito.
- Solución
kubectl apply -f k8s/ --dry-run=server kubectl explain deployment.spec.template.spec
field is immutable
The Deployment "chanchito" is invalid: spec.selector: Invalid value: ... field is immutable- Causa
- Cambiaste el
selectorde un Deployment (o campos fijos de un Service/PVC) ya creado. - Solución
kubectl delete deploy chanchito kubectl apply -f k8s/chanchito.yaml
selector no coincide con template
spec.template.metadata.labels: Invalid value: {"app":"chanchito"}: `selector` does not match template `labels`- Solución
spec.selector.matchLabelstiene que ser igual aspec.template.metadata.labels.
4
Config y datos
Cambié el ConfigMap/Secret y la app sigue igual
- Causa
- Las variables de entorno se leen solo al arrancar el contenedor.
- Solución
kubectl rollout restart deploy/chanchito
Se perdieron los datos de Mongo
- Causa
- No había PVC (los datos estaban dentro del Pod), el
mountPathno era/data/db, okubectl delete -f k8s/borró el PVC (conreclaimPolicy: Deletese borra el disco). - Solución
- PVC + mountPath correcto. Para bajar la app sin perder datos, borrá solo los Deployments:
kubectl delete deploy chanchito monguito.
Mongo: Authentication failed tras cambiar el Secret
- Causa
- Igual que en Docker:
MONGO_INITDB_ROOT_*solo se aplica con el disco vacío. El PVC ya tenía el usuario viejo. - Solución
# ⚠ incluye el PVC: borra los datos kubectl delete -f k8s/monguito.yaml kubectl apply -f k8s/monguito.yaml
PVC en Pending
- Causa
- No hay StorageClass por defecto, o pediste un
accessModeque no soporta (ej.ReadWriteManyen local). - Solución
Una StorageClass tiene que figurar comokubectl get storageclass kubectl describe pvc mongo-data(default).
No encontré ese problema. Probá con otra palabra del error o del STATUS.