All Products
Search
Document Center

Container Service for Kubernetes:Konfigurasikan cloud disk persistent storage untuk StatefulSets

Last Updated:Oct 24, 2025

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 diminta

Cara kerjanya

  • Pembuatan dan scale-out

    Selama pembuatan awal atau scale-out, controller StatefulSet akan menggunakan volumeClaimTemplates untuk 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 nama data-volume, controller akan membuat PVC bernama data-volume-web-0 dan data-volume-web-1 untuk pod web-0 dan web-1, sehingga menciptakan pemetaan yang stabil antara pod dan penyimpanannya.

    Berdasarkan parameter dalam templat (seperti storageClassName, storage, dan accessModes), 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.

  1. Buat file bernama statefulset.yaml.

    Tabel berikut menjelaskan parameter dalam volumeClaimTemplates:

    Parameter

    Deskripsi

    accessModes

    Mode akses volume. ReadWriteOnce berarti volume dapat di-mount sebagai read-write oleh satu node dalam satu waktu.

    storageClassName

    Nama StorageClass yang akan digunakan.

    alicloud-disk-essd adalah StorageClass default yang disediakan oleh Container Service for Kubernetes (ACK) untuk membuat Enterprise SSD (ESSD) dengan performance level (PL) default PL1

    Disk ini menggunakan tagihan pay-as-you-go. Untuk informasi lebih lanjut, lihat Penagihan block storage dan Harga block storage.

    storage

    Kapasitas volume disk.

    Template YAML

    apiVersion: v1
    kind: Service
    metadata:
      name: nginx
      labels:
        app: nginx
    spec:
      ports:
      - port: 80
        name: web
      # Set clusterIP ke "None" untuk menunjukkan Headless Service
      clusterIP: None
      selector:
        app: nginx
    ---
    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: web
    spec:
      selector:
        matchLabels:
          app: nginx
      # serviceName harus cocok dengan nama Headless Service yang didefinisikan di atas
      serviceName: "nginx"
      replicas: 2
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6
            ports:
            - containerPort: 80
              name: web
            # Pasang PV ke jalur tertentu dalam kontainer
            volumeMounts:
            - name: disk-essd
              mountPath: /data
      # Template PVC yang digunakan oleh StatefulSet untuk membuat PVC untuk setiap pod
      volumeClaimTemplates:
      - metadata:
          name: disk-essd
        spec:
          # Tentukan mode akses volume
          accessModes: [ "ReadWriteOnce" ]
          # Tentukan StorageClass untuk penyediaan PV dinamis
          storageClassName: "alicloud-disk-essd"
          resources:
            requests:
              # Tentukan kapasitas penyimpanan yang diminta untuk setiap PVC
              storage: 20Gi
  2. Deploy StatefulSet.

    kubectl create -f statefulset.yaml
  3. Verifikasi bahwa pod sedang berjalan.

    kubectl get pod -l app=nginx
  4. Periksa PVC untuk memverifikasi bahwa sistem telah membuat dan mengikatkan PVC yang sesuai untuk setiap pod secara otomatis:

    kubectl get pvc

    Output 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

  1. Tingkatkan jumlah replika StatefulSet menjadi 3.

    kubectl scale sts web --replicas=3
  2. Verifikasi bahwa pod sedang berjalan.

    kubectl get pod -l app=nginx
  3. Periksa PVC untuk memverifikasi bahwa sistem telah secara otomatis membuat pod web-2 dan PVC disk-essd-web-2 yang terkait.

    kubectl get pvc

    Output 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

  1. Kurangi jumlah replika StatefulSet menjadi 2.

    kubectl scale sts web --replicas=2
  2. Verifikasi bahwa pod sedang berjalan.

    kubectl get pod -l app=nginx
  3. Periksa PVC.

    kubectl get pvc

    Output 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>                 36s

    Pada titik ini, pod web-2 telah dihapus, tetapi PVC disk-essd-web-2 masih ada untuk memastikan persistensi data.

Scale-out aplikasi lagi

  1. Tingkatkan jumlah replika StatefulSet kembali menjadi 3.

    kubectl scale sts web --replicas=3
  2. Verifikasi bahwa pod sedang berjalan.

    kubectl get pod -l app=nginx
  3. Periksa PVC.

    kubectl get pvc

    Output 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>                 65s

    Pod web-2 yang baru dibuat secara otomatis menggunakan kembali disk-essd-web-2 yang 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.

  1. Tulis data uji ke pod.

    Gunakan pod web-1 sebagai contoh, lalu buat file test di direktori disk yang telah di-mount /data.

    kubectl exec web-1 -- touch /data/test
    kubectl exec web-1 -- ls /data

    Output yang diharapkan:

    lost+found
    test
  2. Simulasikan kegagalan pod dengan menghapusnya.

    kubectl delete pod web-1

    Jalankan kembali kubectl get pod -l app=nginx, pod baru bernama web-1 secara otomatis dibuat.

  3. Verifikasi data di pod baru.

    Periksa direktori /data di pod baru web-1.

    kubectl exec web-1 -- ls /data

    File test yang 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.