Kubernetes PVC Stuck in Pending

A PersistentVolumeClaim that never binds means no StorageClass default, a provisioning gap, or a topology conflict. The PVC's events name the exact reason.

What you'll see

Root causes

No default StorageClass (or none matching)

Your PVC doesn't specify a storageClassName and no default exists. Event: 'storageclass.storage.k8s.io "..." not found'.

Provisioner broken or out of quota/capacity

The CSI driver is down, quota exceeded, or no zone matches the request (topology constraints).

WaitForFirstConsumer waiting for a pod

Volume mode WaitForFirstConsumer deliberately doesn't bind until a pod references the PVC. No pod yet = Pending forever, by design.

Fix it

  1. Read the PVC events — the reason is always there
    kubectl describe pvc <claim> | tail -10
  2. Check what StorageClasses exist and which is default
    kubectl get storageclass
  3. Set an explicit storageClassName in the claim
    spec:
      storageClassName: fast-ssd
      accessModes: ["ReadWriteOnce"]
      resources: { requests: { storage: 10Gi } }
  4. If the provisioner is the issue, check its pod and quotas
    kubectl -n kube-system get pods | grep -E 'csi|provision' && kubectl get quota -A

Field note

Bind failures don't self-heal silently — after fixing the class or driver, delete and recreate the claim. Changing storageClassName on a bound PVC is not allowed, and Kubernetes won't retry a failed bind for you.

Common questions

Why is my PVC stuck Pending?

No StorageClass matches, the provisioner isn't running, or WaitForFirstConsumer is waiting for a pod. kubectl describe pvc shows the exact event: 'no persistent volume available' vs 'waiting for first consumer' vs 'storageclass not found' each route differently.

Do I need a pod for the PVC to bind?

With WaitForFirstConsumer (the sane default), yes: the volume is created only once a pod actually requests it, in the pod's zone. That's a feature — but it means a bare PVC with no consumer sits Pending by design.

Ship it right the first time

Kustomize base with probes, PDBs, and zero-downtime rollouts already wired.

Kubernetes Production Blueprints — $27 →

One-time. Yours to modify. Instant download from the NinjaOps template store.