全部产品
Search
文档中心

Container Service for Kubernetes:Buat snapshot dari volume disk

更新时间:Jul 02, 2025

Anda dapat membuat snapshot volume dari disk untuk mencadangkan data aplikasi dan memulihkan data tersebut dari snapshot volume. Topik ini menjelaskan cara menggunakan resource VolumeSnapshot untuk membuat snapshot volume dari volume disk serta cara memulihkan data dari snapshot volume.

Prasyarat

  • Kluster ACK dikelola telah dibuat dengan versi Kubernetes 1.18 atau lebih baru.

  • Layanan Snapshot Elastic Compute Service (ECS) diaktifkan. Anda dapat mengaktifkan layanan Snapshot ECS tanpa biaya, namun akan dikenakan biaya untuk setiap snapshot yang dibuat. Untuk informasi lebih lanjut, lihat Aktifkan Snapshot ECS.

Deskripsi fitur

Umumnya, kluster Container Service for Kubernetes (ACK) menggunakan volume disk untuk menyediakan penyimpanan persisten bagi StatefulSets. Kubernetes mendukung pencadangan dan pemulihan data berdasarkan snapshot disk melalui fitur-fitur berikut:

  • VolumeSnapshot: Resource yang memungkinkan pencadangan data dalam volume disk.

  • DataSource: Field Persistent Volume Claim (PVC) yang digunakan untuk memulihkan data dari snapshot volume.

Deskripsi penagihan

Dalam kluster ACK, snapshot volume diimplementasikan berdasarkan snapshot Elastic Compute Service (ECS). Anda akan dikenakan biaya untuk penggunaan snapshot ECS. Untuk informasi lebih lanjut tentang aturan penagihan snapshot ECS, lihat Penagihan snapshot.

Catatan penggunaan

Untuk mengimplementasikan fitur terkait snapshot volume, ACK mendefinisikan jenis-jenis resource kustom berikut menggunakan CustomResourceDefinitions (CRDs):

Jenis resource

Deskripsi

VolumeSnapshotContent

Snapshot disk yang dibuat dan dikelola oleh administrator. VolumeSnapshotContent tidak termasuk dalam namespace apa pun. VolumeSnapshotContent mirip dengan persistent volume (PV).

VolumeSnapshot

Permintaan untuk snapshot volume. Dibuat dan dikelola oleh pengguna. VolumeSnapshot termasuk dalam namespace tertentu. VolumeSnapshot mirip dengan PVC.

VolumeSnapshotClass

Menentukan atribut VolumeSnapshot, seperti parameter dan controller yang digunakan untuk membuat snapshot volume. VolumeSnapshotClass mirip dengan StorageClass.

Berikut adalah hubungan antara resource-resource tersebut:

  • Saat membuat snapshot volume, VolumeSnapshot harus diikat ke VolumeSnapshotContent. Pengikatan ini mirip dengan pengikatan PVC-PV.

  • Jika parameter VolumeSnapshotClassName dari VolumeSnapshot ditentukan, kluster ACK secara otomatis membuat VolumeSnapshotContent untuk VolumeSnapshot. Jika parameter VolumeSnapshotClassName tidak valid atau tidak ditentukan, kluster tidak akan membuat VolumeSnapshotContent secara otomatis. Dalam hal ini, Anda harus membuat VolumeSnapshotContent secara manual dan mengikatnya ke VolumeSnapshot.

  • Pengikatan antara VolumeSnapshotContents dan VolumeSnapshots bersifat satu-satu.

Penting

Menghapus VolumeSnapshotContent juga akan menghapus snapshot volume terkait.

Buat snapshot volume secara dinamis

Prosedur

Gambar berikut menunjukkan cara ACK membuat snapshot yang diprovisioning secara dinamis dari volume disk.snapshot

Penting

Secara default, fitur akses instans diaktifkan untuk snapshot yang diprovisioning secara dinamis yang dibuat dari volume yang digunakan untuk memasang Enterprise SSD (ESSD) atau disk ESSD AutoPL dengan tingkat performa (PL) berikut: PL0, PL1, PL2, dan PL3.

Tabel berikut menjelaskan prosedur:

