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.
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.
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
Buat VolumeSnapshotClass
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: DeleteParameter
Deskripsi
retentionDaysMasa retensi snapshot volume. Unit: hari.
forceDeleteUntuk memaksa menghapus snapshot volume, setel
forceDeleteke"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.
deletionPolicyKebijakan 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.
Buat VolumeSnapshotClass
kubectl apply -f volumesnapshotclass.yaml
Buat aplikasi dan tulis data ke aplikasi.
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: 20GiBuat aplikasi.
kubectl apply -f nginx.yamlPeriksa kemajuan penerapan pod aplikasi.
kubectl get pod -l app=nginxOutput yang diharapkan:
NAME READY STATUS RESTARTS AGE nginx-0 1/1 Running 0 82sTulis data ke jalur pemasangan di dalam container.
kubectl exec -it nginx-0 -- touch /data/test kubectl exec -it nginx-0 -- ls /dataOutput yang diharapkan:
lost+found test
Buat VolumeSnapshot.
PentingJika 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.
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-0Buat VolumeSnapshot.
kubectl apply -f snapshot-1.yaml
Periksa VolumeSnapshot dan VolumeSnapshotContent.
CatatanAnda juga dapat melihat snapshot volume yang sesuai dengan VolumeSnapshotContent di Konsol ECS.
Jalankan perintah berikut untuk memeriksa 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 28sJalankan perintah berikut untuk memeriksa 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
Opsional: Buat aplikasi dan gunakan VolumeSnapshot untuk memulihkan data di aplikasi.
Buat file bernama nginx-restore dan salin konten berikut ke file tersebut.
Setel
dataSource.nameke VolumeSnapshot yang Anda buat dandataSource.kindkeVolumeSnapshotdi bagianvolumeClaimTemplates.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.ioBuat aplikasi.
kubectl apply -f nginx-restore.yamlPeriksa apakah data dipulihkan di jalur pemasangan di dalam container.
kubectl exec -it nginx-restore-0 -- ls /dataOutput yang diharapkan:
lost+found test
Opsional: Jika Anda tidak perlu membuat beban kerja, Anda dapat membuat PVC yang merujuk ke VolumeSnapshot.
Gunakan template YAML berikut untuk membuat file pvc-restore.
Setel
dataSource.kindkeVolumeSnapshotdandataSource.nameke 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: FilesystemBuat PVC.
CatatanDalam 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:
Buat VolumeSnapshotContent menggunakan snapshot disk yang ada.
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: defaultParameter
Deskripsi
snapshotHandleID snapshot disk yang ada. Anda dapat memperoleh ID snapshot di halaman Snapshots di Konsol ECS.
volumeSnapshotRefInformasi tentang VolumeSnapshot yang akan dibuat untuk VolumeSnapshotContent.
name: nama VolumeSnapshot.namespace: namespace tempat VolumeSnapshot berada.
Buat VolumeSnapshotContent:
kubectl apply -f snapshot-content.yaml
Buat VolumeSnapshot dan ikat dengan VolumeSnapshotContent yang Anda buat.
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-testParameter
Deskripsi
metadata.nameNama VolumeSnapshot. Nilainya harus sama dengan nilai parameter
volumeSnapshotRef.namedari VolumeSnapshotContent yang Anda buat.volumeSnapshotContentNameNama VolumeSnapshotContent yang ingin Anda ikat dengan VolumeSnapshot.
Buat VolumeSnapshot.
kubectl apply -f snapshot-2.yaml
Opsional: Buat aplikasi dan gunakan VolumeSnapshot untuk memulihkan data di aplikasi.
Buat file bernama nginx-restore dan salin konten berikut ke file tersebut.
Setel
dataSource.nameke VolumeSnapshot yang Anda buat dandataSource.kindkeVolumeSnapshotdi bagianvolumeClaimTemplates.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.ioBuat aplikasi.
kubectl apply -f nginx-restore.yamlPeriksa apakah data dipulihkan di jalur pemasangan di dalam container.
kubectl exec -it nginx-restore-0 -- ls /dataOutput yang diharapkan:
lost+found test