All Products
Search
Document Center

Container Service for Kubernetes:Buat snapshot grup untuk beberapa volume Cloud Disk

Last Updated:Mar 27, 2026

Ketika beberapa disk mendukung aplikasi berstatus di Container Service for Kubernetes (ACK), pengambilan VolumeSnapshot secara individual dari masing-masing disk dapat menghasilkan titik pemulihan yang tidak konsisten—setiap snapshot menangkap momen yang sedikit berbeda. Snapshot grup mengatasi masalah ini dengan memicu semua snapshot secara simultan, sehingga setiap disk dalam grup ditangkap pada waktu yang persis sama. Hal ini mengurangi risiko inkonsistensi data saat Anda perlu memulihkan aplikasi yang tersebar di beberapa volume.

Cara kerja

Snapshot grup dibangun di atas grup konsistensi snapshot ECS. ACK menyediakan CustomResourceDefinitions (CRD) berikut yang dapat Anda gunakan untuk mengelola snapshot grup:

CRD Setara dengan Tujuan
VolumeGroupSnapshotClass StorageClass Menentukan driver dan kebijakan penghapusan untuk snapshot grup
VolumeGroupSnapshot PersistentVolumeClaim (PVC) Permintaan untuk membuat snapshot sekumpulan disk, diidentifikasi oleh pemilih label
VolumeGroupSnapshotContent PersistentVolume (PV) Mencatat grup konsistensi snapshot ECS yang dibuat untuk permintaan tersebut
VolumeSnapshot Permintaan untuk snapshot volume; dibuat secara otomatis untuk setiap disk setelah VolumeGroupSnapshot dibuat
VolumeSnapshotContent Mencatat informasi tentang snapshot ECS

Saat Anda membuat VolumeGroupSnapshot, plug-in Container Storage Interface (CSI) membuat grup konsistensi snapshot ECS dan secara otomatis menghasilkan VolumeSnapshot serta VolumeSnapshotContent untuk setiap disk yang dipilih. Jika sebuah disk gagal, pulihkan dari VolumeSnapshot yang sesuai.

Penagihan

Grup konsistensi snapshot gratis. Snapshot yang ada di dalam grup dikenai biaya berdasarkan penyimpanan yang digunakan. Untuk detailnya, lihat Penagihan snapshot.

Batasan

  • Snapshot grup mengikuti batasan yang sama seperti snapshot ECS. Lihat Batasan.

  • Waktu kedaluwarsa tidak didukung untuk grup konsistensi snapshot ECS. Hapus snapshot grup secara manual ketika sudah tidak diperlukan lagi.

Prasyarat

Sebelum memulai, pastikan Anda telah:

Catatan

Jika kluster menggunakan FlexVolume (tidak lagi didukung di ACK), tingkatkan ke CSI sebelum membuat snapshot kelompok. Untuk instruksi selengkapnya, lihat Tingkatkan dari FlexVolume ke CSI. Untuk memeriksa plugin volume yang terinstal, buka halaman detail kluster di Konsol ACK, pilih Operations > Add-ons di panel navigasi sisi kiri, lalu klik tab Storage.

Langkah 1: Aktifkan feature gate

Aktifkan feature gate EnableVolumeGroupSnapshots di csi-provisioner sebelum membuat snapshot grup.

  1. Masuk ke ACK console. Di panel navigasi kiri, klik Clusters.

  2. Pada halaman Clusters, klik nama kluster. Di panel navigasi kiri, pilih Operations > Add-ons.

  3. Pada halaman Add-ons, temukan kartu csi-provisioner dan klik Configuration di pojok kanan bawah.

  4. Pada kotak dialog csi-provisioner Parameters, atur bidang FeatureGate menjadi EnableVolumeGroupSnapshots=true, lalu klik OK. Jika feature gate lain sudah diaktifkan, tambahkan feature gate baru ini: xxxxxx=true,yyyyyy=false,EnableVolumeGroupSnapshots=true.

Langkah 2: Deploy MySQL StatefulSet

