CrashLoopBackOff
The container starts, exits and is restarted with a growing delay. Find the reason in the previous attempt's logs and its exit code.
Troubleshooting guide · ImagePullBackOff
ErrImagePull means the node tried to pull a container image and failed; ImagePullBackOff is the kubelet waiting before it tries again. The pod's events carry the registry's own answer — not found, unauthorised, too many requests — and that answer decides the fix.
Updated
The status only says the pull failed. The event says why, in the words the registry or the container runtime used:
The Events at the bottom carry lines like Failed to pull image followed by the reason:
kubectl describe pod <pod> -n <namespace>
The exact image reference the pod asked for:
kubectl get pod <pod> -n <namespace> -o jsonpath='{.spec.containers[*].image}'
A pod authenticates to a registry with a Secret of type kubernetes.io/dockerconfigjson, named in its imagePullSecrets or in its service account's. The Secret must be in the same namespace as the pod.
Which pull secrets the pod uses:
kubectl get pod <pod> -n <namespace> -o jsonpath='{.spec.imagePullSecrets}'
Create one from a Docker config file that already holds the login, which keeps the password out of your shell history. If your Docker config keeps logins in a credential helper, the file holds no password; use kubectl create secret docker-registry instead:
kubectl create secret generic regcred -n <namespace> --type=kubernetes.io/dockerconfigjson --from-file=.dockerconfigjson=$HOME/.docker/config.json
Let every pod using the namespace's default service account present it:
kubectl patch serviceaccount default -n <namespace> -p '{"imagePullSecrets": [{"name": "regcred"}]}'
After a fix the kubelet retries on its own, but the back-off can be several minutes long. Deleting the pod lets its controller create a new one that pulls straight away:
Recreate the pods of a Deployment:
kubectl rollout restart deployment/<name> -n <namespace>
In PodSteer
Read next
The container starts, exits and is restarted with a growing delay. Find the reason in the previous attempt's logs and its exit code.
No node can take the pod. The scheduler's FailedScheduling event names every constraint that ruled a node out.
The container used more memory than its limit and the kernel killed it. Confirm it, measure the real peak, then size the limit or fix the leak.