StorageClass #

StorageClass adalah resep untuk membuat storage secara dinamis. Tanpa StorageClass, setiap kali developer butuh storage baru, admin harus membuat PersistentVolume secara manual. Dengan StorageClass, PVC yang belum punya PV yang cocok akan otomatis men-trigger pembuatan PV baru — proses yang disebut dynamic provisioning. StorageClass mendefinisikan bagaimana PV itu dibuat: tipe disk apa, di mana, dengan karakteristik apa.

Peran StorageClass #

Tanpa StorageClass (static provisioning):

  Developer buat PVC → Kubernetes cari PV yang cocok
                     → Tidak ada PV? → PVC Pending
                     → Admin harus buat PV manual → PVC Bound

Dengan StorageClass (dynamic provisioning):

  Developer buat PVC → Kubernetes cari PV yang cocok
                     → Tidak ada PV? → Kubernetes panggil provisioner
                     → Provisioner buat PV baru (EBS, GCE PD, dll)
                     → PV tersedia → PVC Bound otomatis

Anatomi Manifest StorageClass #

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: standard-ssd
  annotations:
    storageclass.kubernetes.io/is-default-class: "true"   # jadikan default

provisioner: ebs.csi.aws.com       # CSI driver yang digunakan
reclaimPolicy: Delete              # Retain atau Delete
allowVolumeExpansion: true         # izinkan resize PVC
volumeBindingMode: WaitForFirstConsumer  # atau Immediate

parameters:                        # parameter spesifik provisioner
  type: gp3
  iops: "3000"
  throughput: "125"
  encrypted: "true"

Provisioner #

Provisioner adalah komponen yang benar-benar membuat storage — biasanya berupa CSI driver yang ter-install di cluster. Setiap cloud provider dan storage vendor menyediakan CSI driver mereka sendiri:

Cloud provider CSI drivers:

AWS EBS:          ebs.csi.aws.com
AWS EFS:          efs.csi.aws.com
GCE PD:           pd.csi.storage.gke.io
Azure Disk:       disk.csi.azure.com
Azure Files:      file.csi.azure.com

On-premise / self-managed:

Ceph RBD:         rbd.csi.ceph.com
CephFS:           cephfs.csi.ceph.com
NFS:              nfs.csi.k8s.io
Longhorn:         driver.longhorn.io
OpenEBS:          openebs.io/local
# Lihat StorageClass yang tersedia di cluster
kubectl get storageclass

# Output di cluster GKE:
# NAME                 PROVISIONER          RECLAIMPOLICY   VOLUMEBINDINGMODE    DEFAULT
# premium-rwo          pd.csi.storage.gke.io  Delete        WaitForFirstConsumer
# standard             pd.csi.storage.gke.io  Delete        Immediate           ✓
# standard-rwo         pd.csi.storage.gke.io  Delete        WaitForFirstConsumer

Volume Binding Mode #

volumeBindingMode menentukan kapan PV dibuat dan di-bind ke PVC:

Immediate — PV dibuat dan di-bind segera setelah PVC dibuat, sebelum Pod yang menggunakan PVC dibuat.

Masalah dengan Immediate di cluster multi-zone:

PVC dibuat → PV di-provision di zone ap-southeast-1a
Pod dibuat → dijadwalkan ke Node di zone ap-southeast-1b
→ Pod tidak bisa mount PV yang ada di zone berbeda
→ Pod stuck di Pending dengan error: volume node affinity conflict

WaitForFirstConsumer — PV tidak dibuat sampai ada Pod yang menggunakan PVC tersebut. Kubernetes tahu di zone mana Pod akan dijadwalkan, sehingga PV di-provision di zone yang sama.

Dengan WaitForFirstConsumer:

PVC dibuat → belum ada PV (PVC Pending — ini normal)
Pod dibuat yang menggunakan PVC
Scheduler memilih Node di zone ap-southeast-1b
→ Kubernetes provision PV di zone ap-southeast-1b
→ PVC Bound, Pod bisa mount volume
→ Tidak ada masalah cross-zone
Selalu gunakan WaitForFirstConsumer untuk cluster yang berjalan di beberapa availability zone. Ini mencegah masalah paling umum dalam storage Kubernetes di cloud multi-AZ.

