How to fix storageclass.storage.k8s.io "standard" not found in Kubernetes

KubernetesBEGINNERHIGHUpdated Dec 6, 2025· 125 views

A PersistentVolumeClaim references a StorageClass that doesn't exist in the cluster. This prevents dynamic volume provisioning and leaves PVCs in a Pending state indefinitely. Fix by creating the missing StorageClass or correcting the PVC's storageClassName reference.

Quick fix

Fixes storageclass.storage.k8s.io "standard" not found

kubectl get storageclass
  1. List all available StorageClasses in the cluster
  2. Inspect the failing PVC to see what StorageClass it's requesting
  3. Check if the referenced StorageClass exists
  4. Create the missing StorageClass or fix the PVC manifest
kubernetes — error
kubectl get storageclass
storageclass.storage.k8s.io "standard" not found

What this error means

When Kubernetes encounters a PersistentVolumeClaim (PVC) that references a StorageClass by name, it attempts to use that StorageClass to dynamically provision a PersistentVolume. If the named StorageClass does not exist in the cluster, the provisioning fails. This error is fundamental—without the StorageClass, Kubernetes has no instruction set for how to create the underlying storage (which cloud provider API to call, what parameters to use, etc.). Bare metal and on-premises clusters don't have default StorageClasses, while managed cloud Kubernetes services (EKS, AKS, GKE) typically provide cloud-native ones.

Typical symptoms

  • PersistentVolumeClaim remains in "Pending" state indefinitely
  • kubectl describe pvc shows "StorageClass not found" in events
  • Pod fails to start with "Pod has unbound immediate persistent volume claims"
  • Dynamic volume provisioning fails silently without error messages
  • Deployment or StatefulSet startup hangs waiting for storage to bind

Common causes

  1. PVC manifest references a StorageClass name that doesn't exist in the cluster
  2. StorageClass was deleted but PVCs still reference it by name
  3. Typo in the storageClassName field (e.g., "standard" vs "standard-rwo")
  4. On bare metal clusters, no default StorageClass created during installation
  5. Cloud provider add-ons (AWS EBS CSI, Azure Disk CSI) not deployed to cluster
  6. StorageClass provisioner is incompatible with cluster Kubernetes version

How to fix "storageclass.storage.k8s.io "standard" not found"

1List all available StorageClasses in the cluster

Run this command to see what StorageClasses actually exist:

bash
kubectl get storageclass

If this returns nothing or doesn't include the class your PVC expects, that's the problem.

2Inspect the failing PVC to see what StorageClass it's requesting

Check the PVC specification and recent events:

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

Look at the Storage Class field in the output and the Events section at the bottom.

3Check if the referenced StorageClass exists

If the StorageClass name from the PVC doesn't appear in the list from step 1, it doesn't exist.

For cloud providers, verify the CSI driver pods are running:

bash
kubectl get pods -A | grep -E "(ebs-csi|azure-disk|gce-pd|csi-driver)"
4Create the missing StorageClass or fix the PVC manifest

You have two options:

Option A: Create the StorageClass if it's the right provisioner but missing:

yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: standard
provisioner: kubernetes.io/aws-ebs  # or your cloud provider
parameters:
  type: gp2
  iops: "100"
  volumeBindingMode: Immediate

Then apply it:

bash
kubectl apply -f storageclass.yaml

Option B: Fix the PVC manifest to reference an existing StorageClass:

Edit the PVC YAML and set spec.storageClassName to a name from step 1, or remove the field to use the default StorageClass (if one exists):

yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-pvc
spec:
  storageClassName: standard  # Match an existing class
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi
5For bare metal clusters, deploy a storage solution

Bare metal clusters don't come with storage provisioners. Install one of these options:

Local volumes (simplest, data-local, no HA):

yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: local-storage
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer

NFS (network storage, multi-node access):

Deploy NFS provisioner via Helm:

bash
helm repo add nfs-subdir-external-provisioner https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner/
helm install nfs-provisioner nfs-subdir-external-provisioner/nfs-subdir-external-provisioner \
  --set nfs.server=192.168.1.100 \
  --set nfs.path=/exports

Ceph/Longhorn (distributed storage, HA):

Use Helm charts for production deployments.

6Verify the PVC is now bound

After creating/fixing the StorageClass, the PVC should bind automatically:

bash
kubectl get pvc -n <namespace>

Look for STATUS = Bound instead of Pending. This may take a few seconds. If still Pending, describe the PVC again to check for new errors:

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

Advanced notes

On managed Kubernetes services (EKS, AKS, GKE), StorageClasses are usually auto-created by cloud provider controllers. If missing, install the CSI driver: AWS EBS CSI (aws-ebs-csi-driver Helm chart), Azure Disk CSI (azure-csi-disk Helm chart), or GCP PD CSI. For mixed-cloud or multi-region deployments, use volumeBindingMode: WaitForFirstConsumer in StorageClass to ensure PVs provision in the same availability zone as the pod. On Helm deployments, use --set persistence.storageClass=<name> to override the default storage class during installation. Note that some legacy provisioners (kubernetes.io/aws-ebs, kubernetes.io/gce-pd) are deprecated; use CSI drivers instead.

Frequently asked questions

What does "storageclass.storage.k8s.io "standard" not found" mean?
When Kubernetes encounters a PersistentVolumeClaim (PVC) that references a StorageClass by name, it attempts to use that StorageClass to dynamically provision a PersistentVolume. If the named StorageClass does not exist in the cluster, the provisioning fails. ).
How do I fix "storageclass.storage.k8s.io "standard" not found"?
A PersistentVolumeClaim references a StorageClass that doesn't exist in the cluster. This prevents dynamic volume provisioning and leaves PVCs in a Pending state indefinitely. Fix by creating the missing StorageClass or correcting the PVC's storageClassName reference.
What causes "storageclass.storage.k8s.io "standard" not found"?
PVC manifest references a StorageClass name that doesn't exist in the cluster StorageClass was deleted but PVCs still reference it by name Typo in the storageClassName field (e.g., "standard" vs "standard-rwo")
Is the "storageclass.storage.k8s.io "standard" not found" error serious?
Yes. This is a high-severity error that usually blocks work until it is fixed, but the steps above resolve it.

Official resources & further reading