Skip to content

Troubleshooting

Start from what you are seeing, not from what you think broke. Every entry below is a symptom, and each page tells you how to confirm the cause before changing anything.

Find your symptom

What you seeWhere to go
Forbidden on a kubectl commandThe API said no
admission webhook denied the requestThe API said no
Exec/attach is only allowed into gVisor-sandboxed podsThe API said no
Hostname is not allowed in namespaceThe API said no
Pod stuck in PendingA pod will not start
ImagePullBackOffA pod will not start
CrashLoopBackOffA pod will not start
Your hostname does not resolve, or serves nothingYour app is not reachable
The browser warns about the certificateYour app is not reachable
The site loads over plain HTTPYour app is not reachable
A connection out of the cluster hangs or is refusedOutbound connections fail
An HPA is not scalingScaling does not do what you expect
A sleeping workload never wakes, or never sleepsScaling does not do what you expect
A PVC stays PendingStorage and cost surprises
A volume keeps growingStorage and cost surprises
The invoice is higher than expectedStorage and cost surprises

The three commands worth trying first

Most answers are in one of these, and they cost nothing:

bash
kubectl get pods
kubectl describe pod <name>
kubectl logs deployment/<name>

describe is the one people skip. The events at the end of its output usually name the reason outright, and they are the difference between guessing and knowing.

If a container has already restarted, its current log is from the new attempt and tells you nothing about the failure. Ask for the previous one:

bash
kubectl logs deployment/<name> --previous

What's next