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.
CatatanJika 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 . 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.
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.
Masuk ke Konsol ACK. Di panel navigasi kiri, klik Clusters.
Di halaman Clusters, temukan kluster yang ingin Anda kelola dan klik namanya. Di panel navigasi kiri, klik Add-ons.
Di halaman Add-ons, temukan kartu csi-provisioner dan klik Configuration di pojok kanan bawah kartu csi-provisioner.
Di kotak dialog csi-provisioner Parameters, tentukan
EnableVolumeGroupSnapshots=truedi 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
Buat file bernama mysql.yaml dan salin konten berikut ke file:
Buat aplikasi stateful untuk menerapkan MySQL.
kubectl apply -f mysql.yamlTulis data ke dua replika pod aplikasi MySQL.
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.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 | +------+-------+Lakukan operasi sebelumnya lagi untuk menulis data ke pod mysql-1.
3. Buat snapshot grup untuk aplikasi MySQL
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.comNilai 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.
CatatanAnda tidak dapat menetapkan waktu kedaluwarsa untuk grup snapshot konsisten ECS. Anda perlu menghapus snapshot grup secara manual.
Buat VolumeGroupSnapshotClass.
kubectl apply -f group-snapshot-class-demo.yamlGunakan 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-demosource.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.
Buat snapshot grup.
kubectl apply -f group-snapshot-demo.yaml
4. Periksa apakah snapshot grup telah dibuat
Kueri VolumeGroupSnapshots. Jika VolumeGroupSnapshots sedang dibuat, tunggu hingga selesai.
kubectl get vgs group-snapshot-demo -wJika nilai parameter
READYTOUSEberubah darifalsemenjaditrue, snapshot grup telah dibuat.Kueri PVC yang dicadangkan dan VolumeSnapshot yang dibuat untuk setiap PVC cadangan.
kubectl describe vgs group-snapshot-demoOutput 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.9Parameter
Deskripsi
Bound Volume Group Snapshot Content NameVolumeGroupSnapshotContent yang terikat ke VolumeGroupSnapshot.
Pvc Volume Snapshot Ref ListVolumeSnapshot yang terkait dengan PVC. Parameter berikut ditampilkan:
Persistent Volume Claim Ref: nama PVC cadangan.Volume Snapshot Ref: nama VolumeSnapshot yang dibuat untuk PVC.
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.9Jika nilai parameter
READYTOUSEdari dua VolumeSnapshots semuanyatrue, VolumeSnapshots telah dibuat.Kueri grup snapshot konsisten ECS yang dibuat.
kubectl describe vgsc groupsnapcontent-adcef6ef-811a-4e9d-ba51-3927caxxxxxxOutput yang diharapkan:
Volume Group Snapshot Handle: ssg-2zeg72d1qym6vnxxxxxxPergi 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.
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.ioPulihkan volume disk.
kubectl apply -f disk-mysql-0-copy.yamlKueri PVC yang dibuat.
kubectl get pvc disk-mysql-0-copyOutput yang diharapkan:
disk-mysql-0-copy Bound d-2ze0iwwqg0s6b0xxxxxx 20Gi RWO alicloud-disk-essd <unset> 69sPergi 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.
Skalakan jumlah replika pod yang disediakan oleh aplikasi MySQL menjadi nol.
kubectl scale sts mysql --replicas=0Hapus dua volume disk yang dipasang ke aplikasi MySQL.
kubectl delete pvc data-mysql-0 data-mysql-1Gunakan konten berikut untuk membuat skrip bernama generate_pvc.sh lalu gunakan skrip tersebut untuk membuat file YAML yang menerapkan PVC dari snapshot secara berurutan.
Anda harus terlebih dahulu menginstal alat baris perintah jq.
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
Hasilkan file YAML dari PVC yang dibuat dari snapshot.
bash generate_pvc.sh default group-snapshot-demo alicloud-disk-essd 20Gi .kube/config ./output.yamlTemplate 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.ioTerapkan file output.yaml di kluster untuk memulihkan PVC untuk disk sekaligus.
kubectl apply -f output.yaml
Skalakan jumlah replika pod yang disediakan oleh aplikasi MySQL menjadi dua.
kubectl scale sts mysql --replicas=2Setelah 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.