Troubleshooting Pending PersistentVolumeClaims
Diagnose and fix PVCs stuck in Pending status. Learn common causes including StorageClass issues, capacity problems, and node affinity conflicts with step-by-step solutions.
💡 Quick Answer: PVC stuck in Pending? Run
kubectl describe pvc <name>and check Events. Common causes: no matching StorageClass (kubectl get sc), no available PV for static provisioning, insufficient storage capacity, or volume node affinity conflict. For dynamic provisioning, ensure your cloud provider’s CSI driver is installed and StorageClass hasprovisionerset correctly.
The Problem
Your PersistentVolumeClaim is stuck in Pending status and your pods can’t start because they’re waiting for storage.
Quick Diagnosis
# Check PVC status
kubectl get pvc
# Get detailed info including events
kubectl describe pvc <pvc-name>Look at the Events section for clues about why it’s pending.
Common Causes and Fixes
1. No Default StorageClass
Symptoms:
Events:
Warning ProvisioningFailed no persistent volumes available for this claim and no storage class is setDiagnosis:
# Check if any StorageClass exists and which is default
kubectl get storageclass
# Output shows no (default) marker:
# NAME PROVISIONER RECLAIMPOLICY
# standard kubernetes.io/gce-pd DeleteFix: Set a default StorageClass:
kubectl patch storageclass standard -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'Or specify the StorageClass in your PVC:
spec:
storageClassName: standard2. StorageClass Doesn’t Exist
Symptoms:
Events:
Warning ProvisioningFailed storageclass.storage.k8s.io "fast-ssd" not foundFix: List available StorageClasses and use one that exists:
kubectl get storageclass3. Volume Binding Mode: WaitForFirstConsumer
Symptoms:
Status: Pending
Events: <none>No events, PVC just sits in Pending.
Diagnosis:
kubectl get storageclass <storageclass-name> -o yaml | grep volumeBindingMode
# volumeBindingMode: WaitForFirstConsumerExplanation: This is actually normal! The PVC won’t provision until a Pod references it. The volume will be provisioned in the same zone as the Pod.
Fix: Create a Pod that uses the PVC, then it will provision.
4. Insufficient Storage Capacity
Symptoms:
Events:
Warning ProvisioningFailed failed to provision volume: googleapi: Error 403: Quota 'SSD_TOTAL_GB' exceededDiagnosis:
# Check current storage usage (cloud provider specific)
# For GCP:
gcloud compute disks list --format="table(name,sizeGb,zone)"Fix:
- Request less storage
- Delete unused PVCs/PVs
- Request quota increase from cloud provider
5. No Available Persistent Volumes (Static Provisioning)
Symptoms:
Events:
Warning ProvisioningFailed no persistent volumes available for this claimDiagnosis: You’re using static provisioning but no matching PV exists.
# Check available PVs
kubectl get pv
# Check if any PV matches your PVC requirements
kubectl get pv -o custom-columns=NAME:.metadata.name,CAPACITY:.spec.capacity.storage,ACCESS:.spec.accessModes,STATUS:.status.phase,CLAIM:.spec.claimRef.nameFix: Create a matching PV:
apiVersion: v1
kind: PersistentVolume
metadata:
name: my-pv
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
storageClassName: "" # Empty for static provisioning
hostPath:
path: /data/my-pv6. Access Mode Mismatch
Symptoms:
Warning ProvisioningFailed no persistent volumes available for this claimDiagnosis: Your PVC requests an access mode the storage doesn’t support.
# Check what access modes your StorageClass supports
kubectl get storageclass <name> -o yamlExample: EBS volumes only support ReadWriteOnce, not ReadWriteMany.
Fix: Use a supported access mode:
spec:
accessModes:
- ReadWriteOnce # Instead of ReadWriteMany7. Node Affinity Conflict
Symptoms:
Warning ProvisioningFailed node(s) didn't match node selectorDiagnosis: Zonal storage can’t be attached to pods in different zones.
# Check which zone the PV was created in
kubectl get pv <pv-name> -o yaml | grep -A5 nodeAffinityFix:
- Use
volumeBindingMode: WaitForFirstConsumerto provision in the pod’s zone - Use regional storage if available (GKE regional PD, etc.)
8. CSI Driver Not Installed
Symptoms:
Warning ProvisioningFailed driver name ebs.csi.aws.com not foundDiagnosis:
# Check installed CSI drivers
kubectl get csidriversFix: Install the required CSI driver:
# Example: AWS EBS CSI Driver
kubectl apply -k "github.com/kubernetes-sigs/aws-ebs-csi-driver/deploy/kubernetes/overlays/stable/?ref=release-1.24"Debugging Workflow
Step 1: Get PVC Details
kubectl describe pvc <pvc-name>Step 2: Check Events
kubectl get events --field-selector involvedObject.name=<pvc-name>Step 3: Check StorageClass
kubectl get storageclass
kubectl describe storageclass <class-name>Step 4: Check Provisioner Pods
# For CSI drivers, check the controller pods
kubectl get pods -n kube-system | grep csi
# Check logs
kubectl logs -n kube-system <csi-controller-pod> -c csi-provisionerStep 5: Check Cluster Capacity
# Check node storage
kubectl describe nodes | grep -A5 "Allocatable"Quick Reference Table
| Error Message | Likely Cause | Quick Fix |
|---|---|---|
| no storage class | No default SC | Set default or specify SC |
| storageclass not found | Wrong SC name | List SCs, use existing one |
| quota exceeded | Disk quota | Reduce size or request quota |
| no PV available | Static provisioning | Create matching PV |
| access mode | Incompatible mode | Use ReadWriteOnce |
| driver not found | CSI not installed | Install CSI driver |
| no events | WaitForFirstConsumer | Create pod that uses PVC |
Summary
When debugging Pending PVCs:
- Always start with
kubectl describe pvc - Check the Events section for error messages
- Verify StorageClass exists and is correctly configured
- Check for capacity/quota issues
- Verify CSI drivers are installed
- Consider volumeBindingMode behavior
References
📘 Go Further with Kubernetes Recipes
Love this recipe? There’s so much more! This is just one of 100+ hands-on recipes in our comprehensive Kubernetes Recipes book.
Inside the book, you’ll master:
- ✅ Production-ready deployment strategies
- ✅ Advanced networking and security patterns
- ✅ Observability, monitoring, and troubleshooting
- ✅ Real-world best practices from industry experts
“The practical, recipe-based approach made complex Kubernetes concepts finally click for me.”
👉 Get Your Copy Now — Start building production-grade Kubernetes skills today!
📘 Get All 100+ Recipes in One Book
Stop searching — get every production-ready pattern with detailed explanations, best practices, and copy-paste YAML.
Want More Kubernetes Recipes?
This recipe is from Kubernetes Recipes, our 750-page practical guide with hundreds of production-ready patterns.