Kelola penyimpanan cadangan (backup vault), jadwal, dan pemulihan lintas kluster di ACK melalui resource kustom Terraform.
Prasyarat
Sebelum memulai, pastikan Anda telah:
-
Kluster ACK yang dikelola (ACK managed cluster) yang menjalankan Kubernetes 1.18 atau versi lebih baru.
-
migrate-controller terinstal dengan izin yang diperlukan. Atau instal dengan Terraform.
-
Bucket OSS yang namanya diawali dengan
cnfs-oss-. Gunakan Terraform untuk mengelola OSS dan alicloud_oss_bucket. -
(Jika melakukan backup volume) Snapshot Elastic Compute Service (ECS) dan Cloud Backup telah diaktifkan. Aktifkan OSS, Aktifkan snapshot ECS, dan Aktifkan Cloud Backup.
Catatan penggunaan
-
Jangan jalankan
kubectl deleteuntuk menghapus tugas backup atau pemulihan — sumber daya cloud mungkin tidak sepenuhnya dibersihkan. Lihat Langkah 5: Hapus sumber daya. -
Perbarui migrate-controller secara berkala. Lihat Kelola komponen.
-
Jangan hapus parameter dari contoh kode di bawah ini. Parameter yang hilang dapat mencegah pemulihan backup.
Langkah 1: Hubungkan ke kluster
Gunakan Terraform Kubernetes provider untuk terhubung ke kluster Anda melalui file KubeConfig.
-
Buat direktori kerja Terraform.
-
Di dalam direktori tersebut, buat file bernama
csdr.tf:provider "kubernetes" { config_path = "~/.kube/config" } -
Inisialisasi Terraform:
terraform init
Langkah 2: Buat penyimpanan cadangan (backup vault)
Penyimpanan cadangan (BackupLocation CR) menentukan bucket OSS dan metode akses untuk backup.
-
Tambahkan berikut ini ke
csdr.tf, ganti placeholder-nya:Parameter Wajib Deskripsi nameYa Nama penyimpanan cadangan. Harus sesuai dengan konvensi penamaan Kubernetes. networkYa Mode jaringan untuk mengakses bucket OSS. internal: semua kluster harus berada di wilayah yang sama dengan bucket.public: tidak ada batasan wilayah.regionYa Wilayah tempat bucket OSS berada. bucketYa Nama bucket OSS. Harus diawali dengan cnfs-oss-.prefixTidak Subdirektori dalam bucket OSS untuk penyimpanan backup. providerYa Penyedia cloud. Tetapkan ke alibabacloud.resource "kubernetes_manifest" "backuplocation-demo" { manifest = { apiVersion = "csdr.alibabacloud.com/v1beta1" kind = "BackupLocation" metadata = { name = "<your-backup-vault-name>" # Harus sesuai dengan konvensi penamaan Kubernetes namespace = "csdr" } spec = { backupSyncPeriod = "0s" config = { network = "internal" # "internal": bucket dan kluster harus berada di wilayah yang sama # "public": tidak ada batasan wilayah region = "cn-beijing" # Wilayah tempat bucket OSS berada } objectStorage = { bucket = "<cnfs-oss-your-bucket-name>" # Harus diawali dengan cnfs-oss- prefix = "<sub-directory>" # Opsional: simpan backup di subdirektori ini } provider = "alibabacloud" } } # Tunggu hingga penyimpanan cadangan siap sebelum melanjutkan wait { fields = { "status.phase" = "Available" } } timeouts { create = "10m" } } -
Pratinjau perubahan:
terraform plan -
Buat penyimpanan cadangan:
terraform apply
Langkah 3: Buat tugas backup
ACK mendukung dua mode backup: backup instan (dijalankan sekali sesuai permintaan) dan backup terjadwal (dijalankan berdasarkan jadwal cron).
Buat tugas backup instan
-
Tambahkan berikut ini ke
csdr.tf, ganti placeholder-nya:Jika kluster ACK Anda menggunakan Velero, bergabunglah dengan grup DingTalk 35532895 untuk dukungan teknis.
Parameter Wajib Deskripsi csdr.alibabacloud.com/backuplocationsYa Anotasi penyimpanan cadangan. Harus persis sesuai dengan konfigurasi BackupLocation. nameYa Nama tugas backup instan. includedNamespacesYa Namespace yang akan dibackup. includedResourcesTidak Jenis resource yang disertakan. Tentukan hanya salah satu dari includedResourcesatauexcludedResources. Jika keduanya kosong, semua jenis resource akan dibackup.excludedResourcesTidak Jenis resource yang dikecualikan. Lihat includedResources.matchLabelsTidak Label dari resource yang akan dibackup. includeClusterResourcesTidak Mengontrol resource berskala kluster. true: semua resource berskala kluster.falseatau tidak diatur: hanya yang dirujuk oleh namespace yang ditentukan. Nilai default di Konsol ACK:false.defaultPvBackupTidak true: backup aplikasi dan volume.false: backup hanya aplikasi.storageLocationYa Nama penyimpanan cadangan (BackupLocation). ttlYa Periode validitas backup. Format: 720h0m0s. Rentang valid:24h0m0shingga1572864h0m0s. Backup yang kedaluwarsa tidak dapat dipulihkan.resource "kubernetes_manifest" "applicationbackup-demo" { manifest = { apiVersion = "csdr.alibabacloud.com/v1beta1" kind = "ApplicationBackup" metadata = { name = "<your-backup-task-name>" namespace = "csdr" annotations = { # Harus persis sesuai dengan konfigurasi penyimpanan cadangan "csdr.alibabacloud.com/backuplocations" = "{\"name\":\"<your-backup-vault-name>\",\"region\":\"cn-beijing\",\"bucket\":\"<cnfs-oss-your-bucket-name>\",\"prefix\":\"<sub-directory>\",\"provider\":\"alibabacloud\"}" } } spec = { includedNamespaces = ["default", "default1"] # Namespace yang akan dibackup # Tentukan hanya salah satu dari includedResources atau excludedResources. # Jika keduanya kosong, semua jenis resource akan dibackup. includedResources = ["statefulset"] excludedResources = ["excludedResources"] labelSelector = { matchLabels = { "app" = "mysql-sts" # Opsional: backup hanya resource dengan label ini } } pvBackup = { defaultPvBackup = "false" # "true": backup aplikasi dan volume; "false": hanya aplikasi } storageLocation = "<your-backup-vault-name>" # Harus sesuai dengan nama BackupLocation ttl = "720h0m0s" # Periode validitas backup. Format: 720h0m0s # Rentang valid: 24h0m0s hingga 1572864h0m0s # Backup yang kedaluwarsa tidak dapat dipulihkan # includeClusterResources mengontrol apakah resource berskala kluster disertakan: # "true" — sertakan semua resource berskala kluster (StorageClasses, CRDs, webhook, dll.) # "false" — sertakan hanya resource berskala kluster yang dirujuk oleh namespace yang ditentukan # (misalnya, jika pod menggunakan service account dengan cluster role, # cluster role tersebut secara otomatis disertakan) # Tidak diatur — perilaku sama seperti "false" saat menggunakan filter namespace includeClusterResources = "false" } } # Hapus komentar untuk menunggu hingga backup selesai (disarankan untuk alur kerja skrip). # Durasi backup tergantung pada jumlah aplikasi dan ukuran data volume. #wait { # fields = { # "status.phase" = "Completed" # } #} #timeouts { # create = "60m" #} } -
Pratinjau perubahan:
terraform plan -
Buat tugas backup instan:
terraform apply
Buat tugas backup terjadwal
-
Tambahkan berikut ini ke
csdr.tf, ganti placeholder-nya:Parameter Wajib Deskripsi csdr.alibabacloud.com/backuplocationsYa Anotasi penyimpanan cadangan. Harus persis sesuai dengan konfigurasi BackupLocation. nameYa Nama tugas backup terjadwal. scheduleYa Frekuensi backup dalam bentuk ekspresi cron. Format: menit jam hari-dalam-bulan bulan hari-dalam-minggu. Contoh:"1 4 * * *"dijalankan setiap hari pukul 04:01.includedNamespacesYa Namespace yang akan dibackup. includedResourcesTidak Jenis resource yang disertakan. Tentukan hanya salah satu dari includedResourcesatauexcludedResources. Jika keduanya kosong, semua jenis resource akan dibackup.excludedResourcesTidak Jenis resource yang dikecualikan. Lihat catatan untuk includedResources.matchLabelsTidak Label dari resource yang akan dibackup. includeClusterResourcesTidak Mengontrol resource berskala kluster. true: semua resource berskala kluster.falseatau tidak diatur: hanya yang dirujuk oleh namespace yang ditentukan.defaultPvBackupYa true: backup aplikasi dan volume.false: backup hanya aplikasi.storageLocationYa Nama penyimpanan cadangan (BackupLocation). ttlYa Periode validitas backup. Format: 720h0m0s. Rentang valid:24h0m0shingga1572864h0m0s. -
Pratinjau perubahan:
terraform plan -
Buat tugas backup terjadwal:
terraform apply
Kelola tugas backup terjadwal
Temukan backup yang dibuat oleh jadwal
Daftar backup dari jadwal tertentu:
data "kubernetes_resources" "list-applicationbackup" {
api_version = "csdr.alibabacloud.com/v1beta1"
kind = "ApplicationBackup"
namespace = "csdr"
label_selector = "csdr/schedule-name=<your-schedule-name>"
}
output "applicationbackup-name" {
value = data.kubernetes_resources.list-applicationbackup.objects
}
Ubah tugas backup terjadwal
Untuk mengubah parameter seperti frekuensi jadwal:
-
Tetapkan
spec.pausedke"true"untuk menjeda jadwal, lalu perbarui parameter. Contoh: -
Pratinjau perubahan:
terraform plan -
Terapkan konfigurasi yang diperbarui:
terraform applyOutput yang diharapkan:
kubernetes_manifest.backupschedule-demo: Modifying... kubernetes_manifest.backupschedule-demo: Modifications complete after 1s Apply complete! Resources: 0 added, 1 changed, 0 destroyed.
Proteksi data (PvBackup)
Tetapkan backupType ke PvBackup untuk hanya melakukan backup data volume. Tentukan pvcList untuk backup PVC tertentu, atau storageClassList untuk backup volume dari StorageClass tertentu. Jika Anda menetapkan keduanya, storageClassList akan diabaikan. Jika tidak menetapkan keduanya, semua volume dalam namespace yang disertakan akan dibackup.
Buat tugas PvBackup instan
-
Tambahkan berikut ini ke
csdr.tf, sesuaikan nilai sesuai kebutuhan:resource "kubernetes_manifest" "applicationbackup-demo" { manifest = { apiVersion = "csdr.alibabacloud.com/v1beta1" kind = "ApplicationBackup" metadata = { name = "<yourApplicationBackupName>" namespace = "csdr" annotations = { "csdr.alibabacloud.com/backuplocations" = "{\"name\":\"<yourBackuplocationName>\",\"region\":\"cn-beijing\",\"bucket\":\"<cnfs-oss-yourBucketName>\",\"prefix\":\"<subDir>\",\"provider\":\"alibabacloud\"}" } } spec = { backupType = "PvBackup" includedNamespaces = ["default","default1"] pvBackup = { pvcList = [ { namespace = "default", name = "pvc-nas" }, { namespace = "default1", name = "pvc-oss" } ] storageClassList = ["disk-essd","disk-ssd"] } storageLocation = "<yourBackuplocationName>" ttl = "720h0m0s" } } } -
Hasilkan rencana sumber daya:
terraform plan -
Buat tugas backup instan:
terraform apply
Buat jadwal PvBackup
-
Tambahkan berikut ini ke
csdr.tf, sesuaikan nilai sesuai kebutuhan:resource "kubernetes_manifest" "backupschedule-demo" { manifest = { apiVersion = "csdr.alibabacloud.com/v1beta1" kind = "BackupSchedule" metadata = { name = "<yourBackupScheduleName>" namespace = "csdr" annotations = { "csdr.alibabacloud.com/backuplocations" = "{\"name\":\"<yourBackuplocationName>\",\"region\":\"cn-beijing\",\"bucket\":\"<cnfs-oss-yourBucketName>\",\"prefix\":\"<subDir>\",\"provider\":\"alibabacloud\"}" } } spec = { schedule = "1 4 * * *" template = { includedNamespaces = ["default","default1"] pvBackup = { pvcList = [ { namespace = "default", name = "pvc-nas" }, { namespace = "default1", name = "pvc-oss" } ] storageClassList = ["disk-essd","disk-ssd"] } storageLocation = "<yourBackuplocationName>" ttl = "720h0m0s" } } } } -
Hasilkan rencana sumber daya dan terapkan:
terraform plan terraform apply
Langkah 4: Buat tugas pemulihan
Tugas pemulihan (ApplicationRestore CR) memulihkan aplikasi dari backup, dengan opsi pemetaan ulang namespace dan konversi StorageClass.
-
Tambahkan berikut ini ke
csdr.tf, ganti placeholder-nya:Parameter Wajib Deskripsi csdr.alibabacloud.com/backuplocationsYa Anotasi penyimpanan cadangan. Harus sesuai dengan konfigurasi BackupLocation. nameYa Nama tugas pemulihan. appRestoreOnlyTidak true: pulihkan hanya aplikasi (bukan klaim volume persisten (PVC), volume persisten (PV), atau data volume); buat PVC dan PV secara manual sebelum memulihkan.false: pulihkan aplikasi dan data volume. Default:false.preserveNodePortsTidak true: pertahankan nilai NodePort asli.false: tetapkan ulang NodePort ke port acak. Tetapkan kefalseketika kedua kluster menggunakan NodePort yang sama.includedNamespacesYa Namespace yang akan dipulihkan. Jika kosong, semua namespace yang dibackup akan dipulihkan. includedResourcesTidak Jenis resource yang disertakan. Tentukan hanya salah satu dari includedResourcesatauexcludedResources.excludedResourcesTidak Jenis resource yang dikecualikan. backupNameYa Nama backup yang akan dipulihkan. Untuk backup terjadwal, tentukan nama backup titik waktu, seperti <your-schedule-name>-20221205225845.namespaceMappingTidak Memetakan <backup-namespace>ke<target-namespace>. Namespace target yang belum ada akan dibuat secara otomatis.convertedargTidak Daftar konversi StorageClass untuk volume bertipe FileSystem (OSS, NAS, CPFS, lokal). Setiap entri menentukan convertToStorageClassType(StorageClass target; harus berupa disk atau NAS dan harus ada di kluster),namespace, danpersistentVolumeClaim. Jalankankubectl -ncsdr describe <backup-name>untuk mengidentifikasi PVC yang memenuhi syarat.PentingVolume ReadWriteMany tidak dapat dikonversi ke disk. Untuk volume ReadOnlyMany, pastikan replika tidak dipasang secara simultan di beberapa node.
resource "kubernetes_manifest" "applicationrestore-demo" { manifest = { apiVersion = "csdr.alibabacloud.com/v1beta1" kind = "ApplicationRestore" metadata = { name = "<your-restoration-task-name>" namespace = "csdr" annotations = { "csdr.alibabacloud.com/backuplocations" = "{\"name\":\"<your-backup-vault-name>\",\"region\":\"cn-beijing\",\"bucket\":\"<cnfs-oss-your-bucket-name>\",\"prefix\":\"<sub-directory>\",\"provider\":\"alibabacloud\"}" } } spec = { # "false": pulihkan aplikasi dan data volume (default) # "true": pulihkan hanya aplikasi; buat PVC dan PV secara manual terlebih dahulu appRestoreOnly = "false" # "true": pertahankan nilai NodePort asli dari backup # "false": tetapkan ulang NodePort ke port acak (gunakan saat kluster backup dan target menggunakan NodePort yang sama) preserveNodePorts = "true" includedNamespaces = ["default", "default1"] includedResources = ["statefulset"] excludedResources = ["excludedResources"] # Konversi StorageClass untuk volume bertipe FileSystem (OSS, NAS, CPFS, volume lokal). # Jalankan `kubectl -ncsdr describe <backup-name>` dan periksa # status.resourceList.dataResource.pvcBackupInfo untuk menemukan PVC yang memenuhi syarat untuk konversi. # Penting: Volume ReadWriteMany tidak dapat dikonversi ke disk. # Untuk volume ReadOnlyMany yang dikonversi ke disk, pastikan replika tidak dipasang di beberapa node secara bersamaan. convertedarg = [ { convertToStorageClassType = "alicloud-disk-topology-alltype" # StorageClass target (harus ada di kluster; hanya disk atau NAS) namespace = "default" persistentVolumeClaim = "pvc-nas" }, { convertToStorageClassType = "alicloud-disk-topology-alltype" namespace = "default1" persistentVolumeClaim = "pvc-oss" } ] # Backup yang akan dipulihkan. # Untuk backup terjadwal, tentukan nama backup titik waktu, misalnya: # "<your-schedule-name>-20221205225845" backupName = "<your-backup-task-name>" # Memetakan namespace dalam backup ke namespace berbeda di kluster target. # Jika namespace target tidak ada, akan dibuat secara otomatis. namespaceMapping = { "<backup-namespace>" = "<target-namespace>" } } } # Hapus komentar untuk menunggu hingga pemulihan selesai (disarankan untuk alur kerja skrip). # Durasi pemulihan tergantung pada jumlah aplikasi dan ukuran data volume. #wait { # fields = { # "status.phase" = "Completed" # } #} #timeouts { # create = "60m" #} } -
Pratinjau perubahan:
terraform plan -
Buat tugas pemulihan:
terraform apply
Langkah 5: Hapus sumber daya
Penyimpanan cadangan (BackupLocation) tidak dapat dihapus karena kluster lain mungkin bergantung padanya.
Hapus tugas backup terjadwal
Jalankan terraform destroy untuk menghapus BackupSchedule dan menghentikan jadwal.
Hapus tugas backup atau tugas pemulihan
Gunakan DeleteRequest CR untuk menghapus tugas backup atau pemulihan serta sumber daya cloud terkait secara aman.
Menghapus tugas backup tidak memengaruhi backup yang sudah ada. Menghapus tugas pemulihan tidak memengaruhi data yang telah dipulihkan.
-
Tambahkan berikut ini ke
csdr.tf:Parameter Wajib Deskripsi nameYa Nama permintaan penghapusan. Format: <ApplicationBackup-name>-dbruntuk menghapus tugas backup, atau<ApplicationRestore-name>-dbruntuk menghapus tugas pemulihan.deleteObjectNameYa Nama resource yang akan dihapus. deleteObjectTypeYa "Backup": menghapus ApplicationBackup CR dan resource terkait."Restore": menghapus ApplicationRestore CR dan resource terkait.resource "kubernetes_manifest" "deleterequest-demo" { manifest = { apiVersion = "csdr.alibabacloud.com/v1beta1" kind = "DeleteRequest" metadata = { name = "<object-name>-dbr" # Format: <ApplicationBackup-or-ApplicationRestore-name>-dbr namespace = "csdr" } spec = { deleteObjectName = "<object-name>" # Nama tugas backup atau pemulihan yang akan dihapus deleteObjectType = "Backup" # "Backup": menghapus ApplicationBackup dan resource terkait # "Restore": menghapus ApplicationRestore dan resource terkait } } } -
Pratinjau perubahan:
terraform plan -
Terapkan penghapusan:
terraform applySetelah menghapus resource target, sistem juga akan menghapus DeleteRequest CR.