How to fix Pod Pending in Kubernetes

KubernetesINTERMEDIATEHIGHUpdated Dec 6, 2025ยท 207 views

Pods stuck in Pending status cannot be scheduled to any node. Check for insufficient resources, unbound PersistentVolumeClaims, node selectors, taints/tolerations, or affinity rules.

Quick fix

Fixes Pod Pending

kubectl describe pod <pod-name>
  1. Check scheduling failure reason
  2. Check node resources
  3. Fix PersistentVolumeClaim issues
  4. Review node selectors and affinity
kubernetes โ€” error
kubectl describe pod <pod-name>
Pod Pending

What this error means

A pod in Pending status has been accepted by Kubernetes but cannot be scheduled onto a node. The scheduler is unable to find a suitable node that satisfies all the pod's requirements. Pending is often a transient state during normal operation, but pods stuck in Pending indicate a scheduling problem. The issue could be cluster-wide (no nodes have enough resources) or pod-specific (constraints like node selectors or affinity rules cannot be satisfied).

Typical symptoms

  • Pod status shows Pending indefinitely
  • Events show FailedScheduling with constraint details
  • kubectl describe pod shows 0/N nodes are available
  • Deployments show unavailable replicas
  • New pods cannot start while existing pods run fine
  • Pods pending after cluster scaling or node maintenance

Common causes

  1. Insufficient CPU or memory resources on available nodes
  2. PersistentVolumeClaim not bound to a PersistentVolume
  3. Node selector does not match any node labels
  4. Pod affinity or anti-affinity rules cannot be satisfied
  5. Node taints without matching tolerations in pod spec
  6. All nodes cordoned or marked unschedulable
  7. HostPort conflict with existing pod on target nodes
  8. Missing storage class for dynamic volume provisioning

How to fix "Pod Pending"

1Check scheduling failure reason

Get the specific reason the pod cannot be scheduled:

bash
kubectl describe pod <pod-name>

Look at the Events section for messages like:
- "0/3 nodes are available: 3 Insufficient cpu"
- "0/3 nodes are available: 3 node(s) didn't match Pod's node affinity"
- "0/3 nodes are available: 3 node(s) had taint {key: value}"
- "pod has unbound immediate PersistentVolumeClaims"

2Check node resources

If the issue is insufficient resources:

bash
# View node capacity and allocations
kubectl describe nodes | grep -A 5 "Allocated resources"

# Check actual usage
kubectl top nodes

# View what's consuming resources
kubectl top pods --all-namespaces --sort-by=memory

Solutions:
- Reduce pod resource requests
- Add more nodes to the cluster
- Delete unused pods to free resources

3Fix PersistentVolumeClaim issues

If the pod needs storage:

bash
# Check PVC status
kubectl get pvc

# If PVC is Pending, check why
kubectl describe pvc <pvc-name>

Common fixes:
- Create a matching PersistentVolume
- Install the CSI driver (AWS EBS, GCE PD, Azure Disk)
- Fix storage class name in PVC
- Ensure storage class allows dynamic provisioning

4Review node selectors and affinity

Check if the pod has scheduling constraints:

bash
kubectl get pod <pod-name> -o yaml | grep -A 10 nodeSelector
kubectl get pod <pod-name> -o yaml | grep -A 20 affinity

Verify nodes have matching labels:

bash
kubectl get nodes --show-labels

Fix by either:
- Adding required labels to nodes
- Removing or adjusting nodeSelector/affinity in pod spec

5Check taints and tolerations

View node taints:

bash
kubectl describe nodes | grep Taints

If nodes are tainted, pods need matching tolerations:

yaml
tolerations:
- key: "dedicated"
  operator: "Equal"
  value: "app"
  effect: "NoSchedule"

To remove a taint from a node:

bash
kubectl taint nodes <node-name> key:NoSchedule-
6Uncordon nodes if necessary

Check if nodes are cordoned (unschedulable):

bash
kubectl get nodes
# Look for SchedulingDisabled status

Uncordon to allow scheduling:

bash
kubectl uncordon <node-name>

Also check for node conditions:

bash
kubectl describe node <node-name> | grep Conditions -A 10

Nodes with DiskPressure, MemoryPressure, or PIDPressure won't accept new pods.

Advanced notes

For persistent Pending issues, use the scheduler's verbose output:

bash
kubectl get events --field-selector reason=FailedScheduling

HostPort scheduling: Pods using hostPort can only run one instance per node per port. This limits scheduling significantly. Prefer Services with NodePort instead.

Resource fragmentation: A cluster may have enough total resources but no single node can fit the pod. Consider:
- Reducing resource requests
- Using pod priority and preemption
- Enabling cluster autoscaler

For development clusters, the "LimitRange" or "ResourceQuota" objects may restrict pod creation even when nodes have capacity. Check namespace quotas:

bash
kubectl get resourcequota -n <namespace>
kubectl get limitrange -n <namespace>

Frequently asked questions

What does "Pod Pending" mean?
A pod in Pending status has been accepted by Kubernetes but cannot be scheduled onto a node. The scheduler is unable to find a suitable node that satisfies all the pod's requirements. Pending is often a transient state during normal operation, but pods stuck in Pending indicate a scheduling problem.
How do I fix "Pod Pending"?
Pods stuck in Pending status cannot be scheduled to any node. Check for insufficient resources, unbound PersistentVolumeClaims, node selectors, taints/tolerations, or affinity rules.
What causes "Pod Pending"?
Insufficient CPU or memory resources on available nodes PersistentVolumeClaim not bound to a PersistentVolume Node selector does not match any node labels
Is the "Pod Pending" error serious?
Yes. This is a high-severity error that usually blocks work until it is fixed, but the steps above resolve it.

Official resources & further reading