Snapshot volume membantu Anda mencadangkan dan memulihkan data aplikasi. Topik ini menjelaskan cara membuat snapshot untuk volume disk menggunakan resource VolumeSnapshot serta cara memulihkan data dari snapshot tersebut.
Prasyarat
Pastikan hal-hal berikut:
Kluster ACK yang dikelola menjalankan Kubernetes versi 1.18 atau lebih baru.
Layanan Snapshot Elastic Compute Service (ECS) telah diaktifkan (aktivasi gratis; Anda hanya dikenai biaya untuk snapshot yang Anda buat).
Cara kerja
Kluster ACK menggunakan volume disk untuk penyimpanan persisten StatefulSet. Snapshot volume dibangun di atas snapshot disk ECS dan dua mekanisme Kubernetes:
VolumeSnapshot: mencadangkan data volume disk.
DataSource: bidang PersistentVolumeClaim (PVC) yang memulihkan data snapshot ke volume baru.
ACK mengimplementasikan snapshot melalui tiga CustomResourceDefinitions (CRDs):
Resource | Deskripsi |
VolumeSnapshotContent | Snapshot disk berskala kluster yang disediakan oleh administrator kluster. Analog dengan PersistentVolume (PV). |
VolumeSnapshot | Permintaan pengguna berskala namespace untuk snapshot volume. Analog dengan PVC. |
VolumeSnapshotClass | Menentukan driver dan parameter untuk pembuatan snapshot. Analog dengan StorageClass tetapi khusus snapshot—volume yang sama dapat memiliki snapshot dengan atribut berbeda (misalnya, periode retensi berbeda). |
VolumeSnapshot dan VolumeSnapshotContent saling terikat satu-satu, seperti PVC dan PV:
Jika
volumeSnapshotClassNamediatur ke VolumeSnapshotClass yang valid, ACK secara otomatis menyediakan VolumeSnapshotContent.Jika
volumeSnapshotClassNamedihilangkan atau tidak valid, buat VolumeSnapshotContent secara manual dan ikatkan ke VolumeSnapshot.
Menghapus VolumeSnapshotContent juga akan menghapus snapshot volume terkait.
Penagihan
Snapshot volume ditagih sebagai snapshot ECS. Lihat Penagihan snapshot.
Batasan
Sebelum membuat snapshot, tinjau batasan berikut:
Kondisi | Perilaku |
Versi add-on CSI < V1.22.12-b797ad9-aliyun | Snapshot hanya dapat dibuat dari volume disk yang memiliki PVC terpasang pada pod Berjalan. |
Versi plug-in CSI >= V1.22.12-b797ad9-aliyun | Snapshot dapat dibuat dari volume disk apa pun yang digunakan, terlepas dari status pod. |
Secara default, akses instans diaktifkan untuk snapshot dinamis dari volume Enhanced SSD (ESSD) dan ESSD AutoPL pada PL0–PL3.
Siklus hidup resource VolumeSnapshot dan VolumeSnapshotContent yang dibuat oleh kelas snapshot csdr-disk-snapshot dikelola oleh Backup center. Untuk menghindari penghapusan sumber daya secara tidak sengaja, jangan mengubah atau menggunakan kelas snapshot ini.
Buat snapshot volume secara dinamis
Buat snapshot dari volume disk yang dikelola ACK secara langsung. ACK secara otomatis menyediakan VolumeSnapshotContent dan snapshot ECS yang mendasarinya.

