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.
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
kubectl describe pod <pod>and read the FailedScheduling reason verbatim.- "Insufficient cpu/memory" → lower
requestsor add a node. - "untolerated taint" → add a toleration or pick another node.
- "unbound PersistentVolumeClaims" → fix the PVC / StorageClass first.
- "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.
Stop reading, start building
This pairs with a hands-on BytExplorer course — do it on your own machine and actually keep the skill.