全部產品
Search
文件中心

Container Service for Kubernetes:複用儲存等雲資源的跨VPC叢集應用遷移

更新時間:Dec 26, 2025

已建立的ACK叢集不支援修改網路外掛程式或Virtual Private Cloud,當您需變更集群的網路外掛程式(例如由Flannel切換至Terway)或VPC時, 您可以在同一地區建立一個符合要求的叢集並遷移應用。VPC或網路外掛程式切換一般不變更集群所在地區,因此可以複用大部分的雲資源,例如儲存(雲端硬碟、NAS、OSS)資源和Server Load Balancer執行個體。您可以藉助備份中心實現跨VPC叢集的應用遷移。

前提條件

分類

前提條件

相關操作

叢集和組件

不建議將高版本叢集的應用遷移至低版本叢集中。

  • 備份組群:1.16或以上版本。

  • 恢複叢集:1.20或以上版本(使用Resource Modifier功能)。

    說明
    • 為了複用原NAS儲存卷,避免建立額外的NAS儲存卷,建議您在建立恢複叢集時,請勿勾選組件配置步驟中儲存外掛程式下的建立預設NAS檔案系統和CNFS容器網路檔案系統動態儲存裝置類型選項。若建立恢複叢集時已勾選,請刪除原alibabacloud-cnfs-nas儲存類後再繼續建立儲存類。

    • 在恢複叢集中預先安裝並配置好所需的系統組件。例如:

      • ACR免密組件:您需要為恢複叢集重新授權並配置acr-configuration。

      • ALB Ingress組件:您需要預先配置ALBConfig等。

備份和恢複叢集所需組件:

  • CSI組件:1.1.0或以上版本。

  • migrate-controller組件:1.8.1或以上版本。

地區

備份和恢複叢集處於同一地區。

備份時所需開通的雲端服務

ECS快照

開通快照

注意事項

備份注意事項

  • 備份應用時,正在刪除的資源不會被備份。

  • 若備份組群與某叢集通過單VPC實現Pod間互聯,應用遷移至新VPC的叢集時,將無法繼續訪問該叢集的Pod與ECS,更多資訊,請參見ACK託管叢集網路規劃

恢複注意事項

  • 恢複應用時,資源將優先按照恢複叢集版本推薦的apiVersion進行恢複。若某資源在兩個版本中無同時支援的apiVersion版本,恢複時您需要手動部署。例如:

    • 1.16版本叢集Deployment支援extensions/v1beta1apps/v1beta1apps/v1beta2以及apps/v1,恢複至1.28叢集時將全部恢複至apps/v1

    • 1.16版本叢集Ingress支援extensions/v1beta1networking.k8s.io/v1beta1,無法將其直接恢複至1.22及以上版本叢集。

    更多叢集版本API變更資訊,請參見ACK版本發布說明Deprecated API Migration Guide

    重要

    在1.16版本叢集中,appsrbac.authorization.k8s.io等groups已支援v1,升級至1.28版本叢集時,您需要手動恢複Ingress、CronJob等資源。

  • 複用NAS儲存卷或OSS Bucket時,恢複叢集與備份組群可共用讀寫。而複用原有雲端硬碟時,在掛載至新叢集的節點上會強制從備份組群的原節點上拔盤。因此,對於雲端硬碟儲存卷,建議備份儲存卷資料,在恢複時自動建立新盤。

    說明
    • 若原業務無法停機且無法接受遷移期間的資料不一致,應避免強制拔盤。

    • ESSD類型雲端硬碟儲存卷預設支援ECS快照極速可用功能,對其備份能保護資料的同時有效降低遷移時間長度。

計費說明

備份中心功能本身不收費,使用備份中心時,可能用到以下相關服務,您需要支付相關的儲存費用。

  • Object Storage Service:OSS Bucket用於儲存備份的叢集資源(即相關YAML)。OSS相關計費請參見計費概述

  • 雲端硬碟快照:用於備份阿里雲雲端硬碟儲存卷資料。快照計費請參見快照計費

    說明
    • 自2023年10月12日11:00起,阿里雲ECS雲端硬碟不再收取快照極速可用儲存費和快照極速可用功能費,更多資訊,請參見快照極速可用能力

    • 使用PL0、PL1、PL2、PL3層級的ESSD雲端硬碟或ESSD AutoPL雲端硬碟時,在備份時建立的快照預設開啟快照極速可用功能。

應用樣本

