全部产品
Search
文档中心

Container Service for Kubernetes:Buat snapshot grup dari beberapa volume disk

更新时间:Jul 06, 2025

Anda dapat membuat snapshot volume dari disk untuk mencadangkan data aplikasi dan memulihkannya. Jika beberapa disk digunakan oleh kluster Container Service for Kubernetes (ACK), Anda dapat menggunakan resource VolumeSnapshot untuk membuat snapshot volume dari setiap disk. Namun, snapshot mungkin tidak dibuat secara bersamaan, yang dapat menyebabkan ketidaksesuaian data di antara snapshot. Untuk menghindari hal ini, Anda dapat membuat snapshot grup untuk mengelola dan mencadangkan data pada disk secara seragam, mengurangi risiko ketidaksesuaian data akibat pembuatan volume asinkron.

Prasyarat

  • Kluster ACK terkelola yang menjalankan Kubernetes 1.28 atau lebih baru telah dibuat. Untuk informasi lebih lanjut, lihat Buat kluster ACK terkelola.

  • Plugin Container Storage Interface (CSI) telah diinstal di kluster, dengan versi plugin CSI 1.31.4 atau lebih baru. Untuk informasi lebih lanjut tentang cara memperbarui csi-plugin dan csi-provisioner, lihat Perbarui csi-plugin dan csi-provisioner.

    Catatan

    Jika kluster menggunakan FlexVolume, yang sudah dihentikan di ACK, tingkatkan dari FlexVolume ke CSI lalu buat snapshot grup. Untuk informasi lebih lanjut, lihat Tingkatkan dari FlexVolume ke CSI. Buka halaman detail kluster di konsol ACK. Di panel navigasi kiri, pilih Operations > Add-ons. Kemudian, klik tab Storage untuk memeriksa jenis plugin volume yang diinstal di kluster.

  • Layanan Snapshot Elastic Compute Service (ECS) telah diaktifkan. Anda dapat mengaktifkan layanan Snapshot ECS secara gratis. Anda hanya dikenakan biaya untuk snapshot yang Anda buat. Untuk informasi lebih lanjut, lihat Aktifkan Snapshot ECS.

  • Klien kubectl terhubung ke kluster.

Penagihan

Snapshot grup diimplementasikan berdasarkan fitur grup snapshot konsisten dari ECS. Grup snapshot konsisten tidak dikenakan biaya tetap, namun snapshot dalam grup snapshot konsisten dikenakan biaya berdasarkan jumlah ruang penyimpanan yang dikonsumsi oleh snapshot. Untuk informasi lebih lanjut, lihat Penagihan Snapshot.

Batasan

Batasan yang sama berlaku untuk snapshot grup dan snapshot ECS. Untuk informasi lebih lanjut, lihat Batasan.

Catatan Penggunaan

ACK menyediakan CustomResourceDefinitions (CRD) berikut yang dapat Anda gunakan untuk membuat resource kustom guna mengelola snapshot grup.

CRD

Deskripsi

VolumeGroupSnapshotClass

Menentukan parameter yang digunakan untuk membuat VolumeGroupSnapshot, seperti kebijakan penghapusan.

VolumeGroupSnapshot

Permintaan untuk snapshot grup volume. VolumeGroupSnapshot menentukan disk yang ingin Anda cadangkan.

VolumeGroupSnapshotContent

Mencatat informasi tentang grup snapshot konsisten ECS.

VolumeSnapshot

Permintaan untuk snapshot volume. Setelah Anda membuat VolumeGroupSnapshot, sekelompok VolumeSnapshots secara otomatis dibuat untuk disk yang ingin Anda cadangkan pada saat yang bersamaan.

VolumeSnapshotContent

Mencatat informasi tentang snapshot ECS.

VolumeGroupSnapshotClass mirip dengan StorageClass. VolumeGroupSnapshot mirip dengan persistent volume claim (PVC). VolumeGroupSnapshotContent mirip dengan persistent volume (PV). Setelah Anda membuat VolumeGroupSnapshot, CSI membuat grup snapshot konsisten ECS untuk secara otomatis menghasilkan sekelompok VolumeSnapshots dan VolumeSnapshotContents. Jika terjadi kesalahan pada disk, Anda dapat memulihkan data pada disk menggunakan VolumeSnapshot yang mencadangkan disk tersebut.

