Kubernetes tidak secara otomatis mengetahui disk cloud mana yang harus disediakan untuk suatu workload—Anda harus mendefinisikan StorageClass yang memetakan tipe disk dan preferensi zona, lalu mereferensikannya dalam persistent volume claim (PVC). Saat PVC dibuat, Disk-Controller akan secara otomatis menyediakan disk tersebut dan mengikatnya sebagai persistent volume (PV).
Prasyarat
Sebelum memulai, pastikan Anda telah memiliki:
-
Kluster ACK yang sedang berjalan dengan kubectl yang telah dikonfigurasi
-
Izin untuk membuat sumber daya StorageClass dan PVC di kluster
StorageClass Bawaan
Kluster single-zone mencakup StorageClass berikut secara bawaan. Kluster multi-zona mengharuskan Anda membuat StorageClass secara manual untuk menentukan zona target.
| StorageClass | Tipe disk | Paling cocok untuk |
|---|---|---|
alicloud-disk-efficiency |
Ultra disk | Workload yang sensitif terhadap biaya dengan kebutuhan I/O moderat |
alicloud-disk-ssd |
Standard SSD | Workload tujuan umum yang memerlukan performa andal |
alicloud-disk-essd |
Enhanced SSD (ESSD) | Workload produksi berlatensi rendah dan throughput tinggi |
alicloud-disk-available |
Mode high-availability | Workload di mana ketersediaan disk lebih diprioritaskan daripada tipe disk |
alicloud-disk-topology |
Mode WaitForFirstConsumer | Kluster multi-zona di mana penjadwalan pod menentukan zona disk |
Untuk alicloud-disk-available, sistem mencoba membuat standard SSD terlebih dahulu, lalu menggunakan ultra disk jika sumber daya SSD habis. Untuk versi Disk-Controller sebelum v1.14.8.44-c23b62c5-aliyun, urutan fallback-nya adalah: enhanced SSD (ESSD) → standard SSD → ultra disk.
Buat StorageClass
Pilih tipe StorageClass berdasarkan konfigurasi kluster Anda:
-
Kluster single-zone atau disk zona tetap: Buat StorageClass dengan ID zona
-
Kluster multi-zona: Buat StorageClass dalam mode WaitForFirstConsumer
Buat StorageClass dengan ID zona
Gunakan pendekatan ini untuk kluster single-zone atau saat Anda ingin menetapkan pembuatan disk ke zona tertentu.
-
Buat file bernama
storage-class.yamldengan konten berikut:kind: StorageClass apiVersion: storage.k8s.io/v1 metadata: name: alicloud-disk-ssd-hangzhou-b provisioner: alicloud/disk parameters: type: cloud_ssd regionId: cn-hangzhou zoneId: cn-hangzhou-b reclaimPolicy: Retain # Default is Delete. Set to Retain to prevent accidental data loss.Tabel berikut menjelaskan parameter tersebut:
Parameter Deskripsi Wajib Default provisionerPlugin volume untuk menyediakan disk. Atur ke alicloud/disk.Ya — typeTipe disk. Nilai yang valid: cloud_efficiency(ultra disk),cloud_ssd(standard SSD),cloud_essd(ESSD),available(mode high-availability yang secara otomatis memilih tipe terbaik yang tersedia).Ya — regionIdWilayah tempat disk dibuat. Ya — zoneIdZona tempat disk dibuat. Untuk kluster multi-zona, tentukan beberapa zona yang dipisahkan koma: cn-hangzhou-a,cn-hangzhou-b,cn-hangzhou-c.Ya — reclaimPolicyKebijakan untuk menarik kembali disk saat PVC dihapus. Retainmenyimpan disk;Deletemenghapusnya. Atur keRetainuntuk mencegah kehilangan data.Tidak DeleteencryptedApakah disk dienkripsi atau tidak. Tidak false -
Terapkan StorageClass:
kubectl apply -f storage-class.yaml -
Verifikasi bahwa StorageClass telah dibuat:
kubectl get storageclass alicloud-disk-ssd-hangzhou-bOutput harus menampilkan StorageClass dengan
alicloud/disksebagai provisioner.
Buat StorageClass dalam mode WaitForFirstConsumer
Pada kluster multi-zona, PV dapat disediakan sebelum Pod dijadwalkan—sehingga disk ditempatkan di zona yang berbeda dari tempat Pod akhirnya berjalan. Jika hal ini terjadi, Pod gagal dimulai karena tidak dapat menyambungkan disk dari zona lain. Mode WaitForFirstConsumer mengatasi masalah ini dengan menunda penyediaan disk hingga Pod yang mengonsumsi telah dijadwalkan, sehingga disk selalu dibuat di zona yang sama dengan Pod tersebut.
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: alicloud-disk-topology-ssd
provisioner: alicloud/disk
parameters:
type: cloud_ssd
reclaimPolicy: Retain # Default is Delete.
volumeBindingMode: WaitForFirstConsumer
Terapkan StorageClass:
kubectl apply -f storage-class-topology.yaml
Cara pemilihan zona bekerja—tabel berikut merangkum perilaku penempatan disk berdasarkan konfigurasi StorageClass Anda:
| Konfigurasi | Penempatan disk |
|---|---|
Tanpa zoneId, tanpa WaitForFirstConsumer |
Zona tempat komponen Disk-Controller dideploy |
zoneId ditentukan, tanpa WaitForFirstConsumer |
Zona yang ditentukan, dipilih secara round-robin |
WaitForFirstConsumer diaktifkan |
Zona node tempat pod yang mengonsumsi dijadwalkan |
Buat PVC dan Pod
Manifes berikut membuat PVC yang didukung oleh StorageClass alicloud-disk-ssd-hangzhou-b dan Pod yang memasang disk tersebut:
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: disk-ssd
spec:
accessModes:
- ReadWriteOnce
storageClassName: alicloud-disk-ssd-hangzhou-b
resources:
requests:
storage: 20Gi
---
kind: Pod
apiVersion: v1
metadata:
name: disk-pod-ssd
spec:
containers:
- name: disk-pod
image: nginx
volumeMounts:
- name: disk-pvc
mountPath: "/mnt"
restartPolicy: "Never"
volumes:
- name: disk-pvc
persistentVolumeClaim:
claimName: disk-ssd
Terapkan manifes:
kubectl apply -f pvc-pod.yaml
Verifikasi bahwa PVC telah terikat dan Pod sedang berjalan:
kubectl get pvc disk-ssd
kubectl get pod disk-pod-ssd
PVC yang berhasil terikat menampilkan STATUS: Bound. Pod yang sedang berjalan menampilkan STATUS: Running.
Buat StatefulSet multi-instans
Gunakan volumeClaimTemplates untuk membuat PVC dan PV terpisah secara dinamis untuk setiap replika StatefulSet. Contoh berikut membuat StatefulSet nginx dua replika dengan disk 20 GiB per replika:
apiVersion: v1
kind: Service
metadata:
name: nginx
labels:
app: nginx
spec:
ports:
- port: 80
name: web
clusterIP: None
selector:
app: nginx
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: web
spec:
selector:
matchLabels:
app: nginx
serviceName: "nginx"
replicas: 2
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
name: web
volumeMounts:
- name: disk-ssd
mountPath: /data
volumeClaimTemplates:
- metadata:
name: disk-ssd
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: "alicloud-disk-ssd-hangzhou-b"
resources:
requests:
storage: 20Gi
Terapkan manifes:
kubectl apply -f statefulset.yaml
Verifikasi bahwa StatefulSet, Pod, dan PVC semuanya telah dibuat:
kubectl get statefulset web
kubectl get pods -l app=nginx
kubectl get pvc -l app=nginx
Setiap Pod (web-0, web-1) mendapatkan PVC-nya sendiri (disk-ssd-web-0, disk-ssd-web-1), masing-masing didukung oleh disk yang disediakan secara independen.