Contoh ini menggunakan StatefulSet MySQL dengan dua replika. Setiap replika memasang disk ESSD 20 GiB sebagai PVC, sehingga Anda memiliki dua disk untuk di-snapshot sebagai satu grup.

  1. Buat file mysql.yaml dengan konten berikut: <details><summary>mysql.yaml</summary>

    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: mysql
    spec:
      selector:
        matchLabels:
          app: mysql
      serviceName: "mysql"
      replicas: 2
      template:
        metadata:
          labels:
            app: mysql
        spec:
          containers:
          - name: mysql
            image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/mysql:8.0.30-8.6
            env:
            - name: MYSQL_ROOT_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: mysql-pass
                  key: password
            imagePullPolicy: IfNotPresent
            volumeMounts:
            - name: data
              mountPath: /var/lib/mysql   # Direktori data MySQL
              subPath: mysql
      volumeClaimTemplates:
      - metadata:
          name: data
        spec:
          accessModes: [ "ReadWriteOnce" ]
          storageClassName: "alicloud-disk-essd"
          resources:
            requests:
              storage: 20Gi
    ---
    apiVersion: v1
    kind: Secret
    metadata:
      name: mysql-pass
    type: Opaque
    data:
      password: MTIzNDU2   # Nilai Base64 dari "123456"
      username: cm9vdA==   # Nilai Base64 dari "root"

    </details>

  2. Deploy StatefulSet:

    kubectl apply -f mysql.yaml
  3. Tulis data uji ke kedua replika pod. Masuk ke pod mysql-0 dan masukkan satu baris data:

    kubectl exec -it mysql-0 -- bash   # Buka shell di dalam pod
    mysql -uroot -p123456              # Hubungkan ke MySQL
    CREATE DATABASE test;
    USE test;
    CREATE TABLE scores ( name VARCHAR(50) NOT NULL, score INT AUTO_INCREMENT PRIMARY KEY );
    INSERT INTO scores(name, score) VALUES ("Amy", 95);
    SELECT * FROM scores;

    Output yang diharapkan:

    +------+-------+
    | name | score |
    +------+-------+
    | Amy  |    95 |
    +------+-------+

    Ulangi langkah yang sama untuk pod mysql-1.

Langkah 3: Buat snapshot grup

Buat VolumeGroupSnapshotClass

VolumeGroupSnapshotClass default bernama alibabacloud-disk-group-snapshot sudah tersedia di kluster. Untuk menggunakan kelas kustom, buat file group-snapshot-class-demo.yaml:

apiVersion: groupsnapshot.storage.k8s.io/v1alpha1
kind: VolumeGroupSnapshotClass
metadata:
  name: group-snapshot-class-demo
deletionPolicy: Delete
driver: diskplugin.csi.alibabacloud.com

Bidang deletionPolicy mengontrol apa yang terjadi pada grup konsistensi snapshot ECS yang mendasari saat Anda menghapus VolumeGroupSnapshot:

Nilai Perilaku
Delete Menghapus VolumeGroupSnapshotContent dan grup konsistensi snapshot ECS
Retain Mempertahankan VolumeGroupSnapshotContent dan grup konsistensi snapshot ECS

Terapkan kelas tersebut:

kubectl apply -f group-snapshot-class-demo.yaml

Buat VolumeGroupSnapshot

Buat file group-snapshot-demo.yaml untuk membuat snapshot kedua PVC yang dipasang ke aplikasi MySQL:

apiVersion: groupsnapshot.storage.k8s.io/v1alpha1
kind: VolumeGroupSnapshot
metadata:
  name: group-snapshot-demo
  namespace: default
spec:
  source:
    selector:
      matchLabels:
        app: mysql           # Memilih semua PVC dengan label ini
  volumeGroupSnapshotClassName: group-snapshot-class-demo

Bidang source.selector menggunakan pemilih label untuk mengidentifikasi PVC yang akan dicadangkan. PVC yang dibuat dari volumeClaimTemplates StatefulSet secara otomatis diberi label sesuai dengan label pod StatefulSet tersebut. Jika Anda membuat PVC secara manual, tambahkan label yang sesuai sebelum menjalankan langkah ini.

Terapkan VolumeGroupSnapshot:

kubectl apply -f group-snapshot-demo.yaml

