All Articles

Kubernetes PVC Stuck in Pending — Every Cause and Fix (2026)

Your PersistentVolumeClaim is stuck in Pending and your pod won't start. Here's every reason this happens and exactly how to fix it.

DevOpsBoysApr 11, 20264 min read
Share:Tweet

Your pod won't start. You run kubectl get pvc and see Pending — no volume, no pod. Here's every reason a PVC gets stuck in Pending and exactly how to fix each one.

Quick Diagnosis Checklist

bash
# Check PVC status
kubectl get pvc -n <namespace>
 
# Describe the PVC — the Events section is the key
kubectl describe pvc <pvc-name> -n <namespace>
 
# Check available StorageClasses
kubectl get storageclass
 
# Check existing PVs
kubectl get pv

The Events section in kubectl describe pvc will almost always tell you the exact cause.


Cause 1: No Default StorageClass

Symptom:

Events:
  Warning  ProvisioningFailed  no persistent volumes available for this claim and no storage class is set

Why: Your PVC has no storageClassName and no default StorageClass exists in the cluster.

Fix — check default StorageClass:

bash
kubectl get storageclass
# Look for (default) annotation

Fix — set a default StorageClass:

bash
kubectl patch storageclass gp2 -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'

Fix — specify StorageClass in PVC:

yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-pvc
spec:
  storageClassName: gp2   # ← explicit
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi

Cause 2: StorageClass Provisioner Not Installed

Symptom:

Events:
  Warning  ProvisioningFailed  storageclass.storage.k8s.io "gp3-csi" not found

or provisioner just never responds.

Why: The CSI driver for your StorageClass isn't installed or its pods are crashing.

Fix — check EBS CSI driver on EKS:

bash
kubectl get pods -n kube-system | grep ebs
# Should see: ebs-csi-controller, ebs-csi-node
 
# If missing, install:
eksctl create addon --name aws-ebs-csi-driver --cluster <cluster-name>

Fix — check generic CSI driver:

bash
kubectl get csidrivers
kubectl get pods -n kube-system | grep csi

Cause 3: No Matching PV (Static Provisioning)

Symptom:

Events:
  Normal  FailedBinding  no persistent volumes available for this claim and no storage class is set

Why: You're using static provisioning (pre-created PVs) but no PV matches the PVC's requirements.

PV matching rules:

  • accessModes must match
  • storage size: PV must be >= PVC request
  • storageClassName must match exactly
  • selector labels must match (if set)

Fix — check PV vs PVC:

bash
kubectl get pv
kubectl describe pv <pv-name>
kubectl describe pvc <pvc-name>

Common mismatch — PVC wants ReadWriteMany but PV only supports ReadWriteOnce:

yaml
# PVC
accessModes:
  - ReadWriteMany
 
# PV (EBS only supports RWO)
accessModes:
  - ReadWriteOnce   # ← mismatch!

Fix: Use EFS (AWS) or NFS for ReadWriteMany, not EBS.


Cause 4: Wrong or Missing storageClassName

Symptom: PVC stuck Pending with no events at all.

Why: storageClassName typo — Kubernetes silently waits for a PV with that exact class name.

Fix:

bash
# List real StorageClass names
kubectl get storageclass
 
# Fix PVC (delete and recreate — storageClassName is immutable)
kubectl delete pvc <pvc-name>
# Edit YAML to fix storageClassName
kubectl apply -f pvc.yaml

Cause 5: VolumeBindingMode is WaitForFirstConsumer

Symptom: PVC stays Pending until a pod actually schedules.

Why: StorageClass has volumeBindingMode: WaitForFirstConsumer. This is intentional — the volume is provisioned in the same AZ as the pod.

Check:

bash
kubectl describe storageclass gp3
# Look for: VolumeBindingMode: WaitForFirstConsumer

This is NOT a bug. The PVC will become Bound once a pod using it gets scheduled.

If pod is also Pending (chicken-and-egg), check pod events:

bash
kubectl describe pod <pod-name> -n <namespace>

Cause 6: Insufficient Capacity in the Cloud Provider

Symptom:

Events:
  Warning  ProvisioningFailed  failed to provision volume: InvalidParameterValue: 
  The requested AZ us-east-1a does not have enough capacity

Fix — try different AZ:

yaml
# Use topology constraints in StorageClass
allowedTopologies:
- matchLabelExpressions:
  - key: topology.kubernetes.io/zone
    values:
    - us-east-1b
    - us-east-1c

Or delete and retry — capacity is usually restored quickly.


Cause 7: IAM Permissions Missing (EKS + EBS CSI)

Symptom:

Warning  ProvisioningFailed  failed to provision volume: UnauthorizedOperation: 
You are not authorized to perform this operation.

Fix — EKS: attach IAM policy to node role:

bash
# Check EBS CSI driver addon
eksctl get addon --cluster <cluster> --name aws-ebs-csi-driver
 
# Ensure the service account has the right role
kubectl describe sa ebs-csi-controller-sa -n kube-system

Minimum IAM permissions needed:

json
{
  "Action": [
    "ec2:CreateVolume",
    "ec2:DeleteVolume",
    "ec2:AttachVolume",
    "ec2:DetachVolume",
    "ec2:DescribeVolumes",
    "ec2:DescribeInstances"
  ]
}

Cause 8: PVC Requested Size Too Small

Some StorageClasses have a minimum size. EBS gp3, for example, minimum is 1 GiB but some enterprise storage systems have higher minimums.

Fix: Increase storage request:

yaml
resources:
  requests:
    storage: 5Gi  # bump it up

Cause 9: ResourceQuota Blocking the PVC

Symptom:

Events:
  Warning  ProvisioningFailed  exceeded quota: requests.storage=50Gi

Fix:

bash
kubectl describe resourcequota -n <namespace>
# Check storage limits
 
# If legitimate, increase quota:
kubectl edit resourcequota <quota-name> -n <namespace>

Full Debug Workflow

bash
# Step 1: PVC status
kubectl get pvc -n <namespace>
 
# Step 2: Describe PVC (read Events section carefully)
kubectl describe pvc <pvc-name> -n <namespace>
 
# Step 3: Check StorageClass
kubectl get storageclass
kubectl describe storageclass <classname>
 
# Step 4: Check CSI driver pods
kubectl get pods -n kube-system | grep -E "csi|ebs|efs"
 
# Step 5: Check provisioner logs
kubectl logs -n kube-system -l app=ebs-csi-controller -c csi-provisioner --tail=50

Quick Reference Table

Event MessageCauseFix
no storage class is setNo default StorageClassSet default or specify storageClassName
provisioner not foundCSI driver missingInstall CSI addon
no persistent volumes availableNo matching PVCreate PV or check static provisioning
UnauthorizedOperationIAM missingAttach EBS CSI IAM policy
exceeded quotaResourceQuotaIncrease quota
No events, stays PendingWrong storageClassNameCheck for typo

PVC issues are almost always one of these 9 causes. The kubectl describe pvc Events section will point you to the exact one.

Newsletter

Stay ahead of the curve

Get the latest DevOps, Kubernetes, AWS, and AI/ML guides delivered straight to your inbox. No spam — just practical engineering content.

Related Articles

Comments