Contoh

1. Aktifkan feature gates terkait snapshot grup

Sebelum membuat snapshot grup, Anda harus mengaktifkan feature gate EnableVolumeGroupSnapshots.

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

  2. Di halaman Clusters, temukan kluster yang ingin Anda kelola dan klik namanya. Di panel navigasi kiri, klik Add-ons.

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

  4. Di kotak dialog csi-provisioner Parameters, tentukan EnableVolumeGroupSnapshots=true di bidang FeatureGate dan klik OK.

    Jika feature gates lainnya telah diaktifkan, atur bidang FeatureGate dalam format xxxxxx=true,yyyyyy=false,EnableVolumeGroupSnapshots=true.

2. Buat aplikasi MySQL

  1. Buat file bernama mysql.yaml dan salin konten berikut ke file:

    Klik untuk melihat isi file mysql.yaml

    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
              # Direktori data MySQL.
              mountPath: /var/lib/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:   # Nama pengguna dan kata sandi yang digunakan untuk masuk ke database MySQL. Data berikut dikodekan dalam Base64. 
      password: MTIzNDU2   
      username: cm9vdA==  
    
  2. Buat aplikasi stateful untuk menerapkan MySQL.

    kubectl apply -f mysql.yaml
  3. Tulis data ke dua replika pod aplikasi MySQL.

    1. Masuk ke pod mysql-0 dan sambungkan ke database MySQL.

      kubectl exec -it mysql-0 -- bash  # Masuk ke pod. 
      mysql -uroot -p123456  # Sambungkan ke database MySQL.
    2. Jalankan perintah berikut untuk menulis data ke database:

      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 |
      +------+-------+
    3. Lakukan operasi sebelumnya lagi untuk menulis data ke pod mysql-1.

3. Buat snapshot grup untuk aplikasi MySQL

  1. Buat VolumeGroupSnapshotClass.

    VolumeGroupSnapshotClass default bernama alibabacloud-disk-group-snapshot dibuat di kluster. Anda dapat menggunakan file group-snapshot-class-demo.yaml berikut untuk membuat VolumeGroupSnapshotClass kustom:

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

    Nilai valid untuk parameter deletionPolicy:

    • Delete: Saat Anda menghapus VolumeGroupSnapshot, VolumeGroupSnapshotContent dan snapshot grup terkait juga dihapus.

    • Retain: Saat Anda menghapus VolumeGroupSnapshot, VolumeGroupSnapshotContent dan snapshot grup terkait dipertahankan.

    Catatan

    Anda tidak dapat menetapkan waktu kedaluwarsa untuk grup snapshot konsisten ECS. Anda perlu menghapus snapshot grup secara manual.

  2. Buat VolumeGroupSnapshotClass.

    kubectl apply -f group-snapshot-class-demo.yaml
  3. Gunakan file group-snapshot-demo.yaml berikut untuk membuat snapshot grup dari dua volume disk 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
      volumeGroupSnapshotClassName:
        group-snapshot-class-demo

    source.selector: pemilih label yang digunakan oleh VolumeGroupSnapshot untuk memilih PVC untuk pencadangan.

    Label ditambahkan ke PVC yang dibuat berdasarkan parameter di bagian volumeClaimTemplates untuk menunjukkan aplikasi tempat PVC dipasang. Jika Anda menggunakan metode lain untuk membuat PVC yang digunakan oleh aplikasi, Anda harus menambahkan label secara manual ke PVC untuk menunjukkan aplikasi tempat PVC dipasang.

  4. Buat snapshot grup.

    kubectl apply -f group-snapshot-demo.yaml