Langkah 4: Verifikasi snapshot grup

  1. Amati VolumeGroupSnapshot hingga READYTOUSE berubah dari false menjadi true:

    kubectl get vgs group-snapshot-demo -w
  2. Periksa detail snapshot untuk melihat pemetaan antara PVC dan VolumeSnapshot:

    Bidang Deskripsi
    Bound Volume Group Snapshot Content Name VolumeGroupSnapshotContent yang terikat ke VolumeGroupSnapshot ini
    Persistent Volume Claim Ref Nama PVC yang dicadangkan
    Volume Snapshot Ref VolumeSnapshot yang dibuat untuk PVC tersebut
    kubectl describe vgs group-snapshot-demo

    Output yang diharapkan (disingkat):

    Status:
      Bound Volume Group Snapshot Content Name: groupsnapcontent-adcef6ef-811a-4e9d-ba51-3927caxxxxxx
      Creation Time: 2024-11-27T06:02:56Z
      Pvc Volume Snapshot Ref List:
        Persistent Volume Claim Ref:
          Name: disk-mysql-0
        Volume Snapshot Ref:
          Name: snapshot-1c2c5bcaf47ee2bffcc5b2f52dff65a4aacaaea38032c05d75acd536f7xxxxxx-2024-11-27-6.4.7
        Persistent Volume Claim Ref:
          Name: disk-mysql-1
        Volume Snapshot Ref:
          Name: snapshot-37a2fbf634d68cd2103f261313c2ed781fbd2bd52b5a0d0e0c0ef7c339xxxxxx-2024-11-27-6.4.9
  3. Pastikan kedua VolumeSnapshot sudah siap:

    kubectl get volumesnapshot

    Kedua snapshot harus menampilkan READYTOUSE: true.

  4. Dapatkan ID grup konsistensi snapshot ECS:

    kubectl describe vgsc groupsnapcontent-adcef6ef-811a-4e9d-ba51-3927caxxxxxx

    Output yang diharapkan (disingkat):

    Volume Group Snapshot Handle: ssg-2zeg72d1qym6vnxxxxxx

    Untuk melihat grup konsistensi snapshot di Konsol ECS, buka Konsol ECS, pilih Storage & Snapshots > Snapshots di panel navigasi kiri, klik tab Snapshot-consistent Groups, lalu cari ssg-2zeg72d1qym6vnxxxxxx.

Langkah 5: Pulihkan volume disk dari snapshot

Tersedia dua opsi pemulihan—pulihkan satu volume secara manual atau pulihkan semua volume sekaligus menggunakan skrip.

Opsi 1: Pulihkan satu volume

Contoh berikut memulihkan volume disk yang terpasang ke pod disk-mysql-0.

Buat file disk-mysql-0-copy.yaml. Bidang dataSource memberi tahu CSI untuk menyediakan disk baru dari VolumeSnapshot yang ditentukan:

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: disk-mysql-0-copy
spec:
  volumeMode: Filesystem
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 20Gi
  storageClassName: "alicloud-disk-essd"
  dataSource:
    name: snapshot-1c2c5bcaf47ee2bffcc5b2f52dff65a4aacaaea38032c05d75acd536f7xxxxxx-2024-11-27-6.4.7  # [1]
    kind: VolumeSnapshot                                                                                  # [2]
    apiGroup: snapshot.storage.k8s.io                                                                    # [3]
  • [1] Nama VolumeSnapshot yang mencadangkan disk-mysql-0 (dari output kubectl describe vgs di atas).

  • [2] Jenis resource—selalu VolumeSnapshot saat memulihkan dari snapshot.

  • [3] Grup API untuk resource snapshot CSI.

Terapkan PVC:

kubectl apply -f disk-mysql-0-copy.yaml

Verifikasi bahwa PVC telah terikat:

kubectl get pvc disk-mysql-0-copy

Output yang diharapkan:

disk-mysql-0-copy   Bound    d-2ze0iwwqg0s6b0xxxxxx   20Gi   RWO   alicloud-disk-essd   <unset>   69s

Untuk memastikan disk dibuat dari snapshot, buka Konsol ECS, pilih Storage & Snapshots > Block Storage di panel navigasi kiri, klik tab Cloud Disk, lalu cari d-2ze0iwwqg0s6b0xxxxxx. Buka halaman detail disk untuk melihat bahwa disk tersebut dibuat dari snapshot.

Opsi 2: Pulihkan semua volume sekaligus

