通過備份中心,您可以將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將被自動備份。
說明通過Container Service管理主控台建立的備份任務,預設
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叢集的應用遷移。
具體操作步驟如下:
雲端硬碟不支援跨可用性區域掛載,若您在恢複叢集中切換了可用性區域,可選擇以下任一方式處理。
使用資料換源的方式同步資料。
登入ECS管理主控台,為雲端硬碟建立一個雲端硬碟快照,並使用快照在新的可用性區域建立雲端硬碟。具體操作,請參見使用快照建立雲端硬碟。替換以下
outputfile.txt
YAML檔案中的雲端硬碟ID及nodeAffinity中的可用性區域ID。
(可選)若您的備份組群為Flexvolume叢集,由於Flexvolume與CSI的儲存卷、儲存聲明的YAML不同,您可以使用命令列工具批量切換YAML。具體操作,請參見使用Flexvolume2CSI命令列工具批量轉換YAML。
執行以下命令,部署通過Flexvolume2CSI擷取的CSI YAML檔案。
其中
outputfile.txt
為使用命令列工具切換YAML的輸出。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叢集,雲端硬碟儲存卷備份使用了Cloud Backup,因此可以為儲存聲明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。