Skip to content

Kubernetes ImagePullBackOff Error Fix

DodaTech Updated 2026-06-24 3 min read

In this tutorial, you'll learn about Kubernetes ImagePullBackOff Error Fix. We cover key concepts, practical examples, and best practices.

The Problem

Your pod stays in ImagePullBackOff and never reaches Running:

NAME                     READY   STATUS             RESTARTS   AGE
my-app-6b4c9f8d7-abc12   0/1     ImagePullBackOff   0          2m

Describing the pod shows an ErrImagePull or Failed to pull image event. The container runtime cannot download the specified image from the registry.

Quick Fix

Step 1: Check the image name for typos

kubectl describe pod my-app-6b4c9f8d7-abc12

Look for the image in the container spec:

Container ID:
Image:         nginx:lates   # typo! should be nginx:latest

WRONG -- common naming mistakes:

  • nginx:lates (typo in tag)
  • myapp (missing registry URL for private images)
  • registry.io/image name (space in name)

RIGHT -- correct image references:

  • nginx:latest (official image with correct tag)
  • myregistry.io/myapp:v1.2.3 (fully qualified private registry)
  • docker.io/library/nginx:1.25 (explicit registry, library image)

Fix with:

kubectl set image deployment/my-app my-container=nginx:1.25

Step 2: Verify the image exists

Pull the image manually on any node:

docker pull nginx:lates
# Error: nginx:lates not found

If the image does not exist in the registry, rebuild and push it:

docker build -t myregistry.io/myapp:v1.2.3 .
docker push myregistry.io/myapp:v1.2.3

Step 3: Fix registry authentication

For private registries, create a pull secret:

kubectl create secret docker-registry regcred \
  --docker-server=myregistry.io \
  --docker-username=myuser \
  --docker-password=mypassword \
  --docker-email=myemail@example.com

Then add it to the service account or pod spec:

WRONG -- no imagePullSecrets:

spec:
  containers:
  - name: app
    image: myregistry.io/private-app:latest
  # No imagePullSecrets

RIGHT -- reference the secret:

spec:
  imagePullSecrets:
  - name: regcred
  containers:
  - name: app
    image: myregistry.io/private-app:latest

Step 4: Check network access to the registry

Test connectivity from within the cluster using a debug pod:

kubectl run netshoot --image=nicolaka/netshoot -it --rm --restart=Never -- curl -I https://myregistry.io

If the registry is not reachable, check:

  • DNS resolution from the cluster
  • Network policies blocking egress
  • Proxy settings in the container runtime
  • Firewall rules on the registry side

Step 5: Use imagePullPolicy correctly

kubectl get pod my-app-6b4c9f8d7-abc12 -o jsonpath='{.spec.containers[0].imagePullPolicy}'

WRONG -- Always pulls even when the image exists locally, which fails if the registry is unreachable:

imagePullPolicy: Always

RIGHT -- use IfNotPresent for development clusters with intermittent registry access:

imagePullPolicy: IfNotPresent

Step 6: Check registry rate limits

Docker Hub enforces pull rate limits (100 pulls per 6 hours for anonymous users, 200 for free accounts). If exceeded, pods fail with ImagePullBackOff. Create an authenticated pull secret to increase limits or use a mirror registry.

Use DodaTech's Registry Check tool to test image availability and authentication before deploying.

Prevention

  • Always use explicit image tags, never latest.
  • Store registry credentials as Kubernetes secrets before deploying.
  • Use a private registry mirror (e.g., Harbor, ECR) to avoid rate limits.
  • Set imagePullPolicy: IfNotPresent for stable clusters.
  • Test image pull manually before applying the deployment.

Common Mistakes with imagepullbackoff

  1. Using head and tail instead of pattern matching, causing runtime errors on empty lists
  2. Forgetting that lazy evaluation defers computation until the value is forced, causing space leaks with unevaluated thunks
  3. Using return to exit a function early instead of wrapping a pure value in the monad

These mistakes appear frequently in real-world K8S code. DodaTech's contributors have identified these patterns through analysis of open-source projects and production systems.

Practice Exercise

Write a pure function that safely divides two integers using Maybe, then test it with edge cases like division by zero and negative numbers.

This exercise reinforces the concepts covered in this guide. Try implementing it before checking online solutions.

FAQ

### What is the difference between ImagePullBackOff and ErrImagePull?

ErrImagePull is the initial state when the kubelet fails to pull the image. After a few retries, the kubelet moves to ImagePullBackOff and increases the back-off delay exponentially. Both indicate the same root cause.

Why can I pull the image locally but the cluster cannot?

Your local machine may have different registry credentials, no proxy, or different DNS. The cluster nodes pull the image independently. Create a docker-registry secret and add it to the pod's imagePullSecrets.

Does imagePullPolicy: Always cause unnecessary network traffic?

Yes. Always sends a pull request on every pod start, even if the image is already cached. Use IfNotPresent in production to avoid registry dependency during pod restarts and to reduce network traffic.

Built by the developers of DodaTech

Doda Browser, DodaZIP & Durga Antivirus Pro