4. Periksa apakah snapshot grup telah dibuat

  1. Kueri VolumeGroupSnapshots. Jika VolumeGroupSnapshots sedang dibuat, tunggu hingga selesai.

    kubectl get vgs group-snapshot-demo -w

    Jika nilai parameter READYTOUSE berubah dari false menjadi true, snapshot grup telah dibuat.

  2. Kueri PVC yang dicadangkan dan VolumeSnapshot yang dibuat untuk setiap PVC cadangan.

    kubectl describe vgs group-snapshot-demo

    Output yang diharapkan:

    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

    Parameter

    Deskripsi

    Bound Volume Group Snapshot Content Name

    VolumeGroupSnapshotContent yang terikat ke VolumeGroupSnapshot.

    Pvc Volume Snapshot Ref List

    VolumeSnapshot yang terkait dengan PVC. Parameter berikut ditampilkan:

    • Persistent Volume Claim Ref: nama PVC cadangan.

    • Volume Snapshot Ref: nama VolumeSnapshot yang dibuat untuk PVC.

  3. Kueri VolumeSnapshots yang dibuat.

    kubectl get volumesnapshot \ 

    Output yang diharapkan:

    snapshot-1c2c5bcaf47ee2bffcc5b2f52dff65a4aacaaea38032c05d75acd536f7xxxxxx-2024-11-27-6.4.7 \
    snapshot-37a2fbf634d68cd2103f261313c2ed781fbd2bd52b5a0d0e0c0ef7c339xxxxxx-2024-11-27-6.4.9

    Jika nilai parameter READYTOUSE dari dua VolumeSnapshots semuanya true, VolumeSnapshots telah dibuat.

  4. Kueri grup snapshot konsisten ECS yang dibuat.

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

    Output yang diharapkan:

      Volume Group Snapshot Handle:  ssg-2zeg72d1qym6vnxxxxxx

    Pergi ke Konsol ECS. Di panel navigasi kiri, pilih Storage & Snapshots > Snapshots. Di tab Snapshot-consistent Groups, masukkan ssg-2zeg72d1qym6vnxxxxxx (ID grup snapshot konsisten yang dikembalikan di output sebelumnya) di kotak pencarian dan klik ikon pencarian. Anda dapat melihat grup snapshot konsisten yang dibuat.

5. Pulihkan volume disk dari snapshot

Anda dapat memulihkan volume disk satu per satu secara manual atau menjalankan skrip untuk memulihkan volume disk dari snapshot sekaligus.

Pulihkan volume disk satu per satu secara manual

Contoh berikut menjelaskan cara memulihkan volume disk yang dipasang ke pod disk-mysql-0.

  1. Buat file bernama disk-mysql-0-copy.yaml dan salin konten berikut ke file. File ini digunakan untuk membuat PVC yang dapat menyediakan volume disk. CSI secara otomatis membuat disk baru berdasarkan PVC. Disk tersebut menyimpan data yang sama dengan disk yang terpasang ke pod disk-mysql-0.

    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: disk-mysql-0-copy
    spec:
      volumeMode: Filesystem
      accessModes:
      - ReadWriteOnce
      resources:
        requests:
          storage: 20Gi 
      storageClassName: "alicloud-disk-essd"
      dataSource:
        # VolumeSnapshot yang dibuat untuk PVC yang dipasang ke pod disk-mysql-0. 
        name: snapshot-1c2c5bcaf47ee2bffcc5b2f52dff65a4aacaaea38032c05d75acd536f7xxxxxx-2024-11-27-6.4.7
        kind: VolumeSnapshot
        apiGroup: snapshot.storage.k8s.io
  2. Pulihkan volume disk.

    kubectl apply -f disk-mysql-0-copy.yaml
  3. Kueri PVC yang dibuat.

    kubectl get pvc disk-mysql-0-copy

    Output yang diharapkan:

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

    Pergi ke Konsol ECS. Di panel navigasi kiri, pilih Storage & Snapshots > Block Storage. Di tab Cloud Disk, masukkan d-2ze0iwwqg0s6b0xxxxxx (ID disk yang dikembalikan di output sebelumnya) di kotak pencarian dan klik ikon pencarian. Anda dapat melihat disk yang dibuat. Klik ID disk untuk pergi ke halaman detail disk. Anda dapat menemukan bahwa disk dibuat dari snapshot.

