Deploy Error Decoder

ImagePullBackOff — get Kubernetes to pull the image

Quick answer: Kubernetes could not pull the container image for your pod. The usual causes are a wrong image name or tag (a typo, or a tag that does not exist), a private registry that needs an imagePullSecrets, or a registry that is unreachable or rate-limited. Run kubectl describe pod and read the Events - the exact pull error is there - then fix the reference or add the pull secret.

Not your exact error? Paste it into the Deploy Error Decoder →

What the error looks like

The pod status, and the real reason in its Events:

NAME           READY   STATUS             RESTARTS   AGE
web-xxxx       0/1     ImagePullBackOff   0          2m

# kubectl describe pod web-xxxx -> Events:
Failed to pull image "myrepo/web:v2":
  rpc error: code = NotFound desc = ... manifest unknown
Back-off pulling image "myrepo/web:v2"

Read the Events line. manifest unknown / not found = bad name or tag; pull access denied / no basic auth = a private registry needing credentials; timeout = the registry is unreachable.

Why it happens

Wrong image name or tag

A typo, or a tag that was never pushed or has been deleted.

Private registry, no imagePullSecrets

The kubelet has no credentials, so the pull is denied.

Registry unreachable or rate-limited

Network/firewall blocks the registry, or Docker Hub rate-limits anonymous pulls.

Architecture mismatch

The image has no variant for the node architecture (arm64 vs amd64).

Diagnose it in three steps

1

Read the pod Events

kubectl describe pod web-xxxx
# the Events at the bottom name the exact pull failure.
2

Verify the image:tag exists

docker pull myrepo/web:v2     # does it resolve from where you are?
# typo, wrong registry, or missing tag will fail here too.
3

Check credentials for a private registry

kubectl get secret regcred -o yaml   # exists and referenced?
kubectl get pod web-xxxx -o jsonpath='{.spec.imagePullSecrets}'
The real fix

Fix the reference, add a pull secret, pin the tag

Correct the image name and tag, and for a private registry create an image pull secret and reference it. Pin a specific tag or digest so pulls are reproducible.

# create credentials for a private registry
kubectl create secret docker-registry regcred \
  --docker-server=registry.example.com \
  --docker-username=USER --docker-password=PASS

# reference it in the pod / deployment spec
spec:
  imagePullSecrets:
    - name: regcred
  containers:
    - name: web
      image: registry.example.com/web:v2   # a specific tag, not latest

For Docker Hub rate limits, authenticate pulls with an imagePullSecret or mirror the image into a registry you control - anonymous pulls are limited by IP.

How Infraveil handles this

Verify the image before the rollout

A pod that cannot pull its image is a deploy that should never have started. On your own servers, Infraveil checks a rollout and surfaces a failed pull with its context before it takes traffic - and keeps registry credentials least-privilege and recorded, so a bad tag or missing secret is caught early, not in a stuck pod.

Rollouts verified, failed pulls surfaced before traffic, on infra you control
Registry credentials kept least-privilege and recorded
Recovery approval-gated and recorded

Frequently asked questions

What is the difference between ImagePullBackOff and ErrImagePull?

ErrImagePull is the immediate pull failure; ImagePullBackOff is the state Kubernetes enters afterward, backing off and retrying with increasing delay. Two stages of the same problem - check the pod Events for the underlying reason.

How do I pull from a private registry?

Create a docker-registry secret (kubectl create secret docker-registry regcred ...) and reference it with imagePullSecrets in the pod spec or service account. Without it the kubelet has no credentials and the pull is denied.

Why am I getting Docker Hub rate-limit errors?

Docker Hub limits anonymous pulls by IP, which a busy cluster hits fast. Authenticate pulls with an imagePullSecret, mirror the image to your own registry, or pin images in a registry you control.

Why is using the latest tag risky?

latest is mutable, so a node may pull a tag that moved or was removed and you cannot tell which build is running. Pin a specific immutable tag or a digest so pulls are stable and reproducible.