Skip to content

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

  1. Volume Binding Mode

    volumeBindingMode: WaitForFirstConsumer  # or Immediate
    

  2. Reclaim Policy

    reclaimPolicy: Delete  # or Retain
    

  3. 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

  1. PVC Stuck in Pending

    # Check PVC status
    kubectl describe pvc pvc-name
    
    # Verify storage class exists
    kubectl get storageclass
    

  2. Volume Provisioning Failed

    # Check events
    kubectl get events --field-selector involvedObject.name=pvc-name
    
    # Check cloud provider quotas and limits
    

  3. 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

  1. Implement automated storage management
  2. Set up monitoring and alerts
  3. Create backup and disaster recovery plans
  4. Study advanced storage patterns
  5. Explore CSI drivers