Jalankan skrip untuk memulihkan volume disk dari snapshot sekaligus

Contoh berikut menjelaskan cara menggunakan snapshot grup untuk memulihkan PVC yang dipasang ke aplikasi MySQL sekaligus.

  1. Skalakan jumlah replika pod yang disediakan oleh aplikasi MySQL menjadi nol.

    kubectl scale sts mysql --replicas=0
  2. Hapus dua volume disk yang dipasang ke aplikasi MySQL.

    kubectl delete pvc data-mysql-0 data-mysql-1
  3. Gunakan konten berikut untuk membuat skrip bernama generate_pvc.sh lalu gunakan skrip tersebut untuk membuat file YAML yang menerapkan PVC dari snapshot secara berurutan.

    1. Anda harus terlebih dahulu menginstal alat baris perintah jq.

      Klik untuk melihat cara menginstal jq

      • CentOS:

        yum install jq 
      • Ubuntu:

        apt-get install jq

      Klik untuk melihat isi skrip generate_pvc.sh

      #!/bin/bash
      
      # Parameter input. 
      NAMESPACE=$1
      VGS_NAME=$2
      STORAGE_CLASS_NAME=$3
      CAPACITY=$4
      KUBECONFIG_PATH=$5
      OUTPUT_FILE=$6
      
      # Dapatkan informasi tentang VolumeGroupSnapshot yang ditentukan. 
      VGS_INFO=$(kubectl --kubeconfig=${KUBECONFIG_PATH} -n ${NAMESPACE} get vgs ${VGS_NAME} -o json)
      
      # Periksa apakah parameter .status.pvcVolumeSnapshotRefList ada. 
      if !  echo ${VGS_INFO} | jq -e '.status.pvcVolumeSnapshotRefList' &>/dev/null; then
        echo "Error: .status.pvcVolumeSnapshotRefList not found in VolumeGroupSnapshot."
        exit 1
      fi
      
      # Parsing parameter .status.pvcVolumeSnapshotRefList. 
      PVCS=($(echo ${VGS_INFO} | jq -r '.status.pvcVolumeSnapshotRefList[].persistentVolumeClaimRef.name'))
      SNAPSHOTS=($(echo ${VGS_INFO} | jq -r '.status.pvcVolumeSnapshotRefList[].volumeSnapshotRef.name'))
      
      # Bersihkan file output. 
      > ${OUTPUT_FILE}
      
      # Hasilkan file YAML dari N PVC. 
      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}"

      Tabel berikut menjelaskan parameter input di skrip generate_pvc.sh.

      Parameter Input

      Deskripsi

      Contoh

      1

      Namespace tempat VolumeGroupSnapshot berada.

      default

      2

      Nama VolumeGroupSnapshot.

      group-snapshot-demo

      3

      Nama StorageClass.

      alicloud-disk-essd

      4

      Kapasitas disk.

      20Gi

      5

      Jalur file kubeconfig.

      .kube/config (default)

      6

      Jalur file YAML PVC yang dihasilkan.

      ./output.yaml

    2. Hasilkan file YAML dari PVC yang dibuat dari snapshot.

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

      Template YAML berikut memberikan contoh file output.yaml. Anda dapat mengedit file berdasarkan kebutuhan bisnis Anda dan kemudian menerapkan file tersebut di kluster.

      ---
      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
    3. Terapkan file output.yaml di kluster untuk memulihkan PVC untuk disk sekaligus.

      kubectl apply -f output.yaml
  4. Skalakan jumlah replika pod yang disediakan oleh aplikasi MySQL menjadi dua.

    kubectl scale sts mysql --replicas=2
  5. Setelah aplikasi dimulai ulang, periksa apakah data telah dipulihkan.

    kubectl exec -it mysql-0 -- bash   # Masuk ke pod. 
    mysql -uroot -p123456              # Jalankan perintah ini di dalam pod. 
    use test;                          # Jalankan perintah ini di dalam database. 
    select * from scores;

    Output yang diharapkan:

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

Referensi

Untuk informasi lebih lanjut tentang cara membuat snapshot dari volume disk, lihat Buat snapshot dari volume disk.