PVC Pending: When Storage Never Binds
Pod stuck in Pending with volume unbound? Trace StorageClass, capacity, access modes, and provisioner health before blaming the scheduler.
The app team opens a ticket: "New pods won't schedule."
kubectl get pod worker-0 -n dataNAME READY STATUS RESTARTS AGE
worker-0 0/1 Pending 0 12mkubectl describe pod worker-0 -n data | grep -A2 EventsWarning FailedScheduling ... pod has unbound immediate PersistentVolumeClaimsThe scheduler is waiting on storage, not CPU.
Check the PVC
kubectl get pvc -n dataNAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
data-worker Pending fast-ssd 12mPending PVC means no PersistentVolume is bound yet.
Trace the binding chain
StorageClass exists?
kubectl get storageclass fast-ssdTypo in
storageClassName→ PVC waits forever.Dynamic provisioner running?
For cloud or CSI drivers, check the provisioner/controller pods in
kube-systemor the driver namespace. A dead provisioner leaves PVCs Pending.Pre-provisioned PV available?
If not using dynamic provisioning, you need a matching PV:
kubectl get pvMatch capacity, accessModes (RWO vs RWX), and storageClassName.
Multi-attach conflict
RWO volumes attach to one node. A second Pod using the same claim on another node stays Pending — check
volumeModeand access mode in exam and production scenarios.
Pod vs PVC order
volumeClaimTemplates on StatefulSets create PVCs automatically. Standalone Pods need the PVC Bound before the Pod can schedule (for volumeBindingMode: WaitForFirstConsumer, the order differs — the PVC may stay Pending until a Pod is scheduled that uses it).
Read the StorageClass volumeBindingMode — Immediate vs WaitForFirstConsumer changes what you inspect first.
Fix order
kubectl get pvc,pv,sc -n <ns>kubectl describe pvc <name>→ Events from the provisioner- Confirm StorageClass and access modes match the workload
- Fix provisioner, create PV, or correct the claim spec
- Re-check Pod Events — scheduling should proceed once Bound
Practice
Storage & Volumes on Decision Trainer covers PVC Pending, mount failures, and multi-attach — with runbook ordering so you check binding before restarting kubelet or deleting nodes.