How to Create a Storage Class in Kubernetes¶
This guide explains how to create and use Storage Classes in Kubernetes for dynamic provisioning of persistent volumes.
Prerequisites¶
- Running Kubernetes cluster
- kubectl installed and configured
- Storage provider/provisioner (cloud provider, local storage, etc.)
What is a Storage Class?¶
A StorageClass provides a way to describe the "classes" of storage offered by the cluster. Different classes might map to: - Quality-of-Service levels - Backup policies - Arbitrary policies determined by cluster administrators
Creating Storage Classes¶
Basic Storage Class¶
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: standard
provisioner: kubernetes.io/aws-ebs
parameters:
type: gp2
reclaimPolicy: Delete
allowVolumeExpansion: true
volumeBindingMode: WaitForFirstConsumer
Storage Class with Different Providers¶
1. AWS EBS¶
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: fast
provisioner: kubernetes.io/aws-ebs
parameters:
type: gp3
iops: "3000"
throughput: "125"
2. Azure Disk¶
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: managed-premium
provisioner: kubernetes.io/azure-disk
parameters:
storageaccounttype: Premium_LRS
kind: Managed
3. Google Cloud Persistent Disk¶
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: standard-gcp
provisioner: kubernetes.io/gce-pd
parameters:
type: pd-standard
replication-type: none
Using Storage Classes¶
1. Create PVC with Storage Class¶
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: fast-pvc
spec:
accessModes:
- ReadWriteOnce
storageClassName: fast
resources:
requests:
storage: 10Gi
2. Pod Using PVC with Storage Class¶
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
spec:
containers:
- name: nginx
image: nginx
volumeMounts:
- name: data
mountPath: /data
volumes:
- name: data
persistentVolumeClaim:
claimName: fast-pvc
Storage Class Parameters¶
Common Parameters¶
-
Volume Binding Mode
volumeBindingMode: WaitForFirstConsumer # or Immediate
-
Reclaim Policy
reclaimPolicy: Delete # or Retain
-
Allow Volume Expansion
allowVolumeExpansion: true
Production Examples¶
Multi-tier Storage Setup¶
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: fast-ssd
labels:
environment: production
annotations:
storageclass.kubernetes.io/is-default-class: "false"
provisioner: kubernetes.io/aws-ebs
parameters:
type: gp3
iops: "16000"
throughput: "1000"
encrypted: "true"
reclaimPolicy: Retain
allowVolumeExpansion: true
volumeBindingMode: WaitForFirstConsumer
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: standard-hdd
labels:
environment: production
provisioner: kubernetes.io/aws-ebs
parameters:
type: st1
encrypted: "true"
reclaimPolicy: Delete
allowVolumeExpansion: true
volumeBindingMode: WaitForFirstConsumer
Application Using Multiple Storage Classes¶
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: postgres-ha
spec:
serviceName: postgres
replicas: 3
selector:
matchLabels:
app: postgres
template:
metadata:
labels:
app: postgres
spec:
containers:
- name: postgres
image: postgres:13
volumeMounts:
- name: data
mountPath: /var/lib/postgresql/data
- name: backup
mountPath: /backup
volumeClaimTemplates:
- metadata:
name: data
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: fast-ssd
resources:
requests:
storage: 100Gi
- metadata:
name: backup
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: standard-hdd
resources:
requests:
storage: 500Gi
Best Practices¶
1. Storage Class Design¶
- Create classes for different performance needs
- Consider cost implications
- Plan for scalability
2. Security¶
- Enable encryption
- Use appropriate access modes
- Implement backup strategies
3. Performance¶
- Match storage class to workload requirements
- Monitor storage performance
- Configure appropriate IOPS and throughput
Common Operations¶
Managing Storage Classes¶
# List storage classes
kubectl get storageclass
# Get storage class details
kubectl describe storageclass storage-class-name
# Set default storage class
kubectl patch storageclass storage-class-name -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'
Volume Management¶
# List PVCs using storage class
kubectl get pvc --all-namespaces -o custom-columns=NAME:.metadata.name,STORAGECLASS:.spec.storageClassName
# Check PV provisioning status
kubectl get pv -o custom-columns=NAME:.metadata.name,STORAGECLASS:.spec.storageClassName,STATUS:.status.phase
Troubleshooting¶
Common Issues and Solutions¶
-
PVC Stuck in Pending
# Check PVC status kubectl describe pvc pvc-name # Verify storage class exists kubectl get storageclass
-
Volume Provisioning Failed
# Check events kubectl get events --field-selector involvedObject.name=pvc-name # Check cloud provider quotas and limits
-
Performance Issues
# Monitor storage metrics kubectl top pod pod-name # Check storage class parameters kubectl describe storageclass storage-class-name
Advanced Configurations¶
1. Custom Storage Provisioner¶
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: custom-storage
provisioner: custom.provisioner/nfs
parameters:
server: nfs-server.default.svc.cluster.local
path: /shares
readOnly: "false"
2. Storage Class with Topology¶
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: topology-aware
provisioner: kubernetes.io/aws-ebs
parameters:
type: gp3
allowedTopologies:
- matchLabelExpressions:
- key: topology.kubernetes.io/zone
values:
- us-east-1a
- us-east-1b
Next Steps¶
- Implement automated storage management
- Set up monitoring and alerts
- Create backup and disaster recovery plans
- Study advanced storage patterns
- Explore CSI drivers