Ikhtisar: buat VolumeSnapshotClass (administrator) → deploy aplikasi dengan volume disk → buat VolumeSnapshot (ACK secara otomatis membuat VolumeSnapshotContent dan snapshot ECS) → pulihkan data ke volume baru dari snapshot melalui PVC.
Langkah 1: Buat VolumeSnapshotClass
Ini adalah tugas administrator. Lewati ke Langkah 2 jika kluster Anda sudah memiliki VolumeSnapshotClass.
Buat file
volumesnapshotclass.yamldengan konten berikut:Parameter
Deskripsi
retentionDaysPeriode retensi snapshot, dalam hari.
forceDeletePerilaku saat penghapusan snapshot.
"true"menghapus paksa semua snapshot;"false"hanya menghapus snapshot yang tidak digunakan. Nilai default:"false"untuk csi-provisioner 1.26.5-92f859a-aliyun dan versi lebih baru;"true"untuk versi sebelumnya.deletionPolicyDelete: menghapus VolumeSnapshotContent dan snapshot ECS saat VolumeSnapshot dihapus.Retain: menyimpan keduanya.apiVersion: snapshot.storage.k8s.io/v1 kind: VolumeSnapshotClass metadata: name: default-snapclass driver: diskplugin.csi.alibabacloud.com parameters: retentionDays: "5" forceDelete: "true" deletionPolicy: DeleteTerapkan manifes:
kubectl apply -f volumesnapshotclass.yaml
Langkah 2: Deploy aplikasi dan tulis data
Buat file
nginx.yamldengan konten berikut: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: 20GiDeploy StatefulSet:
kubectl apply -f nginx.yamlVerifikasi pod sedang berjalan:
kubectl get pod -l app=nginxOutput yang diharapkan:
NAME READY STATUS RESTARTS AGE nginx-0 1/1 Running 0 82sTulis data uji ke volume:
kubectl exec -it nginx-0 -- touch /data/test kubectl exec -it nginx-0 -- ls /dataOutput yang diharapkan:
lost+found test
Langkah 3: Buat VolumeSnapshot
Buat file
snapshot-1.yamldengan konten berikut: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-0Terapkan manifes:
kubectl apply -f snapshot-1.yaml
Langkah 4: Verifikasi snapshot
Periksa status VolumeSnapshot:
kubectl get volumesnapshotsOutput 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 28sSaat
READYTOUSEbernilaitrue, snapshot siap digunakan.Periksa VolumeSnapshotContent:
kubectl get VolumeSnapshotContentOutput 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
Snapshot disk ECS juga muncul di halaman Snapshots di Konsol ECS.
Langkah 5 (opsional): Pulihkan data ke aplikasi baru
Referensikan snapshot dalam volumeClaimTemplates StatefulSet untuk memulihkan data ke volume baru.
Buat file
nginx-restore.yaml. BlokdataSourcemereferensikan snapshot yang telah Anda buat: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 # Nama VolumeSnapshot yang akan dipulihkan kind: VolumeSnapshot apiGroup: snapshot.storage.k8s.ioDeploy StatefulSet:
kubectl apply -f nginx-restore.yamlVerifikasi data telah dipulihkan:
kubectl exec -it nginx-restore-0 -- ls /dataOutput yang diharapkan:
lost+found test
Langkah 6 (opsional): Pulihkan data ke PVC mandiri
Untuk memulihkan data tanpa mendeploy workload, buat PVC langsung dari snapshot.
Buat file
pvc-restore.yamldengan konten berikut:apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pvc-disk namespace: default spec: accessModes: - ReadWriteOnce resources: requests: storage: 20Gi dataSource: name: new-snapshot-demo # Nama VolumeSnapshot yang akan dipulihkan kind: VolumeSnapshot apiGroup: snapshot.storage.k8s.io storageClassName: alicloud-disk-topology-alltype volumeMode: FilesystemBuat PVC:
StorageClass
alicloud-disk-topology-alltypemenggunakanvolumeBindingMode: WaitForFirstConsumer. PVC akan tetap berstatusPendinghingga dipasang ke pod. Jangan hapus VolumeSnapshot, VolumeSnapshotContent, atau snapshot ECS yang mendasarinya sebelum PVC terikat.kubectl apply -f pvc-restore.yaml
Impor snapshot disk yang sudah ada
Impor snapshot disk ECS yang sudah ada ke dalam kluster ACK tanpa perlu mendeploy aplikasi terlebih dahulu.
Langkah 1: Buat VolumeSnapshotContent
Ini adalah tugas administrator.
Buat file
snapshot-content.yaml. Ganti<YOUR-SNAPSHOTID>dengan ID snapshot dari halaman Snapshots di Konsol ECS:Parameter
Deskripsi
snapshotHandleID snapshot disk ECS yang sudah ada.
volumeSnapshotRef.nameNama VolumeSnapshot yang akan diikat. Harus sesuai dengan
metadata.namedalam manifes VolumeSnapshot.volumeSnapshotRef.namespaceNamespace VolumeSnapshot.
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> # ID snapshot disk ECS yang sudah ada volumeSnapshotRef: name: new-snapshot-demo # Harus sesuai dengan nama VolumeSnapshot di bawah namespace: defaultTerapkan manifes:
kubectl apply -f snapshot-content.yaml
Langkah 2: Buat VolumeSnapshot dan ikatkan
Buat file
snapshot-2.yamldengan konten berikut:Parameter
Deskripsi
metadata.nameNama VolumeSnapshot. Harus sesuai dengan
volumeSnapshotRef.namedalam VolumeSnapshotContent.volumeSnapshotContentNameNama VolumeSnapshotContent yang akan diikat.
apiVersion: snapshot.storage.k8s.io/v1 kind: VolumeSnapshot metadata: name: new-snapshot-demo # Harus sesuai dengan volumeSnapshotRef.name dalam VolumeSnapshotContent namespace: default spec: source: volumeSnapshotContentName: new-snapshot-content-test # Nama VolumeSnapshotContent yang akan diikatTerapkan manifes:
kubectl apply -f snapshot-2.yaml
Langkah 3 (opsional): Pulihkan data
Setelah pengikatan selesai, pulihkan data seperti yang dijelaskan dalam Langkah 5 dan Langkah 6 pada alur kerja snapshot dinamis.