通過備份中心,您可以將Flexvolume集群中的應用遷移至CSI集群中,也可以將低版本的Kubernetes集群應用遷移至新版本集群中。備份中心解決了跨存儲插件、跨版本集群間應用遷移的一些問題,例如,需要備份未被應用使用到的Cluster級別資源、API Version自動切換至恢復集群支持的版本等。本文以1.16版本Flexvolume集群的應用遷移至1.28版本的CSI集群為例,介紹如何使用備份中心進行集群應用遷移。
注意事項
備份集群與恢復集群需處于同一地域,且備份集群為1.16或以上版本。考慮到apiVersion兼容問題,不建議您通過備份中心將高版本集群中的應用遷移至低版本的集群中。
備份應用時,正在刪除的資源不會被備份。
如需恢復為容器網絡文件系統管理的NAS類型(即恢復時轉換為存儲類列選擇為alibabacloud-cnfs-nas),您需要先創建StorageClass。具體操作,請參見通過CNFS管理NAS文件系統(推薦)。
恢復應用時,資源將優先按照恢復集群版本推薦的apiVersion進行恢復。若某資源在兩個版本中無同時支持的apiVersion版本,恢復時您需要手動部署。例如:
1.16版本集群Deployment支持
extensions/v1beta1
、apps/v1beta1
、apps/v1beta2
以及apps/v1
,恢復至1.28集群時將全部恢復至apps/v1
。1.16版本集群Ingress支持
extensions/v1beta1
、networking.k8s.io/v1beta1
,無法將其直接恢復至1.22及以上版本集群。
更多集群版本API變更信息,請參見ACK版本發布說明、Deprecated API Migration Guide。
重要在1.16版本集群中,
apps
、rbac.authorization.k8s.io
等groups已支持v1,升級至1.28版本集群時,您需要手動恢復Ingress、CronJob等資源。
適用場景
跨存儲插件應用部署
新建1.20及以后版本的ACK集群已不再支持Flexvolume存儲插件,您可以通過備份中心將Flexvolume集群中運行的有狀態應用遷移到CSI集群中。
說明使用Flexvolume和CSI存儲插件的集群均支持遷移,新的恢復集群僅支持使用CSI存儲插件。
Kubernetes版本跨度較大的集群切換
某些場景下,您可能需要將低版本(不低于1.16版本)集群中的業務遷移至新集群。例如,網絡插件從Flannel切換至Terway等。備份中心可實現版本跨度較大的集群應用遷移,同時自適應修正Kubernetes版本升級后的應用模板API Version等基本配置。
前提條件
已開通云備份(Cloud Backup)服務。對NAS、OSS、本地盤類型存儲卷進行備份時,以及在混合云場景中,備份中心需要使用云備份進行文件備份。具體操作,請參見云備份。
已創建恢復集群,為確保能正常使用ECS快照恢復云盤數據,建議恢復集群為v1.18及以上版本。具體操作,請參見創建ACK托管集群、創建ACK專有集群或創建注冊集群并接入本地數據中心集群。
重要恢復集群必須使用CSI存儲插件,使用Flexvolume存儲插件或通過csi-compatible-controller組件同時使用CSI Flexvolume存儲插件的集群不支持恢復。
備份中心關注業務應用的備份和恢復。在恢復任務之前,您需要在恢復集群中預先安裝并配置好所需的系統組件。例如:
ACR免密組件:您需要為恢復集群重新授權并配置acr-configuration。
ALB Ingress組件:您需要預先配置ALBConfig等。
已安裝備份服務組件并完成對應權限的配置。具體操作,請參見安裝migrate-controller備份服務組件并配置權限。
如需使用云盤快照備份數據卷,需要安裝v1.1.0或以上版本的CSI插件。關于如何安裝CSI插件,請參見安裝與升級CSI組件。
遷移流程
備份集群使用的存儲插件類型不同,遷移流程略有不同,具體流程如下所示。
備份集群無存儲應用
備份集群使用Flexvolume存儲插件
備份集群使用CSI存儲插件
遷移步驟
本文以1.16版本的ACK Flexvolume集群為例,分別以數據換源以及數據不換源方式展示如何將集群中的應用及配置項等資源,以及將存儲卷數據遷移至1.28版本的ACK CSI集群。對于無存儲的應用遷移,或者備份集群使用CSI存儲插件的場景,可以簡化其中可選部分的步驟。
使用數據不換源方式時,需要將備份集群的PV的回收策略改為Retain,避免刪除存儲卷時觸發數據清理。
kubectl patch pv/<pv-name> --type='json' -p '[{"op":"replace","path":"/spec/persistentVolumeReclaimPolicy","value":"Retain"}]'
類別 | 概念 | 適用場景 |
數據換源 | 在備份集群中備份存儲卷中的數據,同步一份新數據給恢復集群的應用使用,即最終有兩套完全獨立的存儲。數據恢復流程使用動態掛載,可以通過轉換存儲類實現存儲類型的變更,例如,將NAS存儲轉變為云盤存儲。 |
|
數據不換源 | 不換源方式將根據備份的存儲聲明、存儲卷在恢復流程中使用靜態掛載,因此使用的是原數據源,例如云盤ID、OSS Bucket等。如果您正在進行Flexvolume集群到CSI集群的應用遷移,由于YAML不通用,您需要手動創建靜態存儲聲明、存儲卷。 | 業務在備份恢復期間無法暫停寫入,并且業務有強數據一致性的需求。 |
環境準備
類別 | 備份集群 | 恢復集群 |
集群版本 | 1.16.9-aliyun.1 | 1.28.3-aliyun.1 |
運行時版本 | Docker 19.03.5 | containerd 1.6.20 |
存儲組件版本 | Flexvolume:v1.14.8.109-649dc5a-aliyun | CSI:v1.26.5-56d1e30-aliyun |
其他 |
| 已安裝csi-plugin和csi-provisioner存儲組件。更多信息,請參見管理組件。 |
步驟一:部署測試應用
執行以下命令,部署云盤動態存儲卷。
其中
alicloud-disk-topology
請替換為您集群中Flexvolume存儲插件默認安裝的云盤存儲類名稱。cat << EOF | kubectl apply -f - kind: PersistentVolumeClaim apiVersion: v1 metadata: name: disk-essd spec: accessModes: - ReadWriteOnce storageClassName: alicloud-disk-topology resources: requests: storage: 20Gi EOF
執行以下命令,部署NAS靜態存儲卷。
其中
server
需要替換為賬號下NAS文件系統的掛載點。cat << EOF | kubectl apply -f - apiVersion: v1 kind: PersistentVolume metadata: name: pv-nas spec: capacity: storage: 5Gi storageClassName: nas accessModes: - ReadWriteMany flexVolume: driver: "alicloud/nas" options: server: "1758axxxxx-xxxxx.cn-beijing.nas.aliyuncs.com" vers: "3" options: "nolock,tcp,noresvport" --- kind: PersistentVolumeClaim apiVersion: v1 metadata: name: pvc-nas spec: accessModes: - ReadWriteMany storageClassName: nas resources: requests: storage: 5Gi EOF
執行以下命令,部署應用,該應用同時掛載上述云盤和NAS存儲卷。
以下代碼中的
apiVersion
使用了extensions/v1beta1,該apiVersion
在1.28集群已被廢棄。cat << EOF | kubectl apply -f - apiVersion: extensions/v1beta1 kind: Deployment metadata: name: nginx labels: app: nginx spec: replicas: 1 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx ports: - containerPort: 80 volumeMounts: - name: nas mountPath: /cold - name: disk mountPath: /hot volumes: - name: nas persistentVolumeClaim: claimName: pvc-nas - name: disk persistentVolumeClaim: claimName: disk-essd EOF
執行以下命令,確認部署的應用已正常啟動。
kubectl get pod -l app=nginx
預期輸出:
NAME READY STATUS RESTARTS AGE nginx-5ffbc895b-xxxxx 1/1 Running 0 2m28s
步驟二:在備份集群中安裝備份中心
在備份集群安裝備份服務組件。具體操作,請參見安裝migrate-controller備份服務組件。
說明1.16版本以上的集群,可以直接在組件中心安裝備份服務組件,且組件為v1.7.6及以上版本。
若您的備份集群為ACK專有版集群或注冊集群,或使用的存儲插件非CSI(例如Flexvolume),則需要額外的權限配置。具體操作,請參見注冊集群。
(可選)若您的集群為Flexvolume集群,則執行以下命令,確認已經配置好相關權限。
kubectl -n csdr get secret alibaba-addon-secret
(可選)若您的集群為Flexvolume集群,則執行以下命令,增加kube-system命名空間下部署migrate-controller的
USE_FLEXVOLUME
環境變量。重要在Flexvolume集群中,migrate-controller備份服務組件安裝完成后,migrate-controller的Pod將異常退出,打開集群應用備份頁面將出現404報錯。此時,您需要編輯組件的YAML,增加USE_FLEXVOLUME環境變量。
kubectl -n kube-system patch deployment migrate-controller --type json -p '[{"op":"add","path":"/spec/template/spec/containers/0/env/-","value":{"name":"USE_FLEXVOLUME","value":"true"}}]'
執行以下命令,確認備份服務組件已經正常運行。
kubectl -n kube-system get pod -l app=migrate-controller kubectl -n csdr get pod
預期輸出:
NAME READY STATUS RESTARTS AGE migrate-controller-6c8b9c6cbf-967x7 1/1 Running 0 3m55s NAME READY STATUS RESTARTS AGE csdr-controller-69787f6dc8-f886h 1/1 Running 0 3m39s csdr-velero-58494f6bf4-52mv6 1/1 Running 0 3m37s
步驟三:在備份集群中創建備份
在與備份集群相同的地域創建以
cnfs-oss-*
格式命名的OSS Bucket,用于存放備份。具體操作,請參見創建存儲空間。說明ACK托管集群默認擁有
cnfs-oss-*
開頭的OSS Bucket權限,若您的Bucket命名格式不符合要求,同樣需要額外的權限配置。具體操作,請參見通過控制臺安裝組件并配置權限。創建備份倉庫。具體操作,請參見創建備份倉庫。
執行以下命令,創建立即備份任務。
關于通過控制臺設置備份相關配置項,請參見集群內備份和恢復應用。本步驟根據示例場景,提供建議的配置信息,您可以根據實際場景進行相應調整。
cat << EOF | kubectl apply -f - apiVersion: csdr.alibabacloud.com/v1beta1 kind: ApplicationBackup metadata: annotations: csdr.alibabacloud.com/backuplocations: '{"name":"<備份倉庫名稱>","region":"<regionID如cn-beijing>","bucket":"<備份倉庫關聯的OSSBucket名稱>","provider":"alibabacloud"}' labels: csdr/schedule-name: fake-name name: <備份名稱> namespace: csdr spec: excludedNamespaces: - csdr - kube-system - kube-public - kube-node-lease excludedResources: - storageclasses - clusterroles - clusterrolebindings - events - persistentvolumeclaims - persistentvolumes includeClusterResources: true pvBackup: defaultPvBackup: true storageLocation: <備份倉庫名稱> ttl: 720h0m0s EOF
參數
說明
excludedNamespaces
備份過程中排除的命名空間。建議排除以下命名空間:
csdr
:備份中心的工作命名空間。備份中心有集群間的同步邏輯,無需手動備份csdr命名空間下的備份、恢復等任務。否則可能導致非預期行為。kube-system
、kube-public
、kube-node-lease
:ACK集群默認存在的命名空間,因集群參數、配置等不同,無法在集群之間簡單恢復。
excludedResources
排除資源。可根據業務需求設置。
includeClusterResources
是否備份Cluster級別的資源,例如StorageClass、CRD、Webhook等。
true
:備份所有Cluster級別資源。false
:僅備份被選擇的命名空間中的Namespace級別資源引用的Cluster級別資源。例如,備份Pod時,引用的ServiceAccount授權了某ClusterRole,該ClusterRole將被自動備份;備份CR時,CRD將被自動備份。
說明通過容器服務管理控制臺創建的備份任務,默認
IncludeClusterResources
字段為false
。defaultPvBackup
是否備份存儲卷數據。
true
:備份應用以及Running Pod使用的存儲卷數據。false
:僅備份應用。
重要對于Kubernetes版本及CSI版本均為1.18及以上版本的集群,默認使用ECS快照備份云盤數據;對于其他存儲類型的數據,或大于等于1.16且小于1.18版本集群的云盤數據,均使用云備份備份。
對于未被Running Pod使用的存儲卷,僅支持通過數據不換源的方式在新的集群中手動創建靜態存儲卷、存儲聲明,并指定原存儲源,如云盤ID、OSS Bucket等。
若業務有數據強一致性需求,請您在備份期間暫停業務的數據寫入。或者您可以選擇數據不換源方式,在備份時僅備份應用。
執行以下命令,查詢備份任務狀態。
kubectl -ncsdr describe applicationbackup <備份名稱>
預期輸出中
Status
的Phase
變為Completed
,表明備份任務創建成功。執行以下命令,確認此次備份的資源列表Resource List。
kubectl -ncsdr get pod | grep csdr-velero kubectl -ncsdr exec -it <csdr-velero的pod名稱> -- /velero describe backup <備份名稱> --details
您可以查看列表中未被備份的資源,通過調整備份配置項及時重新備份。
Resource List: apiextensions.k8s.io/v1/CustomResourceDefinition: - volumesnapshots.snapshot.storage.k8s.io v1/Endpoints: - default/kubernetes v1/Namespace: - default v1/PersistentVolume: - d-2ze88915lz1il01v1yeq - pv-nas v1/PersistentVolumeClaim: - default/disk-essd - default/pvc-nas v1/Secret: - default/default-token-n7jss - default/oss-secret - default/osssecret v1/Service: - default/kubernetes v1/ServiceAccount: - default/default ...
步驟四:在恢復集群中安裝備份中心
在恢復集群中安裝備份中心。具體操作,請參見步驟二:在備份集群中安裝備份中心。
將上述備份倉庫關聯到恢復集群。
登錄容器服務管理控制臺。
在集群列表頁面,單擊目標集群名稱,然后在左側導航欄,選擇 。
在應用備份頁面,單擊立即恢復。
選擇備份使用的備份倉庫,單擊初始化倉庫,并等待備份同步至本集群。
(可選)步驟五:手動在恢復集群中創建存儲聲明及存儲卷
多數場景中,您只需要根據以下步驟六直接在恢復集群中創建恢復任務,由備份中心組件根據備份自動生成存儲聲明及存儲卷。
備份中心執行恢復任務時,為保護已有數據,遇到同名的存儲聲明及存儲卷將跳過恢復,即不重建也不覆蓋存儲卷內的數據。因此,遇到以下場景,您可以在恢復任務之前預先創建存儲聲明及存儲卷,以實現更靈活的恢復。
備份時備份了存儲卷,但部分存儲卷中存儲了日志等無需遷移的數據,可以預先創建空的存儲卷。
備份時備份了存儲卷,但備份集群中未被Running Pod使用的存儲卷同樣需要遷移至恢復集群。
備份時未備份存儲卷,且excludedResources里包含persistentvolumeclaims與persistentvolumes,或涉及Flexvolume集群至CSI集群的應用遷移。
具體操作步驟如下:
(可選)若您的備份集群為Flexvolume集群,由于Flexvolume與CSI的存儲卷、存儲聲明的YAML不同,您可以使用命令行工具批量切換YAML。具體操作,請參見使用Flexvolume2CSI命令行工具批量轉換YAML。
執行以下命令,部署通過Flexvolume2CSI獲取的CSI YAML文件。
其中
outputfile.txt
為使用命令行工具切換YAML的輸出。--- apiVersion: v1 kind: PersistentVolume metadata: labels: alicloud-pvname: d-2ze88915lz1il0**** # 部署時動態創建的云盤。 name: d-2ze88915lz1il0**** spec: accessModes: - ReadWriteOnce capacity: storage: 20Gi csi: driver: diskplugin.csi.alibabacloud.com fsType: ext4 volumeHandle: d-2ze88915lz1il0**** nodeAffinity: required: nodeSelectorTerms: - matchExpressions: - key: topology.diskplugin.csi.alibabacloud.com/zone operator: In values: - cn-beijing-i persistentVolumeReclaimPolicy: Delete storageClassName: alicloud-disk-essd volumeMode: Filesystem --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: disk-essd namespace: default spec: accessModes: - ReadWriteOnce resources: requests: storage: 20Gi selector: matchLabels: alicloud-pvname: d-2ze88915lz1il0**** storageClassName: alicloud-disk-essd volumeMode: Filesystem --- apiVersion: v1 kind: PersistentVolume metadata: labels: alicloud-pvname: pv-nas name: pv-nas spec: accessModes: - ReadWriteMany capacity: storage: 5Gi csi: driver: nasplugin.csi.alibabacloud.com volumeAttributes: server: 1758axxxxx-xxxxx.cn-beijing.nas.aliyuncs.com volumeHandle: pv-nas mountOptions: - vers=3 - nolock,tcp,noresvport persistentVolumeReclaimPolicy: Retain storageClassName: nas volumeMode: Filesystem --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pvc-nas namespace: default spec: accessModes: - ReadWriteMany resources: requests: storage: 5Gi selector: matchLabels: alicloud-pvname: pv-nas storageClassName: nas volumeMode: Filesystem
kubectl apply -f outputfile.txt
執行以下命令,確認存儲聲明在恢復集群中已處于Bound狀態。
kubectl get pvc
預期輸出:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE disk-essd Bound d-2ze88915lz1il0xxxxxx 20Gi RWO alicloud-disk-essd 29m pvc-nas Bound pv-nas 5Gi RWX nas 29m
步驟六:在恢復集群中創建恢復任務
若恢復集群中已存在同名的資源,則恢復任務將跳過該資源。
備份中心關注業務應用的備份和恢復。在恢復任務之前,您需要在恢復集群中預先安裝并配置好所需的系統組件。例如:
ACR免密組件:您需要為恢復集群重新授權并配置acr-configuration。
ALB Ingress組件:您需要預先配置ALBConfig等。
Service資源恢復時,根據Service類型的不同將進行如下適配:
NodePort類型的Service:跨集群恢復時,默認保留端口號。
LoadBalancer類型的Service:ExternalTrafficPolicy為Local時,HealthCheckNodePort默認使用隨機端口號。若您需要保留端口號,請在創建恢復任務時,設置
spec.preserveNodePorts: true
。在備份集群中由指定已有SLB的Service,恢復時將使用原有的SLB并默認關閉強制監聽,您需要前往SLB控制臺配置監聽。
在備份集群中由CCM管理SLB的Service,恢復時將由CCM創建新的SLB實例,更多信息,請參見Service的負載均衡配置注意事項。
若您創建備份時備份了存儲卷,即使用數據換源的方式備份恢復。您可以通過存儲類轉換(convertedarg)實現存儲類型的變更。例如,將NAS存儲變為云盤存儲。您可以根據業務需求,選擇轉換的目標存儲類。
本示例中,由于備份集群是1.16的Flexvolume集群,云盤存儲卷備份使用了云備份,因此可以為存儲聲明disk-essd選擇目標存儲類alicloud-disk(即轉換為CSI云盤類,默認為alicloud-disk-topology-alltype)。若您的備份集群為v1.18及以上的CSI集群,則無需對云盤存儲卷做相關配置。
本示例中,還將Flexvolume NAS存儲卷轉換為CNFS管理的NAS隔離存儲卷,即為存儲聲明pvc-nas選擇目標存儲類alibabacloud-cnfs-nas。若您的集群不存在alibabacloud-cnfs-nas存儲類,請參見通過CNFS管理NAS文件系統(推薦)。
具體操作步驟如下:
執行以下命令,創建恢復任務。
關于通過控制臺設置恢復任務的相關配置項,請參見恢復應用和數據卷。本步驟根據示例場景提供了建議的配置信息,您可以根據實際場景進行相應調整。
cat << EOF | kubectl apply -f - apiVersion: csdr.alibabacloud.com/v1beta1 kind: ApplicationRestore metadata: csdr.alibabacloud.com/backuplocations: >- '{"name":"<備份倉庫名稱>","region":"<regionID如cn-beijing>","bucket":"<備份倉庫關聯的OSSbucket名稱>","provider":"alibabacloud"}' name: <恢復名稱> namespace: csdr spec: backupName: <備份名稱> excludedNamespaces: - arms-prom excludedResources: - secrets appRestoreOnly: false convertedarg: - convertToStorageClassType: alicloud-disk-topology-alltype namespace: default persistentVolumeClaim: alicloud-disk - convertToStorageClassType: alibabacloud-cnfs-nas namespace: default persistentVolumeClaim: pvc-nas namespaceMapping: <backupNamespace>: <restoreNamespace> EOF
參數
說明
excludedNamespaces
排除命名空間。對備份資源列表中不需要的命名空間進行排除。
excludedResources
排除資源。對備份資源列表中不需要的資源類型進行排除。
appRestoreOnly
對于已備份存儲卷的備份,是否恢復存儲卷。
true
:恢復時創建動態存儲卷、存儲聲明,指向新的數據源。控制臺創建的備份任務默認為true。false
:不創建,需要預先手動部署靜態卷。
說明一般情況下,數據換源方式此處需設置為
true
,數據不換源方式此處需設置為false
。convertedarg
轉換存儲類列表。備份中的FileSystem數據類型的存儲卷(OSS、NAS、CPFS、本地存儲等)的存儲聲明,在當前集群中恢復為目標存儲類,實現例如NAS存儲至云盤存儲的轉換。
convertToStorageClassType:目標存儲類,需要在當前集群已存在。當前版本僅支持選擇云盤或NAS類型的存儲類。
namespace:存儲聲明所在的命名空間。
persistentVolumeClaim:存儲聲明名稱。
您可以通過
kubectl -ncsdr describe <backup-name>
查詢備份的存儲聲明信息,在輸出的status.resourceList.dataResource.pvcBackupInfo
列表中dataType字段為數據類型,分為FileSystem與Snapshot,nameSpace與pvcName分別為存儲聲明所在的命名空間與存儲聲明名稱。執行以下命令,查詢恢復任務的狀態。
kubectl -ncsdr describe applicationrestore <備份名稱>
預期輸出中
Status
的Phase
變為Completed
,表明任務恢復成功。執行以下命令,確認是否有恢復失敗的資源及失敗的原因。
kubectl -ncsdr get pod | grep csdr-velero kubectl -ncsdr exec -it <csdr-velero的pod名稱> -- /velero describe restore <恢復名稱> --details
預期輸出:
Warnings: Velero: <none> Cluster: could not restore, ClusterRoleBinding "kubernetes-proxy" already exists. Warning: the in-cluster version is different than the backed-up version. Namespaces: demo-ns: could not restore, ConfigMap "kube-root-ca.crt" already exists. Warning: the in-cluster version is different than the backed-up version. could not restore, Endpoints "kubernetes" already exists. Warning: the in-cluster version is different than the backed-up version. could not restore, Service "kubernetes" already exists. Warning: the in-cluster version is different than the backed-up version. Errors: Velero: <none> Cluster: <none> Namespaces: demo-ns: error restoring endpoints/xxxxxx/kubernetes: Endpoints "kubernetes" is invalid: subsets[0].addresses[0].ip: Invalid value: "169.254.128.9": may not be in the link-local range (169.xxx.0.0/16, fe80::/10) error restoring endpointslices.discovery.k8s.io/demo-ns/kubernetes: EndpointSlice.discovery.k8s.io "kubernetes" is invalid: endpoints[0].addresses[0]: Invalid value: "169.xxx.128.9": may not be in the link-local range (169.xxx.0.0/16, fe80::/10) error restoring services/xxxxxx/kubernetes-extranet: Service "kubernetes-extranet" is invalid: spec.ports[0].nodePort: Invalid value: 31882: provided port is already allocated
通過以上預期輸出,您可以查看恢復集群中是否有未被恢復的資源,例如,Warnings中有資源已存在的問題,且資源已被跳過。Errors中有NodePort復用的問題,跨集群恢復時會保留原有端口。
確認恢復的應用是否正常運行。
確認應用恢復后,是否存在由于業務限制、容器運行異常或其他原因導致資源處于異常狀態,如有,請進行手動修復。
驗證恢復后,Nginx應用的
apiVersion
已默認調整至1.28版本的集群推薦使用的apps/v1。