已创建的ACK集群不支持修改网络插件或专有网络VPC,当您需变更集群的网络插件(例如由Flannel切换至Terway)或VPC时, 您可以在同一地域新建一个符合要求的集群并迁移应用。VPC或网络插件切换一般不变更集群所在地域,因此可以复用大部分的云资源,例如存储(云盘、NAS、OSS)资源和负载均衡实例。您可以借助备份中心实现跨VPC集群的应用迁移。
前提条件
分类 | 前提条件 | 相关操作 |
集群和组件 | 不建议将高版本集群的应用迁移至低版本集群中。
备份和恢复集群所需组件:
| |
地域 | 备份和恢复集群处于同一地域。 | 无 |
备份时所需开通的云服务 | ECS快照 |
注意事项
备份注意事项
备份应用时,正在删除的资源不会被备份。
若备份集群与某集群通过单VPC实现Pod间互联,应用迁移至新VPC的集群时,将无法继续访问该集群的Pod与ECS,更多信息,请参见Kubernetes集群网络规划。
恢复注意事项
恢复应用时,资源将优先按照恢复集群版本推荐的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,负载均衡实例由CCM自动创建。如何判断负载均衡的创建方式及更多详情,请参见Service的负载均衡配置注意事项。
迁移流程
迁移前,请确保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 sts-nas sts-oss backup="true" kubectl label pv `kubectl get pvc -l backup="true" | grep Bound | awk '{print $3}'| xargs` backup="true"
对需要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"
在备份集群中创建NAS和OSS存储卷的数据备份任务。具体操作,请参见创建备份计划或立即备份中的立即备份。
重要其中,指定标签备份配置为
backup=true
,指定资源配置为pvc,pv
。在应用备份的备份记录页签,创建的备份记录状态列显示Completed,表示该任务备份成功。
根据备份名称查看备份任务详情,检查是否将所有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" ] }
参考以下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
(可选)使用以下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-modifier
kubectl 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服务,负载均衡实例由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资源实现类似覆盖效果。
步骤四:迁移集群中除存储卷外的资源
如需在恢复应用时修改备份的集群资源,相关操作,请参见在恢复应用时修改备份的集群资源。
在备份集群中备份待迁移的应用,备份时请勿勾选备份存储卷数据。具体操作,请参见创建备份计划或立即备份中的立即备份。
在备份集群中应用备份的备份记录页签,查看确认已创建的备份任务状态为Completed。
在恢复集群中等待备份同步,并恢复该备份任务。具体操作,请参见恢复应用。
在恢复集群中应用备份页面,单击查看恢复记录,确认任务的恢复状态为Completed。
在恢复集群中无状态应用页面确认应用Nginx已正常启动并挂载此前恢复的存储卷,在应用详情页单击服务nginx-svc的详情,确认服务已复用原有的负载均衡实例。
相关文档
如需通过kubectl命令行实现集群应用的迁移,请参见通过kubectl实现集群应用的备份和恢复。
如需通过Terraform实现集群应用的迁移,请参见使用Terraform备份和恢复应用。