Langkah

Deskripsi

Buat aplikasi yang memiliki volume disk terpasang.

Buat VolumeSnapshot yang menggunakan VolumeSnapshotClass. Kemudian, kluster ACK secara otomatis membuat VolumeSnapshotContent dan snapshot disk.

Buat aplikasi lain yang menggunakan PVC untuk merujuk snapshot volume yang dibuat pada Langkah ②.

Langkah-langkah sebelumnya bertujuan untuk mencapai hal berikut:

  • Gunakan Snapshot1 untuk mencadangkan data di Volume1.

  • Pulihkan data dari Snapshot1 ke Volume2.

Contoh

  1. Buat VolumeSnapshotClass

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

      apiVersion: snapshot.storage.k8s.io/v1
      kind: VolumeSnapshotClass
      metadata:
       name: default-snapclass
      driver: diskplugin.csi.alibabacloud.com
      parameters:
        retentionDays: "5"
        forceDelete: "true"
      deletionPolicy: Delete

      Parameter

      Deskripsi

      retentionDays

      Masa retensi snapshot volume. Unit: hari.

      forceDelete

      Untuk memaksa menghapus snapshot volume, setel forceDelete ke "true".

      Nilai default adalah "false" untuk csi-provisioner 1.26.5-92f859a-aliyun dan yang lebih baru. Nilai default adalah "true" untuk versi csi-provisioner sebelum 1.26.5-92f859a-aliyun. Nilai yang valid:

      • "true": memaksa menghapus semua snapshot volume.

      • "false": hanya menghapus snapshot yang tidak digunakan.

      deletionPolicy

      Kebijakan pengklaiman ulang snapshot volume. Nilai yang valid:

      • Delete: Saat Anda menghapus VolumeSnapshot, VolumeSnapshotContent dan snapshot yang sesuai juga dihapus.

      • Retain: Saat Anda menghapus VolumeSnapshot, VolumeSnapshotContent dan snapshot yang sesuai tetap ada.

    2. Buat VolumeSnapshotClass

      kubectl apply -f volumesnapshotclass.yaml
  2. Buat aplikasi dan tulis data ke aplikasi.

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

      apiVersion: apps/v1
      kind: StatefulSet
      metadata:
        name: nginx
      spec:
        selector:
          matchLabels:
            app: nginx
        serviceName: "nginx"
        replicas: 1
        template:
          metadata:
            labels:
              app: nginx
          spec:
            containers:
            - name: nginx
              image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6
              imagePullPolicy: IfNotPresent
              volumeMounts:
              - name: disk
                mountPath: /data
        volumeClaimTemplates:
        - metadata:
            name: disk
          spec:
            accessModes: [ "ReadWriteOnce" ]
            storageClassName: "alicloud-disk-topology-alltype"
            resources:
              requests:
                storage: 20Gi 
    2. Buat aplikasi.

      kubectl apply -f nginx.yaml
    3. Periksa kemajuan penerapan pod aplikasi.

      kubectl get pod -l app=nginx

      Output yang diharapkan:

      NAME        READY   STATUS    RESTARTS   AGE
      nginx-0     1/1     Running   0          82s
    4. Tulis data ke jalur pemasangan di dalam container.

      kubectl exec -it nginx-0 -- touch /data/test
      kubectl exec -it nginx-0 -- ls /data

      Output yang diharapkan:

      lost+found test
  3. Buat VolumeSnapshot.

    Penting
    • Jika versi CSI plug-in yang diinstal di kluster Anda adalah V1.22.12-b797ad9-aliyun atau lebih baru, Anda dapat membuat snapshot dari volume disk yang digunakan, terlepas dari apakah PVC dari volume disk digunakan oleh pod yang berada dalam status Running.

    • Jika versi CSI plug-in yang diinstal di kluster Anda adalah V1.22.12-b797ad9-aliyun atau lebih baru, Anda hanya dapat membuat snapshot dari volume disk yang PVC-nya digunakan oleh pod yang berada dalam status Running.

    1. Buat file bernama snapshot-1.yaml dan salin konten berikut ke file tersebut:

      apiVersion: snapshot.storage.k8s.io/v1
      kind: VolumeSnapshot
      metadata:
        name: new-snapshot-demo
        namespace: default
      spec:
        volumeSnapshotClassName: default-snapclass   # VolumeSnapshotClass yang digunakan oleh VolumeSnapshot.
        source:
          persistentVolumeClaimName: disk-nginx-0
    2. Buat VolumeSnapshot.

      kubectl apply -f snapshot-1.yaml
  4. Periksa VolumeSnapshot dan VolumeSnapshotContent.

    Catatan

    Anda juga dapat melihat snapshot volume yang sesuai dengan VolumeSnapshotContent di Konsol ECS.

    1. Jalankan perintah berikut untuk memeriksa VolumeSnapshot:

      kubectl get volumesnapshots

      Output yang diharapkan:

      NAME                READYTOUSE   SOURCEPVC      SOURCESNAPSHOTCONTENT   RESTORESIZE   SNAPSHOTCLASS       SNAPSHOTCONTENT                                    CREATIONTIME   AGE
      new-snapshot-demo   true         disk-nginx-0                           20Gi          default-snapclass   snapcontent-48b04625-679a-490f-9ef3-f04b2b8e6c57   28s            28s
    2. Jalankan perintah berikut untuk memeriksa VolumeSnapshotContent:

      kubectl get VolumeSnapshotContent

      Output yang diharapkan:

      NAME                                               READYTOUSE   RESTORESIZE   DELETIONPOLICY   DRIVER                            VOLUMESNAPSHOTCLASS   VOLUMESNAPSHOT      VOLUMESNAPSHOTNAMESPACE   AGE
      snapcontent-48b04625-679a-490f-9ef3-f04b2b8e6c57   true         21474836480   Delete           diskplugin.csi.alibabacloud.com   default-snapclass     new-snapshot-demo   default                   49s
  5. Opsional: Buat aplikasi dan gunakan VolumeSnapshot untuk memulihkan data di aplikasi.

    1. Buat file bernama nginx-restore dan salin konten berikut ke file tersebut.

      Setel dataSource.name ke VolumeSnapshot yang Anda buat dan dataSource.kind ke VolumeSnapshot di bagian volumeClaimTemplates.

      apiVersion: apps/v1
      kind: StatefulSet
      metadata:
        name: nginx-restore
      spec:
        selector:
          matchLabels:
            app: nginx
        serviceName: "nginx"
        replicas: 1
        template:
          metadata:
            labels:
              app: nginx
          spec:
            containers:
            - name: nginx
              image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6
              imagePullPolicy: IfNotPresent
              volumeMounts:
              - name: disk
                mountPath: /data
        volumeClaimTemplates:
        - metadata:
            name: disk
          spec:
            accessModes: [ "ReadWriteOnce" ]
            storageClassName: "alicloud-disk-topology-alltype"
            resources:
              requests:
                storage: 20Gi
            dataSource:
              name: new-snapshot-demo
              kind: VolumeSnapshot
              apiGroup: snapshot.storage.k8s.io
    2. Buat aplikasi.

      kubectl apply -f nginx-restore.yaml
    3. Periksa apakah data dipulihkan di jalur pemasangan di dalam container.

      kubectl exec -it nginx-restore-0 -- ls /data

      Output yang diharapkan:

      lost+found test
  6. Opsional: Jika Anda tidak perlu membuat beban kerja, Anda dapat membuat PVC yang merujuk ke VolumeSnapshot.

    1. Gunakan template YAML berikut untuk membuat file pvc-restore.

      Setel dataSource.kind ke VolumeSnapshot dan dataSource.name ke nama VolumeSnapshot.

      apiVersion: v1
      kind: PersistentVolumeClaim
      metadata:
        name: pvc-disk
        namespace: default
      spec:
        accessModes:
        - ReadWriteOnce
        resources:
          requests:
            storage: 20Gi
        dataSource:
          name: new-snapshot-demo
          kind: VolumeSnapshot
          apiGroup: snapshot.storage.k8s.io
        storageClassName: alicloud-disk-topology-alltype
        volumeMode: Filesystem
    2. Buat PVC.

      Catatan

      Dalam konfigurasi StorageClass alicloud-disk-topology-alltype, parameter VolumeBindingMode disetel ke WaitForFirstConsumer. PVC yang menggunakan StorageClasses dalam mode pengikatan ini tetap dalam status Pending sampai dipasang ke pod. Oleh karena itu, sebelum PVC dipasang, pastikan bahwa VolumeSnapshot, VolumeSnapshotContent, dan snapshot ECS terkait tidak dihapus.

      kubectl apply -f pvc-restore.yaml

