Main Causes of Pod Pending Status
When Scheduling to a Node is Impossible #
Specific Causes
- CPU/memory request values are larger than the node's available capacity.
- No node matches the nodeSelector or affinity conditions.
- The node has taints applied, and the pod does not have tolerations configured.
Solutions
- Check CPU/memory availability with
kubectl describe nodeand adjust requests. - Remove or relax overly restrictive nodeSelector or affinity configurations.
- Add tolerations if you intend to schedule pods on tainted nodes.
- If necessary, it's often easier to simply increase the number of schedulable nodes through scale-out.
When Image Pull is Impossible #
- Incorrect image or tag
- Private registry authentication failed
- Registry network timeout
Solutions
- Check for ErrImagePull, ImagePullBackOff in
kubectl describe podevents. - Verify image path and tag location (this can be tricky if you hit it ;)).
- If it's a private registry,
imagePullSecretmust be configured. - If it's a network issue, try pinging and curling the registry from within the cluster.
PVC Binding Failure #
- StorageClass requested by PVC does not exist.
- PV capacity/access mode mismatch.
- Provisioning delayed due to EBS/CSI controller error.
Solutions
- Check if the status is 'Bound' with
kubectl get pvc -n ns. - Specify the correct StorageClass name.
- Verify that AccessMode matches the PV.
- In an EKS/EBS environment, check the CSI driver status.
kubectl get pods- n kube-system | grep csi
When using EBS in EKS, the EBS CSI Driver is responsible for actually creating EBS volumes and attaching/mounting PVs to pods, so check if it's experiencing issues.
CSI = Container Storage Interface The standard interface Kubernetes uses to attach external storage (e.g., AWS EBS, NFS, Ceph, iSCSI, etc.).
Namespace ResourceQuota or LimitRange Conflicts #
- Total CPU/memory allowed by the namespace exceeded.
- Pod's request/limit values do not align with LimitRange.
Solutions
- Check for exceeding limits with
kubectl describe quota -n <ns>. - Adjust Pod requests/limits to be within the quota/limitrange.
- Clean up pods consuming unnecessary resources.
LimitRange enforces maximum and minimum request-limit rules that pod containers must adhere to within a namespace; if these are not met, pod creation will fail.
ResourceQuota limits resource usage for an entire namespace, including total CPU/memory, number of PVCs, and number of pods.
It's helpful to distinguish between 'per-pod' and 'per-namespace' units.