Parameters #

Parameter adalah konfigurasi spesifik untuk setiap provisioner. Tidak ada standar universal — setiap CSI driver punya parameter-nya sendiri yang harus dirujuk dari dokumentasi masing-masing.

# AWS EBS (gp3)
parameters:
  type: gp3
  iops: "3000"
  throughput: "125"
  encrypted: "true"
  kmsKeyId: "arn:aws:kms:..."    # enkripsi dengan KMS key tertentu

# GCE Persistent Disk
parameters:
  type: pd-ssd                   # pd-standard, pd-ssd, pd-balanced
  replication-type: regional-pd  # untuk multi-zone redundancy

# Azure Disk
parameters:
  skuName: Premium_LRS           # Standard_LRS, Premium_LRS, UltraSSD_LRS
  cachingmode: ReadOnly

Default StorageClass #

Cluster bisa punya satu StorageClass yang dijadikan default. PVC yang tidak menyebutkan storageClassName akan otomatis menggunakan StorageClass default:

metadata:
  annotations:
    storageclass.kubernetes.io/is-default-class: "true"
# Ganti StorageClass default
# Hapus annotation default dari StorageClass lama
kubectl annotate storageclass standard \
  storageclass.kubernetes.io/is-default-class-

# Tambahkan annotation default ke StorageClass baru
kubectl annotate storageclass premium-ssd \
  storageclass.kubernetes.io/is-default-class=true

Strategi Multi-StorageClass #

Cluster produksi biasanya punya beberapa StorageClass untuk kebutuhan yang berbeda:

# StorageClass untuk database (performa tinggi)
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: db-storage
provisioner: ebs.csi.aws.com
volumeBindingMode: WaitForFirstConsumer
reclaimPolicy: Retain            # ← Retain untuk database
parameters:
  type: io2
  iops: "10000"                  # IOPS tinggi untuk database

---
# StorageClass untuk aplikasi umum (seimbang)
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: app-storage
  annotations:
    storageclass.kubernetes.io/is-default-class: "true"
provisioner: ebs.csi.aws.com
volumeBindingMode: WaitForFirstConsumer
reclaimPolicy: Delete
parameters:
  type: gp3
  iops: "3000"

---
# StorageClass untuk backup dan arsip (murah)
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: archive-storage
provisioner: ebs.csi.aws.com
volumeBindingMode: WaitForFirstConsumer
reclaimPolicy: Retain
parameters:
  type: sc1                      # cold HDD — murah, untuk throughput besar

Ringkasan #

  • StorageClass = template dynamic provisioning — mendefinisikan bagaimana PV dibuat secara otomatis ketika PVC tidak menemukan PV yang cocok.
  • Provisioner adalah CSI driver — setiap cloud provider dan storage vendor menyediakan driver-nya; harus ter-install di cluster sebelum StorageClass bisa digunakan.
  • WaitForFirstConsumer untuk cluster multi-zone — mencegah PV di-provision di zone yang salah; selalu gunakan mode ini kecuali cluster single-zone.
  • Parameters spesifik per provisioner — tidak ada standar universal; rujuk dokumentasi CSI driver masing-masing untuk parameter yang tersedia.
  • Default StorageClass untuk developer experience — PVC tanpa storageClassName otomatis menggunakan default; pastikan default yang dipilih sesuai untuk mayoritas workload.
  • Multi-StorageClass untuk workload berbeda — database butuh IOPS tinggi dan Retain policy; workload umum bisa pakai gp3 dengan Delete; backup bisa pakai cold storage.

← Sebelumnya: PersistentVolumeClaim   Berikutnya: Database di Kubernetes →

About | Author | Content Scope | Editorial Policy | Privacy Policy | Disclaimer | Contact