Gunakan CLI Terraform untuk men-deploy custom resources (CRs) guna mengelola repositori backup, backup aplikasi, dan pemulihan aplikasi di kluster ACK Anda. Pendekatan ini memungkinkan Anda mengelola seluruh alur kerja backup dan migrasi sebagai infrastruktur kode.
Prasyarat
Sebelum memulai, pastikan Anda telah memiliki:
Kluster ACK yang dikelola berjalan Kubernetes 1.18 atau lebih baru, yang dibuat menggunakan Terraform. Untuk informasi lebih lanjut, lihat Gunakan Terraform untuk membuat kluster ACK yang dikelola.
Komponen migrate-controller terinstal dengan izin yang diperlukan. Untuk informasi lebih lanjut, lihat Instal komponen migrate-controller dan berikan izin. Anda juga dapat menggunakan Terraform untuk menginstal komponen tersebut. Untuk informasi lebih lanjut, lihat Gunakan Terraform untuk menginstal komponen.
Bucket Object Storage Service (OSS) untuk menyimpan backup. Nama bucket harus diawali dengan
cnfs-oss-. Untuk informasi lebih lanjut, lihat Buat bucket menggunakan Terraform dan alicloud_oss_bucket.(Opsional) Jika Anda ingin melakukan backup persistent volumes (PVs), layanan ECS Snapshot dan Cloud Backup harus diaktifkan. Untuk informasi lebih lanjut, lihat Aktifkan OSS, Aktifkan ECS Snapshot, dan Aktifkan Cloud Backup.
Catatan penggunaan
Jangan gunakan
kubectl deleteuntuk menghapus pekerjaan backup atau pemulihan. Sumber daya cloud terkait mungkin tidak sepenuhnya dibersihkan. Untuk menghapus sumber daya terkait backup, ikuti Langkah 5: Hapus sumber daya dari pusat cadangan.Perbarui komponen migrate-controller ke versi terbaru. Untuk informasi lebih lanjut, lihat Kelola komponen.
Jangan hapus parameter dari kode contoh. Parameter yang hilang dapat mencegah backup dipulihkan.
Langkah 1: Asosiasikan kluster
Gunakan provider Kubernetes untuk menghubungkan Terraform ke kluster Anda. Untuk informasi lebih lanjut, lihat Kubernetes Provider.
Contoh berikut menggunakan file kubeconfig untuk mengasosiasikan kluster.
Buat direktori kerja Terraform.
Di direktori kerja, buat file konfigurasi bernama
csdr.tf. Tambahkan konten berikut untuk mengonfigurasi provider Kubernetes:provider "kubernetes" { config_path = "~/.kube/config" }Jalankan perintah berikut untuk menginisialisasi lingkungan runtime Terraform:
terraform initOutput berikut menunjukkan bahwa Terraform telah berhasil diinisialisasi:
Langkah 2: Buat repositori backup
Tambahkan konten berikut ke
csdr.tfdan sesuaikan parameter sesuai kebutuhan:Parameter Wajib Deskripsi nameYa Nama repositori backup. Harus mematuhi konvensi penamaan Kubernetes. networkYa Mode jaringan untuk mengakses bucket OSS. Nilai yang valid: internal(semua kluster yang diasosiasikan harus berada di wilayah yang sama dengan bucket) danpublic(tidak ada batasan wilayah).regionYa Wilayah tempat bucket OSS berada. bucketYa Nama bucket OSS. Harus diawali dengan cnfs-oss-.prefixTidak Subdirektori dalam bucket OSS. Jika ditentukan, backup disimpan di subdirektori ini. resource "kubernetes_manifest" "backuplocation-demo" { manifest = { apiVersion = "csdr.alibabacloud.com/v1beta1" kind = "BackupLocation" metadata = { name = "<yourBackupLocationName>" namespace = "csdr" } spec = { backupSyncPeriod = "0s" config = { network = "internal" region = "cn-beijing" } objectStorage = { bucket = "<cnfs-oss-yourBucketName>" prefix = "<subDir>" } provider = "alibabacloud" } } wait { fields = { "status.phase" = "Available" } } timeouts { create = "10m" } }Jalankan perintah berikut untuk melihat pratinjau paket sumber daya:
terraform planJalankan perintah berikut untuk membuat repositori backup:
terraform applyOutput berikut menunjukkan bahwa repositori backup telah dibuat:
Langkah 3: Buat pekerjaan backup
Pilih jenis backup berdasarkan skenario Anda:
Backup aplikasi: Membuat backup aplikasi yang berjalan di kluster, termasuk sumber daya kluster dan volume persisten yang digunakan oleh aplikasi tersebut.
Perlindungan data: Membuat backup hanya data volume persisten. Hanya persistent volume claims (PVCs) dan PVs yang disertakan.
Untuk perbandingan kedua mode ini, lihat Skenario untuk backup aplikasi dan perlindungan data.
Backup aplikasi
Buat backup instan
Tambahkan konten berikut ke
csdr.tfdan sesuaikan parameter sesuai kebutuhan:Blok
waitdikomentari karena durasi backup bervariasi. Untuk membuat Terraform menunggu hingga selesai, hapus komentar pada blokwaitdantimeoutsserta sesuaikan timeout sesuai kebutuhan.Parameter Wajib Deskripsi csdr.alibabacloud.com/backuplocationsYa Informasi tentang repositori backup. Harus sesuai dengan konfigurasi repositori backup. nameYa Nama backup instan. includedNamespacesYa Namespace yang akan disertakan dalam backup. includedResourcesTidak Jenis sumber daya kluster yang akan disertakan. Konfigurasikan hanya salah satu dari includedResourcesatauexcludedResources. Jika keduanya dikosongkan, semua jenis sumber daya akan dibackup.excludedResourcesTidak Jenis sumber daya kluster yang akan dikecualikan. Konfigurasikan hanya salah satu dari includedResourcesatauexcludedResources. Jika keduanya dikosongkan, semua jenis sumber daya akan dibackup.matchLabelsTidak Label yang digunakan untuk memfilter sumber daya. Hanya sumber daya dengan label yang sesuai yang akan dibackup. includeClusterResourcesTidak Apakah akan membackup sumber daya tingkat kluster (misalnya, StorageClasses, CustomResourceDefinitions (CRDs), dan webhook). true: backup semua sumber daya tingkat kluster.false(default di Konsol ACK): backup hanya sumber daya tingkat kluster yang dirujuk oleh sumber daya tingkat namespace di namespace yang ditentukan — misalnya, cluster role yang digunakan oleh service account pod, atau CRD untuk resource kustom.defaultPvBackupTidak Apakah akan menyertakan volume persisten. true: backup aplikasi dan volume persistennya.false: backup hanya aplikasi.storageLocationYa Nama repositori backup. Jika kluster Anda sudah menggunakan Velero, bergabunglah dengan grup DingTalk (ID: 35532895) untuk bantuan. ttlYa Periode retensi. Data tidak dapat dipulihkan setelah backup kedaluwarsa. Format: 720h0m0s. Rentang valid:24h0m0shingga1572864h0m0s.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 = { includedNamespaces = ["default","default1"] includedResources = ["statefulset"] excludedResources = ["excludedResources"] labelSelector = { matchLabels = { "app" = "mysql-sts" } } pvBackup = { defaultPvBackup = "false" } storageLocation = "<yourBackupLocationName>" ttl = "720h0m0s" includeClusterResources = "false" } } # The backup is complete when status.phase changes to Completed. # Backup duration depends on the number of resources and the volume of persistent volume data. #wait { # fields = { # "status.phase" = "Completed" # } #} #timeouts { # create = "60m" #} }Jalankan perintah berikut untuk melihat pratinjau paket sumber daya:
terraform planJalankan perintah berikut untuk membuat backup instan:
terraform applyOutput berikut menunjukkan bahwa pekerjaan backup telah dibuat:
kubernetes_manifest.applicationbackup-demo: Creating... kubernetes_manifest.applicationbackup-demo: Creation complete after 1s Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
Buat jadwal backup
Tambahkan konten berikut ke
csdr.tfdan sesuaikan parameter sesuai kebutuhan: <details> <summary>View configuration file</summary>Parameter Wajib Deskripsi csdr.alibabacloud.com/backuplocationsYa Informasi tentang repositori backup. Harus sesuai dengan konfigurasi repositori backup. nameYa Nama jadwal backup. scheduleYa Jadwal backup dalam format cron. Urutan field cron: menit jam hari-bulan bulan hari-minggu. Misalnya,"1 4 * * *"menjalankan backup setiap hari pukul 04:01. Untuk detail format, lihat Bagaimana cara menentukan siklus backup saat membuat rencana cadangan?. Referensi cepat:# ┌── menit (0–59) ┌── jam (0–23) ┌── hari-bulan (1–31) ┌── bulan (1–12) ┌── hari-minggu (0–6, Minggu=0)includedNamespacesYa Namespace yang akan disertakan dalam backup. includedResourcesTidak Jenis sumber daya kluster yang akan disertakan. Konfigurasikan hanya salah satu dari includedResourcesatauexcludedResources. Jika keduanya dikosongkan, semua jenis sumber daya akan dibackup.excludedResourcesTidak Jenis sumber daya kluster yang akan dikecualikan. Konfigurasikan hanya salah satu dari includedResourcesatauexcludedResources. Jika keduanya dikosongkan, semua jenis sumber daya akan dibackup.matchLabelsTidak Label yang digunakan untuk memfilter sumber daya. Hanya sumber daya dengan label yang sesuai yang akan dibackup. includeClusterResourcesTidak Apakah akan membackup sumber daya tingkat kluster. Lihat deskripsi pada tabel parameter backup instan di atas. defaultPvBackupYa Apakah akan menyertakan volume persisten. true: backup aplikasi dan volume persistennya.false: backup hanya aplikasi.storageLocationYa Nama repositori backup. Jika kluster Anda sudah menggunakan Velero, bergabunglah dengan grup DingTalk (ID: 35532895) untuk bantuan. ttlYa Periode retensi. Format: 720h0m0s. Rentang valid:24h0m0shingga1572864h0m0s.Jalankan perintah berikut untuk melihat pratinjau paket sumber daya:
terraform planJalankan perintah berikut untuk membuat jadwal backup:
terraform applyOutput berikut menunjukkan bahwa jadwal backup telah dibuat:
kubernetes_manifest.backupschedule-demo: Creating... kubernetes_manifest.backupschedule-demo: Creation complete after 1s Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
Operasi lainnya
Temukan backup yang dibuat oleh jadwal backup
Gunakan labelSelector untuk mencantumkan backup yang dibuat oleh jadwal tertentu:
data "kubernetes_resources" "list-applicationbackup" {
api_version = "csdr.alibabacloud.com/v1beta1"
kind = "ApplicationBackup"
namespace = "csdr"
label_selector = "csdr/schedule-name=terraform-schedule-test"
}
output "applicationbackup-name" {
value = data.kubernetes_resources.list-applicationbackup.objects
}Ubah jadwal backup
Atur
spec.pausedmenjaditrueuntuk menjeda jadwal, lalu ubah field lain sepertispec.schedule:Jalankan perintah berikut untuk melihat pratinjau perubahan:
terraform planOutput berikut menunjukkan bahwa paket sumber daya telah dibuat:
kubernetes_manifest.backupschedule-demo: Refreshing state... Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols: ~ update in-place Terraform will perform the following actions: # kubernetes_manifest.backupschedule-demo will be updated in-place ~ resource "kubernetes_manifest" "backupschedule-demo" { ~ manifest = { ~ spec = { ~ paused = "false" -> "true" ~ schedule = "1 4 * * *" -> "0 5 * * *" # (1 unchanged attribute hidden) } # (3 unchanged attributes hidden) } ~ object = { ~ spec = { ~ paused = false -> true ~ schedule = "1 4 * * *" -> "0 5 * * *" # (2 unchanged attributes hidden) } # (3 unchanged attributes hidden) } ~ wait { ~ fields = { ~ "status.phase" = "Enabled" -> "Paused" } } # (1 unchanged block hidden) } Plan: 0 to add, 1 to change, 0 to destroy.Jalankan perintah berikut untuk menerapkan perubahan:
terraform applyOutput berikut menunjukkan bahwa jadwal backup telah diperbarui:
kubernetes_manifest.backupschedule-demo: Modifying... kubernetes_manifest.backupschedule-demo: Modifications complete after 1s Apply complete! Resources: 0 added, 1 changed, 0 destroyed.
Perlindungan data
Buat backup instan
Tambahkan konten berikut ke
csdr.tfdan sesuaikan parameter 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" } } # The backup is complete when status.phase changes to Completed. # Backup duration depends on the volume of persistent volume data. #wait { # fields = { # "status.phase" = "Completed" # } #} #timeouts { # create = "60m" #} } }Jalankan perintah berikut untuk melihat pratinjau paket sumber daya:
terraform planJalankan perintah berikut untuk membuat backup instan:
terraform applyOutput berikut menunjukkan bahwa pekerjaan backup telah dibuat:
Buat rencana backup
Tambahkan konten berikut ke
csdr.tfdan sesuaikan parameter sesuai kebutuhan: <details> <summary>View configuration file</summary>Parameter Wajib Deskripsi csdr.alibabacloud.com/backuplocationsYa Informasi tentang repositori backup. Harus sesuai dengan konfigurasi repositori backup. nameYa Nama rencana backup. scheduleYa Jadwal backup dalam format cron. Urutan field cron: menit jam hari-bulan bulan hari-minggu. Untuk detail format, lihat Bagaimana cara menentukan siklus backup saat membuat rencana cadangan?.includedNamespacesYa Namespace yang akan disertakan dalam backup. pvcListTidak Menentukan PVC mana yang akan dibackup berdasarkan nama dan namespace. Jika pvcListdanstorageClassListkeduanya ditentukan,storageClassListdiabaikan. Jika tidak ada yang ditentukan, semua PV di namespace yang ditentukan akan dibackup.storageClassListTidak Menentukan StorageClasses dari PV yang akan dibackup. storageLocationYa Nama repositori backup. Jika kluster Anda sudah menggunakan Velero, bergabunglah dengan grup DingTalk (ID: 35532895) untuk bantuan. ttlYa Periode retensi. Format: 720h0m0s. Rentang valid:24h0m0shingga1572864h0m0s.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" } } } wait { fields = { "status.phase" = "Enabled" } } timeouts { create = "10m" } }Jalankan perintah berikut untuk melihat pratinjau paket sumber daya:
terraform planJalankan perintah berikut untuk membuat rencana backup:
terraform applyOutput berikut menunjukkan bahwa rencana backup telah dibuat:
kubernetes_manifest.backupschedule-demo: Creating... kubernetes_manifest.backupschedule-demo: Creation complete after 1s Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
Langkah 4: Buat pekerjaan pemulihan
Tambahkan konten berikut ke
csdr.tfdan sesuaikan parameter sesuai kebutuhan:Blok
waitdikomentari karena durasi pemulihan bervariasi. Untuk membuat Terraform menunggu hingga selesai, hapus komentar pada blokwaitdantimeoutsserta sesuaikan timeout sesuai kebutuhan.Parameter Wajib Deskripsi csdr.alibabacloud.com/backuplocationsYa Informasi tentang repositori backup. Harus sesuai dengan konfigurasi repositori backup. nameYa Nama pekerjaan pemulihan. appRestoreOnlyTidak Berlaku hanya untuk tugas backup aplikasi (bukan perlindungan data). Menentukan apakah hanya aplikasi yang dipulihkan tanpa memulihkan PVC, PV, atau data volume. true: pulihkan hanya aplikasi (buat manual PVC dan PV terlebih dahulu jika mengubah sumber data).false(default): pulihkan aplikasi dan semua data volume.preserveNodePortsTidak Berlaku hanya untuk tugas backup aplikasi (bukan perlindungan data). Menentukan apakah NodePort dipertahankan. Jika kluster backup dan pemulihan menggunakan NodePort yang sama, atur nilai ini menjadi falseuntuk menetapkan port acak. Dalam kasus lain, atur menjaditrue.includedNamespacesYa Namespace yang akan dipulihkan. Jika dikosongkan, semua namespace yang dibackup akan dipulihkan. includedResourcesTidak Berlaku hanya untuk tugas backup aplikasi. Jenis sumber daya kluster yang akan disertakan dalam pemulihan. Konfigurasikan hanya salah satu dari includedResourcesatauexcludedResources. Jika keduanya dikosongkan, semua jenis sumber daya akan dipulihkan.excludedResourcesTidak Berlaku hanya untuk tugas backup aplikasi. Jenis sumber daya kluster yang akan dikecualikan dari pemulihan. Konfigurasikan hanya salah satu dari includedResourcesatauexcludedResources. Jika keduanya dikosongkan, semua jenis sumber daya akan dipulihkan.backupNameYa Nama backup yang akan dipulihkan. Untuk backup terjadwal, tentukan nama backup titik waktu tertentu. Nama backup mengikuti format <BackupScheduleName>-<Timestamp>, di mana<Timestamp>menggunakan formatYYYYMMDDhhmmss(misalnya,my-schedule-20221205225845).namespaceMappingTidak Memetakan namespace di kluster backup ke namespace di kluster pemulihan. <backupNamespace>: namespace dari backup.<restoreNamespace>: namespace target di kluster pemulihan. Jika namespace target tidak ada, akan dibuat secara otomatis. Jika parameter ini dikosongkan, sumber daya dipulihkan ke namespace yang sama seperti dalam backup.imageRegistryMappingTidak Mengubah alamat registri image selama pemulihan. <oldimageregistry></oldimageregistry>: alamat registri asli.<newImageRegistry>: alamat registri target. Jika tidak diatur, konfigurasi image tetap tidak berubah.convertedargTidak Mengonversi StorageClasses untuk volume tipe filesystem (OSS, NAS, CPFS, dan volume lokal) selama pemulihan. Jenis target yang didukung: StorageClass disk atau NAS. StorageClass harus ada di kluster saat ini. Field wajib: convertToStorageClassType(StorageClass target),namespace(namespace PVC), danpersistentVolumeClaim(nama PVC). Field opsional:convertToAccessModes(mode akses target).PentingSaat memulihkan volume ReadWriteMany atau ReadOnlyMany ke disk, atur
convertToAccessModesmenjadiReadWriteOnceuntuk mencegah disk dilepas paksa. Untuk menanyakan informasi PVC dalam backup, jalankankubectl -ncsdr describe <backup-name>dan periksastatus.resourceList.dataResource.pvcBackupInfo.resource "kubernetes_manifest" "applicationrestore-demo" { manifest = { apiVersion = "csdr.alibabacloud.com/v1beta1" kind = "ApplicationRestore" metadata = { name = "<yourApplicationRestoreName>" namespace = "csdr" annotations = { "csdr.alibabacloud.com/backuplocations" = "{\"name\":\"<yourBackupLocationName>\",\"region\":\"cn-beijing\",\"bucket\":\"<cnfs-oss-yourBucketName>\",\"prefix\":\"<subDir>\",\"provider\":\"alibabacloud\"}" } } spec = { appRestoreOnly = "false" preserveNodePorts = "true" includedNamespaces = ["default","default1"] includedResources = ["statefulset"] excludedResources = ["excludedResources"] convertedarg = [ { convertToStorageClassType = "alicloud-disk-topology-alltype" namespace = "default" persistentVolumeClaim = "pvc-nas" }, { convertToStorageClassType = "alicloud-disk-topology-alltype" namespace = "default1" persistentVolumeClaim = "pvc-oss" } ] backupName = "<yourApplicationBackupName>" namespaceMapping = { "<backupNamespace>" = "<restoreNamespace>" } } } # The restore is complete when status.phase changes to Completed. # Restore duration depends on the number of resources and the volume of persistent volume data. #wait { # fields = { # "status.phase" = "Completed" # } #} #timeouts { # create = "60m" #} }Jalankan perintah berikut untuk melihat pratinjau paket sumber daya:
terraform planJalankan perintah berikut untuk membuat pekerjaan pemulihan:
terraform applyOutput berikut menunjukkan bahwa pekerjaan pemulihan telah dibuat:
Langkah 5: Hapus sumber daya dari pusat cadangan
Kluster lain mungkin juga menggunakan repositori backup yang Anda buat. Menghapus objek BackupLocation tidak didukung.
Hapus jadwal backup
Jalankan terraform destroy untuk menghapus sumber daya BackupSchedule dan menghentikan backup terjadwal.
Hapus pekerjaan backup atau pemulihan
Tambahkan konten berikut ke
csdr.tfdan sesuaikan parameter sesuai kebutuhan:Parameter Wajib Deskripsi nameYa Nama permintaan penghapusan. Untuk pekerjaan backup, gunakan format <ApplicationBackupName>-dbr. Untuk pekerjaan pemulihan, gunakan format<ApplicationRestoreName>-dbr.deleteObjectNameYa Nama sumber daya yang akan dihapus. deleteObjectTypeYa Jenis sumber daya yang akan dihapus. "Backup": menghapus objek ApplicationBackup dan sumber daya terkaitnya."Restore": menghapus objek ApplicationRestore dan sumber daya terkaitnya. Menghapus pekerjaan backup tidak memengaruhi backup yang sudah dibuat di kluster. Menghapus pekerjaan pemulihan tidak memengaruhi data yang telah dipulihkan.resource "kubernetes_manifest" "deleterequest-demo" { manifest = { apiVersion = "csdr.alibabacloud.com/v1beta1" kind = "DeleteRequest" metadata = { name = "<objectName-dbr>" namespace = "csdr" } spec = { deleteObjectName = "<objectName>" deleteObjectType = "Backup" } } }Jalankan perintah berikut untuk melihat pratinjau paket sumber daya:
terraform planJalankan perintah berikut untuk mengirim permintaan penghapusan:
terraform applyOutput berikut menunjukkan bahwa permintaan penghapusan telah diproses:
Setelah pekerjaan backup atau pemulihan dihapus, sumber daya DeleteRequest akan dihapus secara otomatis.
Langkah selanjutnya
Untuk backup dan pulihkan aplikasi menggunakan kubectl, lihat Backup dan pulihkan aplikasi di kluster menggunakan kubectl.
Untuk mengelola backup di Konsol ACK, lihat topik berikut: