Active Nerds
Module #9 · intermediate Article

Debugging Pending Pods: Systematic Troubleshooting for Scheduling Blocks

Pending means the scheduler can't find a suitable node — check Events in `kubectl describe pod` for the specific reason: insufficient resources, taint mismat...

5 min read+15 XPPublished 2026-05-01

Quick Answer: Pending means the scheduler can't find a suitable node — check Events in kubectl describe pod for the specific reason: insufficient resources, taint mismatch, node selector mismatch, or unbound PVC.

Detailed Answer:

# Step 1: Get the basic status
kubectl get pod my-pod -n my-namespace -o wide
# STATUS: Pending, NODE: <none> confirms scheduling failure

# Step 2: The most important command — read the Events
kubectl describe pod my-pod -n my-namespace
# Look at the bottom Events section — it will say exactly why

Pending Reasons and Fixes:

# REASON 1: Insufficient resources
# Event: "0/3 nodes are available: 3 Insufficient cpu"
# Fix: Check actual node capacity
kubectl describe nodes | grep -A8 "Allocated resources"
kubectl top nodes
# Solutions: Reduce pod CPU/memory requests, add nodes, or use Karpenter

# REASON 2: Node selector / affinity mismatch
# Event: "0/3 nodes are available: 3 node(s) didn't match node selector"
# Fix: Check what labels your nodes actually have
kubectl get nodes --show-labels
kubectl describe node <node-name> | grep Labels -A20

# Check what your pod is asking for
kubectl get pod my-pod -o jsonpath='{.spec.nodeSelector}'
kubectl get pod my-pod -o jsonpath='{.spec.affinity}'

# Fix: Either fix the nodeSelector to match actual node labels
# OR label the node to match the pod's requirement
kubectl label node node1 disktype=ssd

# REASON 3: Taint/Toleration mismatch
# Event: "0/3 nodes are available: 3 node(s) had untolerated taint"
# Fix: See what taints are on nodes
kubectl describe nodes | grep Taint

# Either add toleration to pod spec:
tolerations:
- key: "dedicated"
  operator: "Equal"
  value: "gpu"
  effect: "NoSchedule"

# OR remove the taint if it shouldn't be there
kubectl taint node node1 dedicated=gpu:NoSchedule-

# REASON 4: PersistentVolumeClaim unbound
# Event: "persistentvolumeclaim my-pvc not found" or "waiting for PVC to bind"
kubectl get pvc -n my-namespace
# STATUS: Pending means no PV matches the claim

kubectl describe pvc my-pvc -n my-namespace
# Check: storageClassName matches existing StorageClass?
# Check: accessMode (RWO/RWX) is supported by the storage backend?
# Check: requested size doesn't exceed available PV?
kubectl get storageclass
kubectl get pv

# REASON 5: No nodes exist (cluster autoscaler not working)
# Event: "0/0 nodes are available"
kubectl get nodes                    # If empty — no worker nodes registered
# On EKS: check node group in AWS console, check IAM roles

# REASON 6: Pod resource request exceeds any single node capacity
# Event: "0/3 nodes are available: 3 Insufficient memory"
# Even if total cluster memory is enough, one node must fit the entire pod
kubectl get pod my-pod -o jsonpath='{.spec.containers[*].resources.requests}'
# If requesting 32Gi memory but largest node is 16Gi → will never schedule

Systematic Troubleshooting Decision Tree:

kubectl describe pod → read Events
         │
         ├── "Insufficient cpu/memory"
         │    └── kubectl top nodes + kubectl describe nodes → scale up or reduce requests
         │
         ├── "didn't match node selector/affinity"
         │    └── kubectl get nodes --show-labels → fix selector or label node
         │
         ├── "had untolerated taint"
         │    └── kubectl describe nodes | grep Taint → add toleration or remove taint
         │
         ├── "unbound PVC" or "PVC not found"
         │    └── kubectl get pvc, kubectl describe pvc → fix StorageClass or create PV
         │
         └── No events at all
              └── Scheduler might be down → kubectl get pods -n kube-system

Common Mistake:

Only looking at kubectl get pod output — the STATUS column alone never tells you WHY it's pending. Always run kubectl describe pod and read the Events section.

Key Takeaway: Pending always means the scheduler can't place the pod — the Events section of kubectl describe pod gives you the exact reason within seconds.


Finished reading?

Mark as complete to claim your +15 XP and track progress.