Untuk aplikasi stateful seperti database dan message queue, StatefulSet Kubernetes menggunakan field volumeClaimTemplates untuk secara dinamis membuat dan memasang Persistent Volume Claim (PVC) khusus ke setiap pod. PVC tersebut kemudian terikat pada Persistent Volume (PV) yang independen. Saat sebuah pod dibuat ulang atau dijadwalkan ulang, PVC akan secara otomatis memasang kembali PV aslinya untuk memastikan persistensi data dan kelangsungan layanan.
Berikut adalah contoh konfigurasi volumeClaimTemplates:
apiVersion: apps/v1
kind: StatefulSet
# ...
spec:
# ...
volumeClaimTemplates:
- metadata:
name: data-volume # Nama template PVC
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: "alicloud-disk-essd" # Tentukan tipe penyimpanan
resources:
requests:
storage: 20Gi # Kapasitas penyimpanan yang dimintaCara kerjanya
Pembuatan dan scale-out
Selama pembuatan awal atau scale-out, controller StatefulSet akan menggunakan
volumeClaimTemplatesuntuk membuat dan mengikatkan PVC dengan nama unik ke setiap replika pod. PVC diberi nama sesuai pola[template-name]-[pod-name]. Sebagai contoh, jika template diberi namadata-volume, controller akan membuat PVC bernamadata-volume-web-0dandata-volume-web-1untuk podweb-0danweb-1, sehingga menciptakan pemetaan yang stabil antara pod dan penyimpanannya.Berdasarkan parameter dalam templat (seperti
storageClassName,storage, danaccessModes), Container Storage Interface (CSI) akan secara otomatis membuat PV yang sesuai dengan tipe, ukuran, dan mode akses yang ditentukan, lalu mengikat dan memasang PV tersebut.Scale-in
Saat StatefulSet di-scale-in, controller hanya menghapus pod tersebut. PVC dan PV yang terkait tetap dipertahankan untuk melindungi data.
Penskalaan ulang dan pemulihan kegagalan
Saat Anda melakukan scale-out ulang (menambah jumlah replika) atau selama pemulihan dari kegagalan (pod dihapus dan dibuat ulang), controller akan secara otomatis menemukan dan menggunakan kembali PVC sebelumnya dipertahankan dengan nama yang sama.
Jika PVC tersedia, pod baru dengan nama yang sama akan secara otomatis me-mount PV yang ada, memungkinkan pemulihan status dan datanya dengan cepat.
Jika PVC tidak tersedia, misalnya, jika operasi scale-out melampaui jumlah replika puncak sebelumnya, PVC baru dan PV yang sesuai akan dibuat berdasarkan templat.
Langkah 1: Deploy StatefulSet dengan persistent storage
Contoh ini men-deploy sebuah Service dan StatefulSet dengan dua replika. StatefulSet menggunakan volumeClaimTemplates untuk membuat cloud disk sebesar 20 GiB secara otomatis untuk setiap replika.
Buat file bernama
statefulset.yaml.Tabel berikut menjelaskan parameter dalam
volumeClaimTemplates:Parameter
Deskripsi
accessModesMode akses volume.
ReadWriteOnceberarti volume dapat di-mount sebagai read-write oleh satu node dalam satu waktu.storageClassNameNama StorageClass yang akan digunakan.
alicloud-disk-essdadalah StorageClass default yang disediakan oleh Container Service for Kubernetes (ACK) untuk membuat Enterprise SSD (ESSD) dengan performance level (PL) default PL1Disk ini menggunakan tagihan pay-as-you-go. Untuk informasi lebih lanjut, lihat Penagihan block storage dan Harga block storage.
storageKapasitas volume disk.
Deploy StatefulSet.
kubectl create -f statefulset.yamlVerifikasi bahwa pod sedang berjalan.
kubectl get pod -l app=nginxPeriksa PVC untuk memverifikasi bahwa sistem telah membuat dan mengikatkan PVC yang sesuai untuk setiap pod secara otomatis:
kubectl get pvcOutput yang diharapkan:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE disk-essd-web-0 Bound d-m5eb5ozeseslnz7zq54b 20Gi RWO alicloud-disk-essd <unset> 3m31s disk-essd-web-1 Bound d-m5ecrvjrhqwehgzqpk5i 20Gi RWO alicloud-disk-essd <unset> 48s
Langkah 2: Validasi storage lifecycle
Amati pembuatan, retensi, dan penggunaan kembali PVC melalui operasi scale-out, scale-in, lalu scale-out ulang.
Scale-out aplikasi
Tingkatkan jumlah replika StatefulSet menjadi 3.
kubectl scale sts web --replicas=3Verifikasi bahwa pod sedang berjalan.
kubectl get pod -l app=nginxPeriksa PVC untuk memverifikasi bahwa sistem telah secara otomatis membuat pod
web-2dan PVCdisk-essd-web-2yang terkait.kubectl get pvcOutput yang diharapkan:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE disk-essd-web-0 Bound d-m5eb5ozeseslnz7zq54b 20Gi RWO alicloud-disk-essd <unset> 4m1s disk-essd-web-1 Bound d-m5ecrvjrhqwehgzqpk5i 20Gi RWO alicloud-disk-essd <unset> 78s disk-essd-web-2 Bound d-m5ee2cvzx4dog1lounjn 20Gi RWO alicloud-disk-essd <unset> 16s
Scale-in aplikasi
Kurangi jumlah replika StatefulSet menjadi 2.
kubectl scale sts web --replicas=2Verifikasi bahwa pod sedang berjalan.
kubectl get pod -l app=nginxPeriksa PVC.
kubectl get pvcOutput yang diharapkan:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE disk-essd-web-0 Bound d-m5eb5ozeseslnz7zq54b 20Gi RWO alicloud-disk-essd <unset> 4m21s disk-essd-web-1 Bound d-m5ecrvjrhqwehgzqpk5i 20Gi RWO alicloud-disk-essd <unset> 98s disk-essd-web-2 Bound d-m5ee2cvzx4dog1lounjn 20Gi RWO alicloud-disk-essd <unset> 36sPada titik ini, pod
web-2telah dihapus, tetapi PVCdisk-essd-web-2masih ada untuk memastikan persistensi data.
Scale-out aplikasi lagi
Tingkatkan jumlah replika StatefulSet kembali menjadi 3.
kubectl scale sts web --replicas=3Verifikasi bahwa pod sedang berjalan.
kubectl get pod -l app=nginxPeriksa PVC.
kubectl get pvcOutput yang diharapkan:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE disk-essd-web-0 Bound d-m5eb5ozeseslnz7zq54b 20Gi RWO alicloud-disk-essd <unset> 4m50s disk-essd-web-1 Bound d-m5ecrvjrhqwehgzqpk5i 20Gi RWO alicloud-disk-essd <unset> 2m7s disk-essd-web-2 Bound d-m5ee2cvzx4dog1lounjn 20Gi RWO alicloud-disk-essd <unset> 65sPod
web-2yang baru dibuat secara otomatis menggunakan kembalidisk-essd-web-2yang sebelumnya dipertahankan..
Langkah 3: Validasi persistensi data setelah kegagalan pod
Verifikasi bahwa data tetap ada di disk setelah pod dibuat ulang dengan cara menulis data ke pod, menghapus pod tersebut, lalu memeriksa kembali datanya.
Tulis data uji ke pod.
Gunakan pod
web-1sebagai contoh, lalu buat filetestdi direktori disk yang telah di-mount/data.kubectl exec web-1 -- touch /data/test kubectl exec web-1 -- ls /dataOutput yang diharapkan:
lost+found testSimulasikan kegagalan pod dengan menghapusnya.
kubectl delete pod web-1Jalankan kembali
kubectl get pod -l app=nginx, pod baru bernamaweb-1secara otomatis dibuat.Verifikasi data di pod baru.
Periksa direktori
/datadi pod baruweb-1.kubectl exec web-1 -- ls /dataFile
testyang dibuat sebelumnya tetap ada. Ini membuktikan bahwa data bersifat persisten meskipun pod dihapus dan dibuat ulang.lost+found test
Aplikasi
Biaya dan manajemen resource: Saat Anda melakukan scale-in atau menghapus StatefulSet, PVC dan disk terkait akan dipertahankan secara default. Resource yang dipertahankan ini terus menimbulkan biaya. Pastikan untuk membersihkan PVC dan PV yang tidak terpakai secara manual untuk menghindari biaya yang tidak perlu.
Keamanan dan backup data: Persistent storage menjamin high availability selama kegagalan pod, tetapi ini bukanlah solusi backup data. Untuk data kritis, gunakan backup center untuk melakukan backup secara berkala.
High Availability dan Disaster Recovery: Disk bersifat zonal dan tidak dapat di-mount lintas zona. Untuk disaster recovery lintas zona, gunakan jenis disk yang mendukung replikasi data lintas zona, seperti regional ESSD.
Referensi
Lihat FAQ volume disk untuk troubleshooting.