Nginx應用還配置了LoadBalancer類型的服務nginx-svc,Server Load Balancer執行個體由CCM自動建立。如何判斷負載平衡的建立方式及更多詳情,請參見Service的負載平衡配置注意事項

說明

建立應用時,需確保RAM使用者擁有Bucket的操作許可權,並替換對應的url為實際Bucket的Endpoint。關於如何使用OSS靜態儲存卷,請參見授權並掛載OSS靜態儲存卷

展開查看樣本應用的YAML檔案

# 雲端硬碟動態磁碟區
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-disk
spec:
  accessModes:
  - ReadWriteOnce
  volumeMode: Filesystem
  resources:
    requests:
      storage: 20Gi
  storageClassName: alicloud-disk-topology-alltype
---
# OSS靜態卷
apiVersion: v1
kind: Secret
metadata:
  name: oss-secret
  namespace: default
stringData:
  akSecret: <yourAccessKey Secret>
  akId: <yourAccessKey ID>
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-oss
spec:
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Retain
  csi:
    driver: ossplugin.csi.alibabacloud.com
    volumeHandle: pv-oss
    nodePublishSecretRef:
      name: oss-secret
      namespace: default
    volumeAttributes:
      bucket: "a-new-bucket"
      url: "http://oss-cn-beijing.aliyuncs.com"
      otherOpts: "-o allow_other -oumask=000"
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-oss
spec:
  accessModes:
  - ReadWriteMany
  resources:
    requests:
      storage: 5Gi
  volumeName: pv-oss
---
# NAS動態磁碟區
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-nas
spec:
  accessModes:
  - ReadWriteMany
  volumeMode: Filesystem
  resources:
    requests:
      storage: 20Gi
  storageClassName: alibabacloud-cnfs-nas
---
apiVersion: apps/v1
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: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6
        ports:
        - containerPort: 80
        volumeMounts:
          - name: nas
            mountPath: /nas-data
          - name: oss
            mountPath: /oss-data
          - name: disk
            mountPath: /disk-data
      volumes:
        - name: nas
          persistentVolumeClaim:
            claimName: pvc-nas 
        - name: disk  
          persistentVolumeClaim:
            claimName: pvc-disk
        - name: oss
          persistentVolumeClaim:
            claimName: pvc-oss
---
apiVersion: v1
kind: Service
metadata:
  annotations:
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-spec: slb.s1.small
  name: nginx-svc
  namespace: default
spec:
  externalTrafficPolicy: Local
  internalTrafficPolicy: Cluster
  ipFamilies:
    - IPv4
  ports:
    - name: nginx
      nodePort: 31463
      port: 8080
      protocol: TCP
      targetPort: 80
  selector:
    app: nginx
  type: LoadBalancer

遷移流程

遷移前,請確保NAS、OSS或雲端硬碟儲存卷的回收策略為Retain

步驟一:為NAS儲存卷在新VPC下建立新掛載點

請根據備份組群使用的NAS儲存卷的類型,執行以下操作建立掛載點。

  • 如果NAS儲存卷由CNFS管理,並且儲存類為alibabacloud-cnfs-nas時,您需要先擷取CNFS託管的實際NAS檔案系統ID,在恢複CNFS管理的NAS儲存卷時,還需要同步恢複CNFS執行個體與對應的儲存類。

  • 如果NAS儲存卷通過靜態方式或動態(自訂儲存類)方式掛載,您需要為NAS檔案系統建立新掛載點後,直接在恢複叢集中建立儲存類或儲存卷。

通過CNFS管理的NAS儲存卷掛載

  1. 在備份組群中執行以下命令,擷取CNFS執行個體資訊。

    kubectl get cnfs -o=custom-columns=name:.metadata.name,filesystemId:.status.fsAttributes.filesystemId

    預期輸出:

    name                                         filesystemId
    cnfs-nas-c529e33c3f8704e27a8e2abff********   1caa64****

    如果存在多個輸出,說明叢集使用了多個CNFS執行個體,每個執行個體對應的NAS檔案系統均需要建立新的掛載點。

  2. 登入NAS控制台為NAS檔案系統添加掛載點,注意VPC網路需要選擇恢複叢集所在的新VPC,交換器可選擇叢集使用的任一交換器。具體操作,請參見添加掛載點

    說明
    • 同一VPC、不同交換器下的ECS執行個體均可通過該掛載點訪問NAS檔案系統。

    • 單個通用性或極速型NAS檔案系統僅支援添加2個掛載點,請及時回收空閑掛載點。

  3. 查看並記錄掛載點地址,在檔案系統列表頁面,找到目標檔案系統,單擊管理,在檔案系統詳情頁面,單擊掛載使用,在掛載點列表的掛載點地址列,將游標放置在image.png表徵圖上,即可查看目標掛載點的掛載點地址。image.png

  4. 參考以下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
  5. (可選)刪除建立叢集時預設建立的alibabacloud-cnfs-nas儲存類,以便後續步驟重建。

    說明

    為了複用原NAS儲存卷,如果您在建立恢複叢集時,已勾選建立預設NAS檔案系統和CNFS容器網路檔案系統動態儲存裝置類型,此處需要刪除後再重建alibabacloud-cnfs-nas儲存類。

     kubectl delete sc alibabacloud-cnfs-nas
  6. 參考以下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

