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.
WaitForFirstConsumeruntuk 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
storageClassNameotomatis 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 →