Storage Classes and Provisioners
Configure Kubernetes StorageClasses for dynamic volume provisioning. CSI drivers, reclaim policies, volume expansion, topology-aware provisioning.
π‘ Quick Answer: Create StorageClasses with
reclaimPolicy: Retainfor databases (preserves data on PVC deletion),allowVolumeExpansion: truefor growing volumes, andvolumeBindingMode: WaitForFirstConsumerfor topology-aware scheduling. UseRetainfor production,Deletefor dev.
The Problem
The default StorageClass with reclaimPolicy: Delete destroys your data when a PVC is deleted. Without allowVolumeExpansion, you canβt grow volumes without recreating them. And Immediate binding breaks topology-aware scheduling β pods canβt reach volumes provisioned in the wrong zone.
The Solution
Production StorageClass
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: fast-ssd
annotations:
storageclass.kubernetes.io/is-default-class: "true"
provisioner: ebs.csi.aws.com
parameters:
type: gp3
iops: "3000"
throughput: "125"
encrypted: "true"
fsType: ext4
reclaimPolicy: Retain
allowVolumeExpansion: true
volumeBindingMode: WaitForFirstConsumer
mountOptions:
- noatimeStorage Class Comparison
| Purpose | Reclaim | Expansion | Binding | Type |
|---|---|---|---|---|
| Database (prod) | Retain | true | WaitForFirstConsumer | gp3/io2 |
| App cache (prod) | Delete | true | WaitForFirstConsumer | gp3 |
| Dev/test | Delete | true | Immediate | gp3 |
| AI model storage | Retain | true | WaitForFirstConsumer | io2 |
High-Performance AI Storage
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: ai-model-storage
provisioner: ebs.csi.aws.com
parameters:
type: io2
iops: "64000"
encrypted: "true"
reclaimPolicy: Retain
allowVolumeExpansion: true
volumeBindingMode: WaitForFirstConsumerNFS StorageClass (ReadWriteMany)
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: nfs-shared
provisioner: nfs.csi.k8s.io
parameters:
server: nfs.example.com
share: /exports/kubernetes
reclaimPolicy: Retain
mountOptions:
- nfsvers=4.1
- hard
- nconnect=8graph TD
PVC[PVC Request<br/>storageClassName: fast-ssd] --> SC[StorageClass<br/>fast-ssd]
SC -->|WaitForFirstConsumer| SCHED[Pod scheduled<br/>to node in zone-a]
SCHED --> PROV[CSI Driver<br/>provisions volume<br/>in zone-a]
PROV --> PV[PV created<br/>gp3, 3000 IOPS]
PV --> BOUND[PVC Bound β
]
DEL[PVC Deleted] --> RETAIN[PV retained<br/>Data preserved]Common Issues
PVC stuck in Pending
Check events: kubectl describe pvc. Common causes: no CSI driver installed, wrong StorageClass name, or no capacity in the zone.
Volume provisioned in wrong zone β pod canβt mount
Use volumeBindingMode: WaitForFirstConsumer instead of Immediate. This delays provisioning until the pod is scheduled.
Best Practices
Retainfor production data β never lose data on accidental PVC deletionWaitForFirstConsumeralways β ensures volume is in the same zone as the podallowVolumeExpansion: trueβ lets you grow volumes without recreation- Separate StorageClasses for different workloads β databases vs cache vs AI models
- Encrypt all volumes β
encrypted: trueparameter for cloud CSI drivers
Key Takeaways
- StorageClass controls how volumes are dynamically provisioned
reclaimPolicy: Retainpreserves data when PVC is deleted β essential for databasesWaitForFirstConsumerensures volumes are provisioned in the correct topology zoneallowVolumeExpansion: trueenables growing volumes without recreation- Create separate StorageClasses for different performance tiers and workload types

Recommended
Kubernetes Recipes β The Complete Book100+ production-ready patterns with detailed explanations, best practices, and copy-paste YAML. Everything in one place.
Get the Book βLearn by Doing
CopyPasteLearn β Hands-on Cloud & DevOps CoursesMaster Kubernetes, Ansible, Terraform, and MLOps with interactive, copy-paste-run lessons. Start free.
Browse Courses βπ Deepen Your Skills β Hands-on Courses
Courses by CopyPasteLearn.com β Learn IT by Doing
