Ordered by how often each one turns out to be the answer.
The image name or tag is wrong
CommonA typo, a tag that was never pushed, or a tag deleted from the registry. The registry answers correctly — it simply has nothing by that name. "manifest unknown" and "not found" both point here.
Confirm
kubectl describe pod <pod> | grep -A5 Events
"manifest unknown", "manifest for ... not found", or "repository does not exist"
Fix
- Read the image reference back character by character, including the tag.
- Confirm the tag actually exists in the registry rather than assuming CI pushed it.
- Avoid :latest — it makes this failure mode ambiguous and non-reproducible.
docker manifest inspect <image>:<tag>
Run from a machine with registry access. Succeeds if the reference resolves.
Missing or wrong registry credentials
CommonThe image is private and the kubelet has no usable credentials for it. The imagePullSecrets field is absent, references a Secret that does not exist in this namespace, or holds credentials that have expired. Pull secrets are namespaced, which is the detail that catches people — a Secret that works in one namespace does nothing in another.
Confirm
kubectl get pod <pod> -o jsonpath='{.spec.imagePullSecrets}'Empty output for a private image, or a Secret name that kubectl get secret cannot find in this namespace
Fix
- Create a docker-registry Secret in the same namespace as the pod and reference it from imagePullSecrets.
- Check the credentials have not expired — many registry tokens are short-lived.
- For cloud registries, prefer the provider's workload identity over long-lived pull secrets.
kubectl create secret docker-registry regcred --docker-server=<registry> --docker-username=<user> --docker-password=<token> -n <namespace>
The registry is implied rather than stated
OccasionalAn image reference with no registry host defaults to Docker Hub. If the image actually lives in a private or cloud registry, the kubelet dutifully asks the wrong place and is told the image does not exist. The error looks like a missing image; the cause is a missing hostname.
Confirm
kubectl get pod <pod> -o jsonpath='{.spec.containers[*].image}'A reference with no registry host, when the image is not on Docker Hub
Fix
- Fully qualify the reference, including the registry host.
- Prefer digests over tags where reproducibility matters.
The node cannot reach the registry
OccasionalDNS cannot resolve the registry, a firewall or egress policy blocks it, or a required proxy is not configured on the node. Distinguished from the other causes by its error shape: a timeout or connection failure rather than a clear registry response.
Confirm
kubectl describe pod <pod> | grep -i -E 'timeout|no such host|connection refused|i/o timeout'
A network-level error rather than an authentication or not-found response
Fix
- Test connectivity from the node itself, not from your laptop — the node's network is what matters.
- Check egress rules, NAT and any proxy configuration the container runtime needs.
- If DNS is the issue, confirm the node can resolve the registry hostname.
Registry rate limiting
RarePublic registries limit anonymous pulls. A busy cluster pulling unauthenticated can exhaust the allowance, and pulls that previously worked start failing — which makes this look like an intermittent network problem.
Confirm
kubectl describe pod <pod> | grep -i -E 'rate limit|toomanyrequests'
"toomanyrequests" or an explicit rate-limit message
Fix
- Authenticate pulls even for public images, which usually raises the allowance substantially.
- Mirror or cache images you depend on rather than pulling from upstream on every node.