Gunakan skrip generate_pvc.sh untuk secara otomatis menghasilkan manifes PVC dari VolumeGroupSnapshot dan menerapkannya sekaligus.

  1. Instal tool baris perintah jq:

    • CentOS: yum install jq

    • Ubuntu: apt-get install jq

  2. Ubah jumlah replika StatefulSet MySQL menjadi nol untuk menghentikan semua penulisan sebelum memulihkan:

    kubectl scale sts mysql --replicas=0
  3. Hapus PVC yang ada:

    kubectl delete pvc data-mysql-0 data-mysql-1
  4. Buat file generate_pvc.sh dengan konten berikut: <details><summary>generate_pvc.sh</summary>

    Parameter Deskripsi Contoh
    1 Namespace VolumeGroupSnapshot default
    2 Nama VolumeGroupSnapshot group-snapshot-demo
    3 Nama StorageClass untuk PVC yang dipulihkan alicloud-disk-essd
    4 Kapasitas disk 20Gi
    5 Path ke file kubeconfig .kube/config
    6 Path output untuk YAML PVC yang dihasilkan ./output.yaml
    #!/bin/bash
    
    # Parameter input
    NAMESPACE=$1           # Namespace VolumeGroupSnapshot
    VGS_NAME=$2            # Nama VolumeGroupSnapshot
    STORAGE_CLASS_NAME=$3  # StorageClass untuk PVC yang dipulihkan
    CAPACITY=$4            # Kapasitas disk (misalnya, 20Gi)
    KUBECONFIG_PATH=$5     # Path ke file kubeconfig
    OUTPUT_FILE=$6         # Path output untuk YAML yang dihasilkan
    
    # Dapatkan detail VolumeGroupSnapshot
    VGS_INFO=$(kubectl --kubeconfig=${KUBECONFIG_PATH} -n ${NAMESPACE} get vgs ${VGS_NAME} -o json)
    
    # Validasi bahwa pemetaan PVC-snapshot tersedia
    if ! echo ${VGS_INFO} | jq -e '.status.pvcVolumeSnapshotRefList' &>/dev/null; then
      echo "Error: .status.pvcVolumeSnapshotRefList tidak ditemukan di VolumeGroupSnapshot."
      exit 1
    fi
    
    # Ekstrak nama PVC dan nama snapshot yang sesuai
    PVCS=($(echo ${VGS_INFO} | jq -r '.status.pvcVolumeSnapshotRefList[].persistentVolumeClaimRef.name'))
    SNAPSHOTS=($(echo ${VGS_INFO} | jq -r '.status.pvcVolumeSnapshotRefList[].volumeSnapshotRef.name'))
    
    # Kosongkan file output
    > ${OUTPUT_FILE}
    
    # Hasilkan satu manifes PVC per disk
    for i in "${!PVCS[@]}"; do
      PVC_NAME=${PVCS[$i]}
      SNAPSHOT_NAME=${SNAPSHOTS[$i]}
    
      cat <<EOF >> ${OUTPUT_FILE}
    ---
    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: ${PVC_NAME}
    spec:
      volumeMode: Filesystem
      accessModes:
      - ReadWriteOnce
      resources:
        requests:
          storage: ${CAPACITY}
      storageClassName: "${STORAGE_CLASS_NAME}"
      dataSource:
        name: ${SNAPSHOT_NAME}
        kind: VolumeSnapshot
        apiGroup: snapshot.storage.k8s.io
    EOF
    done
    
    echo "File YAML PVC telah ditulis ke ${OUTPUT_FILE}"

    </details> Skrip ini menerima enam parameter posisi:

  5. Jalankan skrip untuk menghasilkan manifes PVC:

    bash generate_pvc.sh default group-snapshot-demo alicloud-disk-essd 20Gi .kube/config ./output.yaml

    File output.yaml yang dihasilkan akan mirip dengan:

    ---
    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: disk-mysql-0
    spec:
      volumeMode: Filesystem
      accessModes:
      - ReadWriteOnce
      resources:
        requests:
          storage: 20Gi
      storageClassName: "alicloud-disk-essd"
      dataSource:
        name: snapshot-1c2c5bcaf47ee2bffcc5b2f52dff65a4aacaaea38032c05d75acd536f7adb850-2024-11-27-6.4.7
        kind: VolumeSnapshot
        apiGroup: snapshot.storage.k8s.io
    ---
    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: disk-mysql-1
    spec:
      volumeMode: Filesystem
      accessModes:
      - ReadWriteOnce
      resources:
        requests:
          storage: 20Gi
      storageClassName: "alicloud-disk-essd"
      dataSource:
        name: snapshot-37a2fbf634d68cd2103f261313c2ed781fbd2bd52b5a0d0e0c0ef7c3396fea1c-2024-11-27-6.4.9
        kind: VolumeSnapshot
        apiGroup: snapshot.storage.k8s.io

    Edit file output.yaml jika diperlukan, lalu terapkan:

    kubectl apply -f output.yaml
  6. Ubah jumlah replika StatefulSet kembali menjadi dua:

    kubectl scale sts mysql --replicas=2
  7. Setelah pod dimulai ulang, verifikasi bahwa data telah dipulihkan:

    kubectl exec -it mysql-0 -- bash   # Buka shell di dalam pod
    mysql -uroot -p123456              # Hubungkan ke MySQL
    use test;
    select * from scores;

    Output yang diharapkan:

    +------+-------+
    | name | score |
    +------+-------+
    | Amy  |    95 |
    +------+-------+

Langkah selanjutnya