Kubernetes Pod Stuck in Pending (FailedScheduling)

A pod stuck in Pending hasn't been placed on any node yet — the scheduler looked and found nowhere to put it. The events tell you exactly why, and it's usually resources, taints, or an unbound volume.

BytExplorer 6 min read July 17, 2026

Your pod never leaves Pending:

NAME                     READY   STATUS    RESTARTS   AGE
worker-5f7c8b9d6-t4rql   0/1     Pending   0          2m

Pending means the pod exists in the cluster but the scheduler hasn't assigned it to a node — it looked at every node and none of them qualified. The container hasn't been pulled or started; there's nowhere to start it. Kubernetes always records why in the pod's events.

Step 1: Read the FailedScheduling reason

kubectl describe pod <pod>     # Events will contain a FailedScheduling line

The reason string is precise, e.g. 0/3 nodes are available: 3 Insufficient cpu. Match yours to a cause below.

Cause 1: Insufficient CPU or memory

Insufficient cpu / Insufficient memory means no single node has enough free capacity to satisfy the pod's requests. Note it's about requests, not usage — a node 90% idle still can't fit a pod that requests more than its remaining allocatable amount.

resources:
  requests:
    cpu: "250m"      # ask for what the app needs, not a round number like 2 CPUs
    memory: "256Mi"

Lower the requests to something realistic, or add a node to the cluster.

Cause 2: A taint the pod doesn't tolerate

node(s) had untolerated taint means the only nodes with room are tainted (control-plane nodes, or nodes reserved for other work) and your pod has no matching toleration. Either target a different node or add the toleration the taint requires.

Cause 3: An unbound PersistentVolumeClaim

If the pod mounts a PVC, pod has unbound immediate PersistentVolumeClaims means the volume it needs doesn't exist yet. Check the claim:

kubectl get pvc      # is it Bound, or stuck Pending too?

A Pending PVC usually means no StorageClass provisioned it (no default StorageClass, or none matches). Fix the PVC first — the pod can't schedule until its storage is ready.

Cause 4: Node affinity or nodeSelector matches nothing

node(s) didn't match Pod's node affinity/selector means your nodeSelector/affinity asked for a label no node has (a typo, or a node pool that isn't there). Relax the selector or label a node to match.

The checklist

  1. kubectl describe pod <pod> and read the FailedScheduling reason verbatim.
  2. "Insufficient cpu/memory" → lower requests or add a node.
  3. "untolerated taint" → add a toleration or pick another node.
  4. "unbound PersistentVolumeClaims" → fix the PVC / StorageClass first.
  5. "didn't match affinity/selector" → correct the label or nodeSelector.

Frequently Asked Questions

Why is my pod stuck in Pending?

The scheduler couldn't place it on any node. Read the FailedScheduling event — it's usually insufficient CPU/memory (vs the pod's requests), an untolerated taint, or an unbound PersistentVolumeClaim.

What does "Insufficient cpu" mean if my nodes look idle?

Scheduling is based on resource requests, not live usage. A mostly-idle node still can't fit a pod that requests more than its remaining allocatable CPU or memory.

How do I fix a Pending PersistentVolumeClaim?

Make sure a StorageClass exists to provision it — a default one, or one matching the claim. The pod can't schedule until its volume binds.

Put it into practice

Stop reading, start building

This pairs with a hands-on BytExplorer course — do it on your own machine and actually keep the skill.

More in Troubleshooting