Buat snapshot volume yang diprovisioning secara statis dari snapshot disk yang ada

Untuk mengimpor snapshot disk yang ada ke kluster ACK, ikuti langkah-langkah berikut:

  1. Buat VolumeSnapshotContent menggunakan snapshot disk yang ada.

    1. Buat file bernama snapshot-content.yaml dan salin konten berikut ke file tersebut:

      apiVersion: snapshot.storage.k8s.io/v1
      kind: VolumeSnapshotContent
      metadata:
        name: new-snapshot-content-test
      spec:
        deletionPolicy: Retain
        driver: diskplugin.csi.alibabacloud.com
        source:
          snapshotHandle: <YOUR-SNAPSHOTID>
        volumeSnapshotRef:
          name: new-snapshot-demo
          namespace: default

      Parameter

      Deskripsi

      snapshotHandle

      ID snapshot disk yang ada. Anda dapat memperoleh ID snapshot di halaman Snapshots di Konsol ECS.

      volumeSnapshotRef

      Informasi tentang VolumeSnapshot yang akan dibuat untuk VolumeSnapshotContent.

      • name: nama VolumeSnapshot.

      • namespace: namespace tempat VolumeSnapshot berada.

    2. Buat VolumeSnapshotContent:

      kubectl apply -f snapshot-content.yaml
  2. Buat VolumeSnapshot dan ikat dengan VolumeSnapshotContent yang Anda buat.

    1. Buat file bernama snapshot-2.yaml dan tambahkan konten berikut ke file tersebut:

      apiVersion: snapshot.storage.k8s.io/v1
      kind: VolumeSnapshot
      metadata:
        name: new-snapshot-demo
        namespace: default
      spec:
        source:
          volumeSnapshotContentName: new-snapshot-content-test

      Parameter

      Deskripsi

      metadata.name

      Nama VolumeSnapshot. Nilainya harus sama dengan nilai parameter volumeSnapshotRef.name dari VolumeSnapshotContent yang Anda buat.

      volumeSnapshotContentName

      Nama VolumeSnapshotContent yang ingin Anda ikat dengan VolumeSnapshot.

    2. Buat VolumeSnapshot.

      kubectl apply -f snapshot-2.yaml
  3. Opsional: Buat aplikasi dan gunakan VolumeSnapshot untuk memulihkan data di aplikasi.

    1. Buat file bernama nginx-restore dan salin konten berikut ke file tersebut.

      Setel dataSource.name ke VolumeSnapshot yang Anda buat dan dataSource.kind ke VolumeSnapshot di bagian volumeClaimTemplates.

      apiVersion: apps/v1
      kind: StatefulSet
      metadata:
        name: nginx-restore
      spec:
        selector:
          matchLabels:
            app: nginx
        serviceName: "nginx"
        replicas: 1
        template:
          metadata:
            labels:
              app: nginx
          spec:
            containers:
            - name: nginx
              image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6
              imagePullPolicy: IfNotPresent
              volumeMounts:
              - name: disk
                mountPath: /data
        volumeClaimTemplates:
        - metadata:
            name: disk
          spec:
            accessModes: [ "ReadWriteOnce" ]
            storageClassName: "alicloud-disk-topology-alltype"
            resources:
              requests:
                storage: 20Gi
            dataSource:
              name: new-snapshot-demo
              kind: VolumeSnapshot
              apiGroup: snapshot.storage.k8s.io
    2. Buat aplikasi.

      kubectl apply -f nginx-restore.yaml
    3. Periksa apakah data dipulihkan di jalur pemasangan di dalam container.

      kubectl exec -it nginx-restore-0 -- ls /data

      Output yang diharapkan:

      lost+found test