已建立的ACK叢集不支援修改網路外掛程式或Virtual Private Cloud,當您需變更集群的網路外掛程式(例如由Flannel切換至Terway)或VPC時, 您可以在同一地區建立一個符合要求的叢集並遷移應用。VPC或網路外掛程式切換一般不變更集群所在地區,因此可以複用大部分的雲資源,例如儲存(雲端硬碟、NAS、OSS)資源和Server Load Balancer執行個體。您可以藉助備份中心實現跨VPC叢集的應用遷移。
前提條件
分類 | 前提條件 | 相關操作 |
叢集和組件 | 不建議將高版本叢集的應用遷移至低版本叢集中。
備份和恢複叢集所需組件:
| |
地區 | 備份和恢複叢集處於同一地區。 | 無 |
備份時所需開通的雲端服務 | ECS快照 |
注意事項
備份注意事項
備份應用時,正在刪除的資源不會被備份。
若備份組群與某叢集通過單VPC實現Pod間互聯,應用遷移至新VPC的叢集時,將無法繼續訪問該叢集的Pod與ECS,更多資訊,請參見ACK託管叢集網路規劃。
恢複注意事項
恢複應用時,資源將優先按照恢複叢集版本推薦的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等資源。複用NAS儲存卷或OSS Bucket時,恢複叢集與備份組群可共用讀寫。而複用原有雲端硬碟時,在掛載至新叢集的節點上會強制從備份組群的原節點上拔盤。因此,對於雲端硬碟儲存卷,建議備份儲存卷資料,在恢複時自動建立新盤。
說明若原業務無法停機且無法接受遷移期間的資料不一致,應避免強制拔盤。
ESSD類型雲端硬碟儲存卷預設支援ECS快照極速可用功能,對其備份能保護資料的同時有效降低遷移時間長度。
計費說明
備份中心功能本身不收費,使用備份中心時,可能用到以下相關服務,您需要支付相關的儲存費用。
應用樣本
Nginx應用還配置了LoadBalancer類型的服務nginx-svc,Server Load Balancer執行個體由CCM自動建立。如何判斷負載平衡的建立方式及更多詳情,請參見Service的負載平衡配置注意事項。
建立應用時,需確保RAM使用者擁有Bucket的操作許可權,並替換對應的url為實際Bucket的Endpoint。關於如何使用OSS靜態儲存卷,請參見授權並掛載OSS靜態儲存卷。
遷移流程
遷移前,請確保NAS、OSS或雲端硬碟儲存卷的回收策略為Retain。
步驟一:為NAS儲存卷在新VPC下建立新掛載點
請根據備份組群使用的NAS儲存卷的類型,執行以下操作建立掛載點。
如果NAS儲存卷由CNFS管理,並且儲存類為alibabacloud-cnfs-nas時,您需要先擷取CNFS託管的實際NAS檔案系統ID,在恢複CNFS管理的NAS儲存卷時,還需要同步恢複CNFS執行個體與對應的儲存類。
如果NAS儲存卷通過靜態方式或動態(自訂儲存類)方式掛載,您需要為NAS檔案系統建立新掛載點後,直接在恢複叢集中建立儲存類或儲存卷。
通過CNFS管理的NAS儲存卷掛載
在備份組群中執行以下命令,擷取CNFS執行個體資訊。
kubectl get cnfs -o=custom-columns=name:.metadata.name,filesystemId:.status.fsAttributes.filesystemId預期輸出:
name filesystemId cnfs-nas-c529e33c3f8704e27a8e2abff******** 1caa64****如果存在多個輸出,說明叢集使用了多個CNFS執行個體,每個執行個體對應的NAS檔案系統均需要建立新的掛載點。
登入NAS控制台為NAS檔案系統添加掛載點,注意VPC網路需要選擇恢複叢集所在的新VPC,交換器可選擇叢集使用的任一交換器。具體操作,請參見添加掛載點。
說明同一VPC、不同交換器下的ECS執行個體均可通過該掛載點訪問NAS檔案系統。
單個通用性或極速型NAS檔案系統僅支援添加2個掛載點,請及時回收空閑掛載點。
查看並記錄掛載點地址,在檔案系統列表頁面,找到目標檔案系統,單擊管理,在檔案系統詳情頁面,單擊掛載使用,在掛載點列表的掛載點地址列,將游標放置在
表徵圖上,即可查看目標掛載點的掛載點地址。
參考以下YAML在恢複叢集中建立CNFS執行個體。其中,
server替換為上一步記錄的掛載點地址。更多參數資訊,請參見通過CNFS管理NAS檔案系統(推薦)。apiVersion: storage.alibabacloud.com/v1beta1 kind: ContainerNetworkFileSystem metadata: name: cnfs-nas-restore-from-c529e33c3f8704e27a8e2abff******** spec: description: cnfs-nas parameters: server: 1caa64****-h****.cn-beijing.nas.aliyuncs.com # NAS掛載點地址。 storageType: Capacity # 容量型NAS。 reclaimPolicy: Retain type: nas(可選)刪除建立叢集時預設建立的alibabacloud-cnfs-nas儲存類,以便後續步驟重建。
說明為了複用原NAS儲存卷,如果您在建立恢複叢集時,已勾選建立預設NAS檔案系統和CNFS容器網路檔案系統動態儲存裝置類型,此處需要刪除後再重建alibabacloud-cnfs-nas儲存類。
kubectl delete sc alibabacloud-cnfs-nas參考以下YAML在恢複叢集中建立儲存類。
其中
containerNetworkFileSystem由上述步驟4建立,其餘配置與預設的alibabacloud-cnfs-nas一致。allowVolumeExpansion: true apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: alibabacloud-cnfs-nas mountOptions: - nolock,tcp,noresvport - vers=3 parameters: archiveOnDelete: "false" # 剛建立的CNFS執行個體名稱。 containerNetworkFileSystem: cnfs-nas-restore-from-c529e33c3f8704e27a8e2abff******** path: / volumeAs: subpath provisioner: nasplugin.csi.alibabacloud.com reclaimPolicy: Delete volumeBindingMode: Immediate
通過靜態方式或動態(自訂儲存類)方式掛載
登入NAS控制台為NAS檔案系統添加掛載點,注意VPC網路需要選擇恢複叢集所在的新VPC,交換器可選擇叢集使用的任一交換器。具體操作,請參見添加掛載點。
說明同一VPC、不同交換器下的ECS執行個體均可通過該掛載點訪問NAS檔案系統。
單個通用性或極速型NAS檔案系統僅支援添加2個掛載點,請及時回收空閑掛載點。
根據備份組群中原NAS儲存卷掛載類型,在恢複叢集中重建儲存卷或儲存類。
靜態掛載:您可以在恢複叢集中使用新的NAS掛載點重建PVC與PV。例如,原NAS PV的YAML設定檔如下,您只需要將
server欄位替換為新VPC下建立的NAS掛載點,PVC配置無需修改。apiVersion: v1 kind: PersistentVolume metadata: name: pv-nas labels: alicloud-pvname: pv-nas spec: capacity: storage: 5Gi accessModes: - ReadWriteMany csi: driver: nasplugin.csi.alibabacloud.com volumeHandle: pv-nas # 必須與PV Name保持一致。 volumeAttributes: server: "2564f4****-ysu87.cn-shenzhen.nas.aliyuncs.com" path: "/csi" mountOptions: - nolock,tcp,noresvport - vers=3動態掛載:您可以在恢複叢集中使用新NAS掛載點重建儲存類。例如,原NAS儲存類的YAML設定檔如下,您只需要將
server欄位替換為新VPC下建立的NAS掛載點,PVC配置無需修改。allowVolumeExpansion: true apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: alicloud-nas-subpath mountOptions: - nolock,tcp,noresvport - vers=3 parameters: volumeAs: subpath server: "0cd8b4a576-g****.cn-hangzhou.nas.aliyuncs.com:/k8s/" provisioner: nasplugin.csi.alibabacloud.com reclaimPolicy: Retain
步驟二:遷移NAS和OSS儲存卷
在備份組群中,對NAS和OSS的儲存聲明、儲存卷打標,方便後續根據標籤進行備份。
kubectl label pvc pvc-nas pvc-oss backup="true" kubectl label pv `kubectl get pvc -l backup="true" | grep Bound | awk '{print $3}'| xargs` backup="true"對需要NAS儲存聲明、儲存卷打標,方便後續根據標籤統一修改掛載點配置。
kubectl label pvc pvc-nas nas-volume="true" kubectl label pv `kubectl get pvc -l nas-volume="true" | grep Bound | awk '{print $3}'| xargs` nas-volume="true"在備份組群中建立NAS和OSS儲存卷的應用備份任務。具體操作,請參見建立備份計劃或立即備份中的立即備份。
重要其中,指定標籤備份配置為
backup=true,指定資源配置為pvc,pv,備份儲存卷選擇不開啟(即僅備份儲存卷的YAML,恢複應用後續直接通過新增的掛載點跨VPC訪問原資料來源,此時無需備份出副本)。在應用備份的備份記錄頁簽,建立的備份記錄狀態列顯示Completed,表示該任務備份成功。
在應用備份的備份記錄頁簽,單擊備份記錄名稱,查看備份詳情的樣本如下,表明所有NAS和OSS儲存卷備份完成。
{ "v1/PersistentVolume": [ "nas-916c0c04-e91e-4fc3-9115-d8a9********", #該NAS PV為動態產生。 "pv-oss" ], "v1/PersistentVolumeClaim": [ "default/pvc-nas", "default/pvc-oss" ] }
參考以下YAML,在恢複叢集中建立ConfigMap,使用Resource Modifier功能修改NAS掛載點資訊。
說明使用Resource Modifier功能,請確保備份中心組件migrate-controller版本為1.8.2及以上,且操作者具有叢集RBAC管理員權限。關於組件升級操作,請參見管理組件;關於叢集RBAC管理員授權,請參見使用RBAC授予叢集內資源操作許可權。
以下YAML樣本中原NAS儲存卷使用了預設alibabacloud-cnfs-nas儲存類,若您使用動態(自訂儲存類)或使用靜態方式掛載NAS儲存卷,您需要根據實際的PVC和PV內容做相關調整。
apiVersion: v1 data: modifier: | version: v1 resourceModifierRules: - conditions: groupResource: pvcs labelSelector: matchLabels: nas-volume: "true" patches: - operation: replace path: "/spec/storageClassName" value: "alibabacloud-cnfs-nas" - conditions: groupResource: pods labelSelector: matchLabels: nas-volume: "true" patches: - operation: replace path: "/spec/csi/volumeAttributes/containerNetworkFileSystem" value: "cnfs-nas-restore-from-c529e33c3f8704e27a8e2abff********" - operation: replace path: "/spec/storageClassName" value: "alibabacloud-cnfs-nas" - operation: remove path: "/spec/csi/volumeAttributes/storage.kubernetes.io/csiProvisionerIdentity" kind: ConfigMap metadata: name: <備份任務名稱>-resource-modifier namespace: csdr(可選)使用以下backuplocation.yaml樣本,在恢複叢集中初始化備份倉庫。若已初始化,可跳過此步驟。
apiVersion: csdr.alibabacloud.com/v1beta1 kind: BackupLocation metadata: name: <備份使用的備份倉庫名稱> namespace: csdr spec: backupSyncPeriod: 0s # 以下配置需要與備份倉庫建立時的內容一致,也可以在恢複叢集控制台一鍵初始化。 config: network: internal region: <備份倉庫對應OSS Bucket所在的地區> objectStorage: bucket: <備份倉庫對應OSS Bucket名稱> prefix: <備份倉庫對應OSS Bucket子路徑> provider: alibabacloud在恢複叢集執行以下命令,確認備份已同步至恢複叢集。
kubectl get -ncsdr applicationbackup <備份名稱>預期輸出非空,說明備份任務已同步完成。
使用以下applicationrestore.yaml樣本,在恢複叢集中建立恢複任務。
說明Resource Modifier進階功能相關的操作,僅支援通過命令列操作。
apiVersion: csdr.alibabacloud.com/v1beta1 kind: ApplicationRestore metadata: name: nas-oss-restore namespace: csdr spec: backupName: <備份任務名稱> resourceModifier: kind: ConfigMap name: <備份任務名稱>-resource-modifierkubectl apply -f applicationrestore.yaml確認恢複任務處於Completed狀態,並在恢複叢集中驗證儲存聲明與儲存卷已全量恢複並處於Bound狀態,並且需要修改的欄位已被修改。
步驟三:遷移雲端硬碟儲存卷
通過控制台建立立即備份同時勾選備份儲存卷資料時,預設備份的是處於掛載狀態的儲存卷。
參考以下applicationbackup.yaml樣本檔案,在備份組群中建立所有雲端硬碟類型儲存卷的資料備份。
apiVersion: csdr.alibabacloud.com/v1beta1 kind: ApplicationBackup metadata: annotations: # 如果備份倉庫已在叢集中使用,則無需填寫該annotation。 # csdr.alibabacloud.com/backuplocations: >- # {"name":"<備份倉庫名稱>","region":"<關聯bucket所在地區>","bucket":"<關聯bucket名稱>","prefix":"<關聯bucket子路徑>","provider":"alibabacloud"} name: backup-disk namespace: csdr spec: # includedNamespaces: #備份命名空間列表,備份列表內空間下的所有儲存卷(包括雲端硬碟與非雲端硬碟),與下面pvcList二選一。 # - default backupType: PvBackup pvBackup: defaultPvBackup: true pvcList: # 待備份儲存聲明列表,指定時命名空間維度選擇失效。 - name: pvc-disk namespace: default storageLocation: <備份倉庫名稱> ttl: 720h0m0s在備份組群中執行以下命令,部署applicationbackup對象。
kubectl apply -f applicationbackup.yaml在備份組群中執行以下命令,查看立即備份任務的狀態。
kubectl describe applicationbackup <yourApplicationBackupName> -n csdr預期輸出:
... Status: Completion Timestamp: 2022-12-05T15:02:35Z Expiration: 2023-01-04T15:02:25Z Message: success Phase: Completed當立即備份任務由
Inprogress轉為Completed狀態,說明立即備份任務建立成功。在恢複叢集中執行以下步驟,確認備份已同步至恢複叢集,預期輸出非空。
kubectl get -ncsdr applicationbackup <備份名稱>使用以下applicationrestore.yaml樣本,在恢複叢集中建立恢複任務。
apiVersion: csdr.alibabacloud.com/v1beta1 kind: ApplicationRestore metadata: name: disk-restore namespace: csdr spec: backupName: <備份任務名稱>kubectl apply -f applicationrestore.yaml確認恢複任務處於Completed狀態,並在恢複叢集中驗證儲存聲明與儲存卷已全量恢複並處於Bound狀態,儲存卷中的雲端硬碟ID已更新。
步驟四:佈建服務與路由的注釋複寫策略
備份組群中建立的nginx-svc服務,Server Load Balancer執行個體由CCM建立並帶有如下注釋和標籤:
Annotation:
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-spec: slb.s1.smallLabel:
service.k8s.alibaba/loadbalancer-id: lb-2ze2hxgbuw145******說明該服務使用的Server Load Balancer執行個體ID為lb-2ze2hxgbuw145******,如需在的恢複新叢集中複用該執行個體,可以參考以下YAML建立服務的注釋複寫策略:
apiVersion: v1
data:
# use-nlb: "true" 僅在建立LB情境有效。
default.nginx-svc: |
{"service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id":"lb-2ze2hxgbuw145******","xxx":"yyy"}
# <ns>.<svc>
# {"xxx": "yyy", ...}
kind: ConfigMap
metadata:
name: service-annotation-overwrite
namespace: csdr其中,服務原本存在的其他注釋可以繼續保留或調整,將service.beta.kubernetes.io/alibaba-cloud-loadbalancer-spec注釋修改為service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id。
更多注釋配置解釋,請參考通過Annotation配置傳統型負載平衡CLB和通過Annotation配置網路型負載平衡NLB。
複寫策略為全量複寫,您也可以通過該功能實現建立負載平衡的功能。
預設情況下,複用的Server Load Balancer執行個體不會強制覆蓋此前的監聽,即不配置
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-force-override-listeners注釋時,預設為false。建議您在驗證恢複叢集應用成功啟動後再切換流量。
您可以通過建立ingress-annotation-overwrite對Ingress資源實作類別似覆蓋效果。
步驟五:遷移叢集中除儲存卷外的資源
如需在恢複應用時修改備份的叢集資源,相關操作,請參見在恢複應用時修改備份的叢集資源。
在備份組群中備份待遷移的應用,備份時請勿勾選備份儲存卷資料。具體操作,請參見建立備份計劃或立即備份中的立即備份。
在備份組群中應用備份的備份記錄頁簽,查看確認已建立的備份任務狀態為Completed。
在恢複叢集中等待備份同步,並恢複該備份任務。具體操作,請參見恢複應用。
在恢複叢集中應用備份頁面,單擊查看恢複記錄,確認任務的恢複狀態為Completed。
在恢複叢集中無狀態應用頁面確認應用Nginx已正常啟動並掛載此前恢複的儲存卷,在應用詳情頁單擊服務nginx-svc的詳情,確認服務已複用原有的Server Load Balancer執行個體。
相關文檔
如需通過kubectl命令列實現叢集應用的遷移,請參見通過kubectl實現叢集應用的備份和恢複。
如需通過Terraform實現叢集應用的遷移,請參見使用Terraform備份和恢複應用。