复用存储等云资源的跨VPC集群应用迁移

已创建的ACK集群不支持修改网络插件或专有网络VPC,当您需变更集群的网络插件(例如由Flannel切换至Terway)或VPC时, 您可以在同一地域新建一个符合要求的集群并迁移应用。VPC或网络插件切换一般不变更集群所在地域,因此可以复用大部分的云资源,例如存储(云盘、NAS、OSS)资源和负载均衡实例。您可以借助备份中心实现跨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,更多信息,请参见Kubernetes集群网络规划

恢复注意事项

  • 恢复应用时,资源将优先按照恢复集群版本推荐的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快照极速可用功能,对其备份能保护数据的同时有效降低迁移时长。

计费说明

备份中心功能本身不收费,使用备份中心时,可能用到以下相关服务,您需要支付相关的存储费用。

  • 对象存储OSS:OSS Bucket用于存储备份的集群资源(即相关YAML)。OSS相关计费请参见计费概述

  • 云盘快照:用于备份阿里云云盘存储卷数据。快照计费请参见快照计费

    说明
    • 自2023年10月12日11:00起,阿里云ECS云盘不再收取快照极速可用存储费和快照极速可用功能费,更多信息,请参见快照极速可用能力

    • 使用PL0、PL1、PL2、PL3级别的ESSD云盘或ESSD AutoPL云盘时,在备份时创建的快照默认开启快照极速可用功能。

应用示例

image

Nginx应用还配置了LoadBalancer类型的服务nginx-svc,负载均衡实例由CCM自动创建。如何判断负载均衡的创建方式及更多详情,请参见Service的负载均衡配置注意事项

展开查看示例应用的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

迁移流程

image

迁移前,请确保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 sts-nas sts-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 sts-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

    应用备份备份记录页签,创建的备份记录状态列显示Completed,表示该任务备份成功。

  4. 根据备份名称查看备份任务详情,检查是否将所有NAS和OSS存储卷备份完成。

    kubectl describe applicationbackup <yourApplicationBackupName> -n csdr

    预期输出示例如下,表明所有NAS和OSS存储卷备份完成。

    {
      "v1/PersistentVolume": [
        "nas-916c0c04-e91e-4fc3-9115-d8a9********", #该NAS PV为动态生成。
        "pv-oss"
      ],
      "v1/PersistentVolumeClaim": [
        "default/pvc-nas",
        "default/pvc-oss"
      ]
    }
  5. 参考以下YAML,在恢复集群中创建ConfigMap,使用Resource Modifier功能修改NAS挂载点信息。

    说明
    • 使用Resource Modifier功能,请确保备份中心组件migrate-controller版本为1.8.2及以上,且操作者具有集群RBAC管理员权限。关于组件升级操作,请参见管理组件;关于集群RBAC管理员授权,请参见为RAM用户或RAM角色授予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: "alibaba-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: "alibaba-cnfs-nas"
          - operation: remove
            path: "/spec/csi/volumeAttributes/storage.kubernetes.io/csiProvisionerIdentity"
    kind: ConfigMap
    metadata:
      name: <备份任务名称>-resource-modifier
      namespace: csdr
  6. (可选)使用以下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
  7. 在恢复集群执行以下命令,确认备份已同步至恢复集群。

    kubectl get -ncsdr applicationbackup <备份名称>

    预期输出非空,说明备份任务已同步完成。

  8. 使用以下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
  9. 确认恢复任务处于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服务,负载均衡实例由CCM创建并带有如下注释和标签:

Annotation

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

Label

service.k8s.alibaba/loadbalancer-id: lb-2ze2hxgbuw145******

说明该服务使用的负载均衡实例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

  • 复写策略为全量复写,您也可以通过该功能实现新建负载均衡的功能。

  • 默认情况下,复用的负载均衡实例不会强制覆盖此前的监听,即不配置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的详情,确认服务已复用原有的负载均衡实例。

相关文档