Skip to content
Latchkey

Kubernetes "pull QPS exceeded" / "context canceled" Image Pull - Fix in CI

The kubelet aborted an in-progress image pull because it stopped making progress within its deadline (or the operation was canceled). On a large image over a congested link this is transient - the kubelet retries and the pull usually completes on a later attempt.

What this error means

Pod events show a pull that started then aborted with context canceled or a pull that makes no progress and is retried, before the image finally lands. It is intermittent - a re-pull (or simply waiting for the kubelet retry) succeeds.

kubectl describe pod
Failed to pull image "registry/api:1.0": rpc error: code = Canceled desc =
context canceled
Normal  Pulling  kubelet  Pulling image "registry/api:1.0"   (retry)

Diagnose it: read events and previous logs

Terminal
kubectl --context "$KUBE_CONTEXT" -n "$NS" get pods -o wide
kubectl -n "$NS" describe pod <pod> | sed -n "/Events/,$p"
kubectl -n "$NS" logs <pod> --previous --tail=50

Common causes

Large image over a slow/congested link

A multi-gigabyte image pulled over a congested node network stalls long enough to trip the kubelet’s pull progress deadline, aborting that attempt.

Transient registry/network interruption

A momentary connection drop or registry slowdown cancels the in-flight pull; the next attempt usually proceeds normally.

How to fix it

Let the kubelet retry, and confirm progress

These aborts are transient. The kubelet retries pulls automatically; watch the events to confirm it ultimately succeeds.

Terminal
kubectl get events --field-selector involvedObject.name=<pod> --watch

Reduce pull time so it does not stall

  1. Shrink images (multi-stage builds, slimmer bases) so pulls finish well within the deadline.
  2. Pre-pull hot images (DaemonSet) or pin digests so cached layers are reused across nodes.
  3. Serve images from a closer/internal registry or pull-through cache to cut transfer time.

How to prevent it

  • Keep images small so pulls complete quickly and reliably.
  • Use a nearby registry/mirror and pin digests for layer reuse.
  • Pre-pull large base images onto nodes to avoid per-pod transfer stalls.

Frequently asked questions

What causes Kubernetes "pull QPS exceeded" / "context canceled" image pull?
There are 2 common causes: large image over a slow/congested link and transient registry/network interruption. A multi-gigabyte image pulled over a congested node network stalls long enough to trip the kubelet’s pull progress deadline, aborting that attempt.
How do I fix Kubernetes "pull QPS exceeded" / "context canceled" image pull?
There are 2 fixes depending on which cause you have: let the kubelet retry, and confirm progress and reduce pull time so it does not stall. Work through them in order, since the first is the most common.
What does Kubernetes "pull QPS exceeded" / "context canceled" image pull actually mean?
Pod events show a pull that started then aborted with context canceled or a pull that makes no progress and is retried, before the image finally lands.
How do I stop Kubernetes "pull QPS exceeded" / "context canceled" image pull happening again?
Keep images small so pulls complete quickly and reliably. The prevention section lists 3 changes that keep it from recurring.
Can Latchkey fix this automatically?
Yes. Latchkey runs your GitHub Actions on managed runners that detect this failure, apply the fix, and retry the job automatically - self-healing is on by default.

Related guides

References

This is a transient network failure, not a bug in your code. Latchkey detects, repairs, and retries it for you. Start free → 30-day trial · No credit card