CKA Road Trip: Pod Pending — Three PV/PVC Bugs¶
database-deployment pods stuck in Pending. The fix required three separate corrections before anything ran.
The Symptom¶
k get pods
# database-deployment-5bd4f5bc58-2gl9m 0/1 Pending 0 4s
k describe pod database-deployment-5bd4f5bc58-2gl9m
# FailedScheduling: pod has unbound immediate PersistentVolumeClaims
Pod never scheduled. No node assigned.
That message is generic — it's the scheduler saying the PVC isn't in Bound state. It doesn't tell you why. The scheduler's only job is placing pods on nodes — it sees an unbound PVC and stops there.
The actual reason lives one level deeper:
k describe pvc postgres-pvc
# Cannot bind to requested volume "postgres-pv": requested PV is too small
# Cannot bind to requested volume "postgres-pv": incompatible accessMode
The diagnostic chain when a pod is Pending with storage:
k describe pod → tells you WHAT (PVC unbound)
k describe pvc → tells you WHY (size / accessMode / name mismatch)
Always go to k describe pvc when you see that message. Pod describe will never give you the PV/PVC detail.
Bug 1 — Wrong PVC name in the deployment¶
The deployment referenced postgres-db-pvc. The actual PVC in the cluster was named postgres-pvc. Kubernetes couldn't find it.
New pod created. Still Pending.
Bug 2 — PV too small¶
k describe pvc postgres-pvc
# Cannot bind to requested volume "postgres-pv": requested PV is too small
PVC requested 150Mi. PV capacity was 100Mi. A PVC cannot bind to a PV smaller than its request.
Still Pending. One more issue.
Bug 3 — Access mode mismatch¶
k describe pvc postgres-pvc
# Cannot bind to requested volume "postgres-pv": incompatible accessMode
PVC was ReadWriteMany. PV was ReadWriteOnce. They must match exactly.
PVCs are mostly immutable — you can't edit accessModes on a live PVC:
Only way out is delete and recreate:
k get pvc postgres-pvc -o yaml > pvc.yml
k delete pvc postgres-pvc --force
# edit pvc.yml: accessModes: ReadWriteMany → ReadWriteOnce
k apply -f pvc.yml
Forcing the pods to pick up the fix¶
Editing the PV or recreating the PVC doesn't restart the pods. The deployment has no way of knowing something changed. Force new pods with:
This patches the deployment with a restart timestamp, triggering a rolling update — old pods terminate, new pods come up and attempt the mount against the now-bound PVC.
The binding rules¶
For a PVC to bind to a PV, three things must align:
storageClassName ← same on both
capacity ← PV must be >= PVC request
accessModes ← must match exactly
All three were wrong here. Check them first whenever a PVC is stuck in Pending.
The Takeaway¶
k describe pvc gives you the exact reason binding failed — not k describe pod. Fix the PV if possible, delete and recreate the PVC if the field is immutable, then rollout restart to force pods to remount.