通過kubectl實現(xiàn)集群應(yīng)用的備份和恢復(fù)
當(dāng)您無法通過容器服務(wù)控制臺操作備份中心或容災(zāi)備份需要自動化實現(xiàn)時,您可以通過kubectl命令行在備份集群和恢復(fù)集群中部署備份倉庫、應(yīng)用備份、應(yīng)用恢復(fù)的CR資源,以實現(xiàn)不同集群間應(yīng)用的遷移。
前提條件
已安裝備份服務(wù)組件并完成對應(yīng)權(quán)限的配置。具體操作,請參見安裝migrate-controller備份服務(wù)組件并配置權(quán)限。
使用場景
因權(quán)限問題,無法通過容器服務(wù)控制臺操作備份中心。
容災(zāi)備份流程需要自動化實現(xiàn)。
注意事項
備份及恢復(fù)任務(wù)不能通過kubectl的
delete
命令簡單刪除。具體操作,請參見下文步驟四:刪除集群備份中心的相關(guān)資源。關(guān)注備份中心組件migrate-controller版本發(fā)布情況,并及時升級。具體操作,請參見管理組件。
請勿刪除下文示例代碼中出現(xiàn)的配置參數(shù),以免備份恢復(fù)失敗。
步驟一:創(chuàng)建備份倉庫
使用以下內(nèi)容,在備份集群和恢復(fù)集群中創(chuàng)建backuplocation.yaml文件。
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
其余參數(shù)無需設(shè)置,保持默認(rèn)配置即可。
參數(shù)
是否必選
說明
name
是
備份倉庫的名稱,須符合K8s命名規(guī)則。
network
是
OSS Bucket的網(wǎng)絡(luò)訪問方式。取值:
internal:內(nèi)網(wǎng)訪問模式,所有關(guān)聯(lián)集群與OSS Bucket需處于同一地域。
public:公網(wǎng)訪問模式,無地域限制。
region
是
OSS Bucket所在地域。
bucket
是
OSS Bucket名稱,需提前創(chuàng)建,且名稱需符合以cnfs-oss-****開頭的命名規(guī)則。
prefix
否
OSS Bucket子目錄。設(shè)定該參數(shù)后,實際備份內(nèi)容存儲在此子目錄下。
分別在備份集群和恢復(fù)集群中執(zhí)行以下命令,部署backuplocation對象。
kubectl apply -f backuplocation.yaml
分別在備份集群和恢復(fù)集群中執(zhí)行以下命令,查看backuplocation的狀態(tài)。
kubectl describe backuplocation <yourBackuplocationName> -n csdr
預(yù)期輸出:
... Status: Last Validation Time: 2022-12-08T04:00:22Z Message: success by csdr-controller Phase: Available
由預(yù)期輸出可看到,已創(chuàng)建的備份倉庫狀態(tài)為
Available
,說明當(dāng)前集群具有訪問OSS的權(quán)限可以直接訪問。
步驟二:創(chuàng)建備份任務(wù)
創(chuàng)建立即備份任務(wù)
使用以下內(nèi)容,在備份集群中創(chuàng)建applicationbackup.yaml文件。
apiVersion: csdr.alibabacloud.com/v1beta1 kind: ApplicationBackup metadata: annotations: csdr.alibabacloud.com/backuplocations: >- {"name":"<yourBackuplocationName>","region":"cn-beijing","bucket":"<cnfs-oss-yourBucketName>","prefix":"<subDir>","provider":"alibabacloud"}} name: <yourApplicationBackupName> namespace: csdr spec: includedNamespaces: - default includedResources: - statefulset excludedResources: - deployment labelSelector: matchLabels: app: mysql-sts includeClusterResources: false pvBackup: defaultPvBackup: false storageLocation: <yourBackuplocationName> ttl: 720h0m0s
其余參數(shù)無需設(shè)置,保持默認(rèn)配置即可。
參數(shù)
是否必選
說明
csdr.alibabacloud.com/backuplocations
是
備份所在的備份倉庫信息,需與備份倉庫的配置一致。
name
是
立即備份任務(wù)的名稱。
includedNamespaces
是
指定命名空間名稱。
includedResources
否
指定集群資源類型。
重要為避免非預(yù)期備份結(jié)果,includedResources和excludedResources您只需配置一項。當(dāng)兩者均為空時,表示備份所有資源類型。
excludedResources
否
排除集群資源類型。
重要為避免非預(yù)期備份結(jié)果,includedResources和excludedResources您只需配置一項。當(dāng)兩者均為空時,表示備份所有資源類型。
matchLabels
否
指定標(biāo)簽,只備份符合的資源。
includeClusterResources
否
是否備份Cluster級別的資源,例如StorageClass、CRD、Webhook等。
true
:備份所有Cluster級別資源。false
:僅備份被選擇的命名空間中的Namespace級別資源引用的Cluster級別資源。例如,備份Pod時,引用的ServiceAccount授權(quán)了某ClusterRole,該ClusterRole將被自動備份;備份CR時,CRD將被自動備份。
說明通過容器服務(wù)管理控制臺創(chuàng)建的備份任務(wù),默認(rèn)
IncludeClusterResources
字段為false
。defaultPvBackup
是否備份存儲卷,開啟數(shù)據(jù)備份。取值:
true:備份應(yīng)用和存儲卷。
false:只備份應(yīng)用。
storageLocation
是
備份倉庫名稱。
說明若您的集群已使用Velero,請加入釘釘用戶群(釘釘群號:35532895)咨詢。
ttl
是
備份有效期,即備份任務(wù)的數(shù)據(jù)存儲有效期,過期之后數(shù)據(jù)將無法恢復(fù)。格式如720h0m0s,取值范圍:24h0m0s~1572864h0m0s。
在備份集群中執(zhí)行以下命令,部署applicationbackup對象。
kubectl apply -f applicationbackup.yaml
在備份集群中執(zhí)行以下命令,查看立即備份任務(wù)的狀態(tài)。
kubectl describe applicationbackup <yourApplicationBackupName> -n csdr
預(yù)期輸出:
... Status: Completion Timestamp: 2022-12-05T15:02:35Z Expiration: 2023-01-04T15:02:25Z Message: success Phase: Completed
當(dāng)立即備份任務(wù)由
Inprogress
轉(zhuǎn)為Completed
狀態(tài),說明立即備份任務(wù)創(chuàng)建成功。
創(chuàng)建定時備份計劃
使用以下內(nèi)容,在備份集群中創(chuàng)建backupschedule.yaml文件。
apiVersion: csdr.alibabacloud.com/v1beta1 kind: BackupSchedule metadata: annotations: csdr.alibabacloud.com/backuplocations: >- {"name":"<yourBackuplocationName>","region":"cn-beijing","bucket":"<cnfs-oss-yourBucketName>","prefix":"<subDir>","provider":"alibabacloud"} name: <yourBackupScheduleName> namespace: csdr spec: schedule: 1 4 * * * template: includedNamespaces: - default includedResources: - statefulset excludedResources: - deployment labelSelector: matchLabels: app: mysql-sts includeClusterResources: false pvBackup: defaultPvBackup: true storageLocation: <yourBackuplocationName> ttl: 720h0m0s
其余參數(shù)無需設(shè)置,保持默認(rèn)配置即可。
參數(shù)
是否必選
說明
csdr.alibabacloud.com/backuplocations
是
備份所在的備份倉庫信息,需與備份倉庫的配置一致。
name
是
定時備份計劃的名稱。
schedule
是
備份周期,請使用Cron表達(dá)式。
includedNamespaces
是
指定命名空間名稱。
includedResources
否
指定集群資源類型。
重要為避免非預(yù)期備份結(jié)果,includedResources和excludedResources您只需配置一項。當(dāng)兩者均為空時,表示備份所有資源類型。
excludedResources
否
排除集群資源類型。
重要為避免非預(yù)期備份結(jié)果,includedResources和excludedResources您只需配置一項。當(dāng)兩者均為空時,表示備份所有資源類型。
matchLabels
否
指定標(biāo)簽,只備份符合條件的資源。
includeClusterResources
否
是否備份Cluster級別的資源,例如StorageClass、CRD、Webhook等。
true
:備份所有Cluster級別資源。false
:僅備份被選擇的命名空間中的Namespace級別資源引用的Cluster級別資源。例如,備份Pod時,引用的ServiceAccount授權(quán)了某ClusterRole,該ClusterRole將被自動備份;備份CR時,CRD將被自動備份。
說明通過容器服務(wù)管理控制臺創(chuàng)建的備份任務(wù),默認(rèn)
IncludeClusterResources
字段為false
。defaultPvBackup
是
是否備份存儲卷,開啟數(shù)據(jù)備份。取值:
true:備份應(yīng)用和存儲卷。
false:只備份應(yīng)用。
storageLocation
是
備份倉庫名稱。
說明若您的集群已使用Velero,請加入釘釘用戶群(釘釘群號:35532895)咨詢。
ttl
是
備份有效期,即備份任務(wù)的數(shù)據(jù)存儲有效期,過期之后數(shù)據(jù)將無法恢復(fù)。格式如720h0m0s,取值范圍:24h0m0s~1572864h0m0s。
在備份集群中執(zhí)行以下命令,部署backupschedule對象。
kubectl apply -f backupschedule.yaml
在備份集群中執(zhí)行以下命令,查看定時備份計劃的狀態(tài)。
kubectl describe backupschedule <yourBackupScheduleName> -n csdr
預(yù)期輸出:
... Status: Last Backup: 2022-12-07T20:01:11Z Last Processed Time: 2022-12-08T13:05:37Z Phase: Enabled
當(dāng)定時備份計劃狀態(tài)為
Enabled
,表明定時備份計劃創(chuàng)建成功。在備份集群中執(zhí)行以下命令,查看定期創(chuàng)建的備份。
kubectl get applicationbackup -n csdr | grep <yourBackupScheduleName>
預(yù)期輸出:
<yourBackupScheduleName>-20221205225845 2d22h <yourBackupScheduleName>-20221206040104 2d17h <yourBackupScheduleName>-20221207040137 41h <yourBackupScheduleName>-20221208040111 17h
步驟三:創(chuàng)建恢復(fù)任務(wù)
使用以下內(nèi)容,在恢復(fù)集群中創(chuàng)建applicationrestore.yaml文件。
apiVersion: csdr.alibabacloud.com/v1beta1 kind: ApplicationRestore metadata: annotations: csdr.alibabacloud.com/backuplocations: >- {"name":"<yourBackuplocationName>","region":"cn-beijing","bucket":"<cnfs-oss-yourBucketName>","prefix":"<subDir>","provider":"alibabacloud"} name: <yourApplicationRestoreName> namespace: csdr spec: appRestoreOnly: false preserveNodePorts: true includedNamespaces: - default includedResources: - statefulset excludedResources: - secret convertedarg: - convertToStorageClassType: alicloud-disk-topology-alltype namespace: nas persistentVolumeClaim: pvc-nas - convertToStorageClassType: alicloud-disk-topology-alltype namespace: oss persistentVolumeClaim: pvc-oss backupName: <yourApplicationBackupName> namespaceMapping: <backupNamespace>: <restoreNamespace>
其余參數(shù)無需設(shè)置,保持默認(rèn)配置即可。
參數(shù)
是否必選
說明
csdr.alibabacloud.com/backuplocations
是
備份所在的備份倉庫信息,需與備份倉庫的配置一致。
name
是
恢復(fù)任務(wù)的名稱。
appRestoreOnly
否
對于備份了存儲卷的備份,是否僅恢復(fù)應(yīng)用,不恢復(fù)存儲聲明、存儲卷及其對應(yīng)的數(shù)據(jù),取值:
true:僅恢復(fù)應(yīng)用。如果您需要更改備份應(yīng)用的數(shù)據(jù)源,可以先手動創(chuàng)建存儲聲明、存儲卷,然后再創(chuàng)建恢復(fù)任務(wù)并將該參數(shù)設(shè)置為true。
false:恢復(fù)應(yīng)用以及相關(guān)的存儲數(shù)據(jù),默認(rèn)為false。
preserveNodePorts
否
是否保持應(yīng)用的NodePort端口。當(dāng)備份集群與恢復(fù)集群相同時,默認(rèn)為false,將隨機修改端口值,避免與已有的同類應(yīng)用沖突。否則設(shè)置為true。
includedNamespaces
是
指定恢復(fù)的命名空間名稱。設(shè)置為空時,表示恢復(fù)所有已備份的命名空間。
includedResources
否
指定待恢復(fù)的集群資源類型。
重要為避免非預(yù)期備份結(jié)果,includedResources和excludedResources您只需配置一項。均為空時,表示恢復(fù)所有已備份的資源類型。
excludedResources
否
排除待恢復(fù)的集群資源類型。
重要為避免非預(yù)期備份結(jié)果,includedResources和excludedResources您只需配置一項。均為空時,表示恢復(fù)所有已備份的資源類型。
backupName
是
待恢復(fù)的備份名稱。使用定期備份功能時,需要指定為某個時間點創(chuàng)建的備份名稱,例如<yourBackupScheduleName>-20221205225845。
namespaceMapping
否
重定義命名空間。取值:
<backupNamespace>:創(chuàng)建備份任務(wù)時指定的備份集群命名空間。
<restoreNamespace>:根據(jù)備份創(chuàng)建的資源在恢復(fù)集群的所在命名空間。若不設(shè)置,則默認(rèn)在同名命名空間中恢復(fù)。
說明若<restoreNamespace>不存在,將創(chuàng)建新的命名空間。
convertedarg
否
轉(zhuǎn)換存儲類列表。備份中的FileSystem數(shù)據(jù)類型的存儲卷(OSS、NAS、CPFS、本地存儲等)的存儲聲明,在當(dāng)前集群中恢復(fù)為目標(biāo)存儲類,實現(xiàn)例如NAS存儲至云盤存儲的轉(zhuǎn)換。
convertToStorageClassType:目標(biāo)存儲類,需要在當(dāng)前集群已存在。當(dāng)前版本僅支持選擇云盤或NAS類型的存儲類。
namespace:存儲聲明所在的命名空間。
persistentVolumeClaim:存儲聲明名稱。
您可以通過
kubectl -ncsdr describe <backup-name>
查詢備份的存儲聲明信息,在輸出的status.resourceList.dataResource.pvcBackupInfo
列表中dataType字段為數(shù)據(jù)類型,分為FileSystem與Snapshot,nameSpace與pvcName分別為存儲聲明所在的命名空間與存儲聲明名稱。重要對于ReadWriteMany類型的存儲卷,暫不支持恢復(fù)為云盤類型;對于ReadOnlyMany類型的存儲卷,恢復(fù)為云盤類型時,需由業(yè)務(wù)保證不會被多個節(jié)點上的副本同時掛載,造成強制拔盤。
在恢復(fù)集群中執(zhí)行以下命令,部署applicationrestore對象。
kubectl apply -f applicationrestore.yaml
在恢復(fù)集群中執(zhí)行以下命令,查看恢復(fù)任務(wù)的狀態(tài)。
kubectl describe applicationrestore <yourApplicationRestoreName> -n csdr
預(yù)期輸出:
... Status: Completion Timestamp: 2022-12-05T15:52:19Z Phase: Completed Start Timestamp: 2022-12-05T15:52:09Z
當(dāng)恢復(fù)任務(wù)由
Inprogress
轉(zhuǎn)為Completed
狀態(tài),說明恢復(fù)任務(wù)創(chuàng)建成功。
步驟四:刪除集群備份中心的相關(guān)資源
由于您已創(chuàng)建的備份倉庫可能正在被其他集群使用,所以備份中心不支持備份倉庫BackupLocation資源的刪除。
刪除定時備份計劃
執(zhí)行以下命令,刪除定時備份計劃BackupSchedule資源,停止定時備份。
kubectl delete backupschedule <yourBackupSchedule> - ncsdr
刪除備份任務(wù)或恢復(fù)任務(wù)
使用以下內(nèi)容,在待刪除任務(wù)的集群中創(chuàng)建deleterequest.yaml文件。
apiVersion: csdr.alibabacloud.com/v1beta1 kind: DeleteRequest metadata: name: <objectName-dbr> namespace: csdr spec: deleteObjectName: <objectName> deleteObjectType: "Backup"
其余參數(shù)無需設(shè)置,保持默認(rèn)配置即可。
參數(shù)
是否必選
說明
name
是
刪除請求的名稱。
刪除備份任務(wù)時:待刪除的備份任務(wù)ApplicationBackup的名稱+“-dbr”。
刪除恢復(fù)任務(wù)時:待刪除的恢復(fù)任務(wù)ApplicationRestore的名稱+“-dbr”。
deleteObjectName
是
待刪除的資源名稱。
deleteObjectType
是
待刪除的資源類型。取值:
"Backup":刪除備份任務(wù)ApplicationBackup及配套資源。
"Restore":刪除恢復(fù)任務(wù)ApplicationRestore及配套資源。
說明刪除備份任務(wù)不會影響已同步到集群中的副本。
刪除恢復(fù)任務(wù)不會影響已恢復(fù)的內(nèi)容。
在待刪除任務(wù)的集群中執(zhí)行以下命令,部署deleterequest刪除請求。
kubectl apply -f deleterequest.yaml
使用以下命令,查看資源狀態(tài)。
查看刪除的備份任務(wù)
執(zhí)行以下命令,查看刪除備份任務(wù)的狀態(tài)。
kubectl get applicationbackup <yourApplicationBackupName> -n csdr
預(yù)期輸出:
Error from server (NotFound): applicationbackups.csdr.alibabacloud.com "yourApplicationBackupName" not found
由預(yù)期輸出可看到,備份任務(wù)資源已被刪除。
執(zhí)行以下命令,查看刪除請求資源的狀態(tài)。
kubectl get deleterequest <yourApplicationBackupName-dbr> -n csdr
預(yù)期輸出:
Error from server (NotFound): deleterequests.csdr.alibabacloud.com "yourApplicationBackupName-dbr" not found
由預(yù)期輸出可看到,除備份任務(wù)資源被刪除外,刪除請求的相關(guān)資源也自動被刪除。
查看刪除的恢復(fù)任務(wù)
執(zhí)行以下命令,查看刪除備份任務(wù)的狀態(tài)。
kubectl get applicationrestore <yourApplicationRestoreName> -n csdr
預(yù)期輸出:
Error from server (NotFound): applicationrestores.csdr.alibabacloud.com "yourApplicationRestoreName" not found
由預(yù)期輸出可看到,恢復(fù)任務(wù)資源已被刪除。
執(zhí)行以下命令,查看刪除請求資源的狀態(tài)。
kubectl get deleterequest <yourApplicationRestoreName-dbr> -n csdr
預(yù)期輸出:
Error from server (NotFound): deleterequests.csdr.alibabacloud.com "yourApplicationRestoreName-dbr" not found
由預(yù)期輸出可看到,除恢復(fù)任務(wù)資源被刪除外,刪除請求的相關(guān)資源也自動被刪除。
相關(guān)文檔
如果需要通過控制臺實現(xiàn)集群應(yīng)用的備份遷移,請根據(jù)實際需求參見如下文檔:
如果需要實現(xiàn)跨存儲插件、跨版本集群間的應(yīng)用遷移,請參見通過備份中心實現(xiàn)低版本Kubernetes集群應(yīng)用遷移。