通過靜態方式或動態(自訂儲存類)方式掛載

  1. 登入NAS控制台為NAS檔案系統添加掛載點,注意VPC網路需要選擇恢複叢集所在的新VPC,交換器可選擇叢集使用的任一交換器。具體操作,請參見添加掛載點

    說明
    • 同一VPC、不同交換器下的ECS執行個體均可通過該掛載點訪問NAS檔案系統。

    • 單個通用性或極速型NAS檔案系統僅支援添加2個掛載點,請及時回收空閑掛載點。

  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儲存卷

  1. 在備份組群中,對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"
  2. 對需要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"
  3. 在備份組群中建立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"
        ]
      }
  4. 參考以下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
  5. (可選)使用以下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
  6. 在恢複叢集執行以下命令,確認備份已同步至恢複叢集。

    kubectl get -ncsdr applicationbackup <備份名稱>

    預期輸出非空,說明備份任務已同步完成。

  7. 使用以下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-modifier
    kubectl apply -f applicationrestore.yaml
  8. 確認恢複任務處於Completed狀態,並在恢複叢集中驗證儲存聲明與儲存卷已全量恢複並處於Bound狀態,並且需要修改的欄位已被修改。

步驟三:遷移雲端硬碟儲存卷

通過控制台建立立即備份同時勾選備份儲存卷資料時,預設備份的是處於掛載狀態的儲存卷。

  1. 參考以下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
  2. 在備份組群中執行以下命令,部署applicationbackup對象。

    kubectl apply -f applicationbackup.yaml
  3. 在備份組群中執行以下命令,查看立即備份任務的狀態。

    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狀態,說明立即備份任務建立成功。

  4. 在恢複叢集中執行以下步驟,確認備份已同步至恢複叢集,預期輸出非空。

    kubectl get -ncsdr applicationbackup <備份名稱>
  5. 使用以下applicationrestore.yaml樣本,在恢複叢集中建立恢複任務。

    apiVersion: csdr.alibabacloud.com/v1beta1
    kind: ApplicationRestore
    metadata:
      name: disk-restore
      namespace: csdr
    spec:
      backupName: <備份任務名稱>
    kubectl apply -f applicationrestore.yaml
  6. 確認恢複任務處於Completed狀態,並在恢複叢集中驗證儲存聲明與儲存卷已全量恢複並處於Bound狀態,儲存卷中的雲端硬碟ID已更新。

步驟四:佈建服務與路由的注釋複寫策略

備份組群中建立的nginx-svc服務,Server Load Balancer執行個體由CCM建立並帶有如下注釋和標籤:

Annotation

service.beta.kubernetes.io/alibaba-cloud-loadbalancer-spec: slb.s1.small

Label

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資源實作類別似覆蓋效果。

步驟五:遷移叢集中除儲存卷外的資源

說明

如需在恢複應用時修改備份的叢集資源,相關操作,請參見在恢複應用時修改備份的叢集資源

  1. 在備份組群中備份待遷移的應用,備份時請勿勾選備份儲存卷資料。具體操作,請參見建立備份計劃或立即備份中的立即備份。

  2. 在備份組群中應用備份備份記錄頁簽,查看確認已建立的備份任務狀態為Completed

  3. 在恢複叢集中等待備份同步,並恢複該備份任務。具體操作,請參見恢複應用

  4. 在恢複叢集中應用備份頁面,單擊查看恢複記錄,確認任務的恢複狀態為Completed

  5. 在恢複叢集中無狀態應用頁面確認應用Nginx已正常啟動並掛載此前恢複的儲存卷,在應用詳情頁單擊服務nginx-svc的詳情,確認服務已複用原有的Server Load Balancer執行個體。

相關文檔