Ketika beberapa disk mendukung aplikasi berstatus di Container Service for Kubernetes (ACK), pengambilan VolumeSnapshot secara individual dari masing-masing disk dapat menghasilkan titik pemulihan yang tidak konsisten—setiap snapshot menangkap momen yang sedikit berbeda. Snapshot grup mengatasi masalah ini dengan memicu semua snapshot secara simultan, sehingga setiap disk dalam grup ditangkap pada waktu yang persis sama. Hal ini mengurangi risiko inkonsistensi data saat Anda perlu memulihkan aplikasi yang tersebar di beberapa volume.
Cara kerja
Snapshot grup dibangun di atas grup konsistensi snapshot ECS. ACK menyediakan CustomResourceDefinitions (CRD) berikut yang dapat Anda gunakan untuk mengelola snapshot grup:
| CRD | Setara dengan | Tujuan |
|---|---|---|
| VolumeGroupSnapshotClass | StorageClass | Menentukan driver dan kebijakan penghapusan untuk snapshot grup |
| VolumeGroupSnapshot | PersistentVolumeClaim (PVC) | Permintaan untuk membuat snapshot sekumpulan disk, diidentifikasi oleh pemilih label |
| VolumeGroupSnapshotContent | PersistentVolume (PV) | Mencatat grup konsistensi snapshot ECS yang dibuat untuk permintaan tersebut |
| VolumeSnapshot | — | Permintaan untuk snapshot volume; dibuat secara otomatis untuk setiap disk setelah VolumeGroupSnapshot dibuat |
| VolumeSnapshotContent | — | Mencatat informasi tentang snapshot ECS |
Saat Anda membuat VolumeGroupSnapshot, plug-in Container Storage Interface (CSI) membuat grup konsistensi snapshot ECS dan secara otomatis menghasilkan VolumeSnapshot serta VolumeSnapshotContent untuk setiap disk yang dipilih. Jika sebuah disk gagal, pulihkan dari VolumeSnapshot yang sesuai.
Penagihan
Grup konsistensi snapshot gratis. Snapshot yang ada di dalam grup dikenai biaya berdasarkan penyimpanan yang digunakan. Untuk detailnya, lihat Penagihan snapshot.
Batasan
-
Snapshot grup mengikuti batasan yang sama seperti snapshot ECS. Lihat Batasan.
-
Waktu kedaluwarsa tidak didukung untuk grup konsistensi snapshot ECS. Hapus snapshot grup secara manual ketika sudah tidak diperlukan lagi.
Prasyarat
Sebelum memulai, pastikan Anda telah:
-
Menggunakan kluster ACK yang dikelola dengan Kubernetes versi 1.28 atau lebih baru. Lihat Buat kluster ACK yang dikelola.
-
Menginstal plug-in CSI versi 1.31.4 atau lebih baru. Untuk memperbarui csi-plugin dan csi-provisioner, lihat Perbarui csi-plugin dan csi-provisioner.
-
Mengaktifkan layanan Snapshot Elastic Compute Service (ECS) (gratis untuk diaktifkan). Lihat Aktifkan Snapshot ECS.
-
Memiliki klien kubectl yang terhubung ke kluster.
Jika kluster menggunakan FlexVolume (tidak lagi didukung di ACK), tingkatkan ke CSI sebelum membuat snapshot kelompok. Untuk instruksi selengkapnya, lihat Tingkatkan dari FlexVolume ke CSI. Untuk memeriksa plugin volume yang terinstal, buka halaman detail kluster di Konsol ACK, pilih Operations > Add-ons di panel navigasi sisi kiri, lalu klik tab Storage.
Langkah 1: Aktifkan feature gate
Aktifkan feature gate EnableVolumeGroupSnapshots di csi-provisioner sebelum membuat snapshot grup.
-
Masuk ke ACK console. Di panel navigasi kiri, klik Clusters.
-
Pada halaman Clusters, klik nama kluster. Di panel navigasi kiri, pilih Operations > Add-ons.
-
Pada halaman Add-ons, temukan kartu csi-provisioner dan klik Configuration di pojok kanan bawah.
-
Pada kotak dialog csi-provisioner Parameters, atur bidang FeatureGate menjadi
EnableVolumeGroupSnapshots=true, lalu klik OK. Jika feature gate lain sudah diaktifkan, tambahkan feature gate baru ini:xxxxxx=true,yyyyyy=false,EnableVolumeGroupSnapshots=true.
Langkah 2: Deploy MySQL StatefulSet
Contoh ini menggunakan StatefulSet MySQL dengan dua replika. Setiap replika memasang disk ESSD 20 GiB sebagai PVC, sehingga Anda memiliki dua disk untuk di-snapshot sebagai satu grup.
-
Buat file
mysql.yamldengan konten berikut: <details><summary>mysql.yaml</summary>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 mountPath: /var/lib/mysql # Direktori data 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: password: MTIzNDU2 # Nilai Base64 dari "123456" username: cm9vdA== # Nilai Base64 dari "root"</details>
-
Deploy StatefulSet:
kubectl apply -f mysql.yaml -
Tulis data uji ke kedua replika pod. Masuk ke pod
mysql-0dan masukkan satu baris data:kubectl exec -it mysql-0 -- bash # Buka shell di dalam pod mysql -uroot -p123456 # Hubungkan ke MySQLCREATE 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 | +------+-------+Ulangi langkah yang sama untuk pod
mysql-1.
Langkah 3: Buat snapshot grup
Buat VolumeGroupSnapshotClass
VolumeGroupSnapshotClass default bernama alibabacloud-disk-group-snapshot sudah tersedia di kluster. Untuk menggunakan kelas kustom, buat file group-snapshot-class-demo.yaml:
apiVersion: groupsnapshot.storage.k8s.io/v1alpha1
kind: VolumeGroupSnapshotClass
metadata:
name: group-snapshot-class-demo
deletionPolicy: Delete
driver: diskplugin.csi.alibabacloud.com
Bidang deletionPolicy mengontrol apa yang terjadi pada grup konsistensi snapshot ECS yang mendasari saat Anda menghapus VolumeGroupSnapshot:
| Nilai | Perilaku |
|---|---|
Delete |
Menghapus VolumeGroupSnapshotContent dan grup konsistensi snapshot ECS |
Retain |
Mempertahankan VolumeGroupSnapshotContent dan grup konsistensi snapshot ECS |
Terapkan kelas tersebut:
kubectl apply -f group-snapshot-class-demo.yaml
Buat VolumeGroupSnapshot
Buat file group-snapshot-demo.yaml untuk membuat snapshot kedua PVC 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 # Memilih semua PVC dengan label ini
volumeGroupSnapshotClassName: group-snapshot-class-demo
Bidang source.selector menggunakan pemilih label untuk mengidentifikasi PVC yang akan dicadangkan. PVC yang dibuat dari volumeClaimTemplates StatefulSet secara otomatis diberi label sesuai dengan label pod StatefulSet tersebut. Jika Anda membuat PVC secara manual, tambahkan label yang sesuai sebelum menjalankan langkah ini.
Terapkan VolumeGroupSnapshot:
kubectl apply -f group-snapshot-demo.yaml
Langkah 4: Verifikasi snapshot grup
-
Amati VolumeGroupSnapshot hingga
READYTOUSEberubah darifalsemenjaditrue:kubectl get vgs group-snapshot-demo -w -
Periksa detail snapshot untuk melihat pemetaan antara PVC dan VolumeSnapshot:
Bidang Deskripsi Bound Volume Group Snapshot Content NameVolumeGroupSnapshotContent yang terikat ke VolumeGroupSnapshot ini Persistent Volume Claim RefNama PVC yang dicadangkan Volume Snapshot RefVolumeSnapshot yang dibuat untuk PVC tersebut kubectl describe vgs group-snapshot-demoOutput yang diharapkan (disingkat):
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 -
Pastikan kedua VolumeSnapshot sudah siap:
kubectl get volumesnapshotKedua snapshot harus menampilkan
READYTOUSE: true. -
Dapatkan ID grup konsistensi snapshot ECS:
kubectl describe vgsc groupsnapcontent-adcef6ef-811a-4e9d-ba51-3927caxxxxxxOutput yang diharapkan (disingkat):
Volume Group Snapshot Handle: ssg-2zeg72d1qym6vnxxxxxxUntuk melihat grup konsistensi snapshot di Konsol ECS, buka Konsol ECS, pilih Storage & Snapshots > Snapshots di panel navigasi kiri, klik tab Snapshot-consistent Groups, lalu cari
ssg-2zeg72d1qym6vnxxxxxx.
Langkah 5: Pulihkan volume disk dari snapshot
Tersedia dua opsi pemulihan—pulihkan satu volume secara manual atau pulihkan semua volume sekaligus menggunakan skrip.
Opsi 1: Pulihkan satu volume
Contoh berikut memulihkan volume disk yang terpasang ke pod disk-mysql-0.
Buat file disk-mysql-0-copy.yaml. Bidang dataSource memberi tahu CSI untuk menyediakan disk baru dari VolumeSnapshot yang ditentukan:
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: disk-mysql-0-copy
spec:
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi
storageClassName: "alicloud-disk-essd"
dataSource:
name: snapshot-1c2c5bcaf47ee2bffcc5b2f52dff65a4aacaaea38032c05d75acd536f7xxxxxx-2024-11-27-6.4.7 # [1]
kind: VolumeSnapshot # [2]
apiGroup: snapshot.storage.k8s.io # [3]
-
[1] Nama VolumeSnapshot yang mencadangkan
disk-mysql-0(dari outputkubectl describe vgsdi atas). -
[2] Jenis resource—selalu
VolumeSnapshotsaat memulihkan dari snapshot. -
[3] Grup API untuk resource snapshot CSI.
Terapkan PVC:
kubectl apply -f disk-mysql-0-copy.yaml
Verifikasi bahwa PVC telah terikat:
kubectl get pvc disk-mysql-0-copy
Output yang diharapkan:
disk-mysql-0-copy Bound d-2ze0iwwqg0s6b0xxxxxx 20Gi RWO alicloud-disk-essd <unset> 69s
Untuk memastikan disk dibuat dari snapshot, buka Konsol ECS, pilih Storage & Snapshots > Block Storage di panel navigasi kiri, klik tab Cloud Disk, lalu cari d-2ze0iwwqg0s6b0xxxxxx. Buka halaman detail disk untuk melihat bahwa disk tersebut dibuat dari snapshot.
Opsi 2: Pulihkan semua volume sekaligus
Gunakan skrip generate_pvc.sh untuk secara otomatis menghasilkan manifes PVC dari VolumeGroupSnapshot dan menerapkannya sekaligus.
-
Instal tool baris perintah
jq:-
CentOS:
yum install jq -
Ubuntu:
apt-get install jq
-
-
Ubah jumlah replika StatefulSet MySQL menjadi nol untuk menghentikan semua penulisan sebelum memulihkan:
kubectl scale sts mysql --replicas=0 -
Hapus PVC yang ada:
kubectl delete pvc data-mysql-0 data-mysql-1 -
Buat file
generate_pvc.shdengan konten berikut: <details><summary>generate_pvc.sh</summary>Parameter Deskripsi Contoh 1 Namespace VolumeGroupSnapshot default2 Nama VolumeGroupSnapshot group-snapshot-demo3 Nama StorageClass untuk PVC yang dipulihkan alicloud-disk-essd4 Kapasitas disk 20Gi5 Path ke file kubeconfig .kube/config6 Path output untuk YAML PVC yang dihasilkan ./output.yaml#!/bin/bash # Parameter input NAMESPACE=$1 # Namespace VolumeGroupSnapshot VGS_NAME=$2 # Nama VolumeGroupSnapshot STORAGE_CLASS_NAME=$3 # StorageClass untuk PVC yang dipulihkan CAPACITY=$4 # Kapasitas disk (misalnya, 20Gi) KUBECONFIG_PATH=$5 # Path ke file kubeconfig OUTPUT_FILE=$6 # Path output untuk YAML yang dihasilkan # Dapatkan detail VolumeGroupSnapshot VGS_INFO=$(kubectl --kubeconfig=${KUBECONFIG_PATH} -n ${NAMESPACE} get vgs ${VGS_NAME} -o json) # Validasi bahwa pemetaan PVC-snapshot tersedia if ! echo ${VGS_INFO} | jq -e '.status.pvcVolumeSnapshotRefList' &>/dev/null; then echo "Error: .status.pvcVolumeSnapshotRefList tidak ditemukan di VolumeGroupSnapshot." exit 1 fi # Ekstrak nama PVC dan nama snapshot yang sesuai PVCS=($(echo ${VGS_INFO} | jq -r '.status.pvcVolumeSnapshotRefList[].persistentVolumeClaimRef.name')) SNAPSHOTS=($(echo ${VGS_INFO} | jq -r '.status.pvcVolumeSnapshotRefList[].volumeSnapshotRef.name')) # Kosongkan file output > ${OUTPUT_FILE} # Hasilkan satu manifes PVC per disk 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}"</details> Skrip ini menerima enam parameter posisi:
-
Jalankan skrip untuk menghasilkan manifes PVC:
bash generate_pvc.sh default group-snapshot-demo alicloud-disk-essd 20Gi .kube/config ./output.yamlFile
output.yamlyang dihasilkan akan mirip dengan:--- 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.ioEdit file
output.yamljika diperlukan, lalu terapkan:kubectl apply -f output.yaml -
Ubah jumlah replika StatefulSet kembali menjadi dua:
kubectl scale sts mysql --replicas=2 -
Setelah pod dimulai ulang, verifikasi bahwa data telah dipulihkan:
kubectl exec -it mysql-0 -- bash # Buka shell di dalam pod mysql -uroot -p123456 # Hubungkan ke MySQL use test; select * from scores;Output yang diharapkan:
+------+-------+ | name | score | +------+-------+ | Amy | 95 | +------+-------+