方案概述
操作场景
随着容器化技术的日益成熟,众多企业正逐步以容器替代虚拟机,实现应用的高效运行与部署。这一转变在很大程度上得益于Kubernetes平台的崛起,它极大地简化了容器编排流程,赋予了容器部署前所未有的便捷性和效能。
随着多云灾备、高可用、供应商多样化、降低成本等多方面的考量,将第三方集群已有业务迁移或备份到天翼云容器引擎已成为众多企业的选择之一。
此外,不少企业仍选择自行搭建Kubernetes集群,但随之而来的是运维压力的显著增大。自建集群要求运维团队自行配置复杂的管理系统、构建全方位的监控体系,这不仅推高了人力成本,还可能导致工作效率下降。从性能角度看,自建Kubernetes集群存在明显局限。其规模调整困难,扩展性欠佳,难以应对业务峰值时期的动态资源需求,容易陷入资源短缺或过度闲置的两难境地。此外,此类集群往往缺乏完备的容灾规划,一旦发生故障,可能导致整个集群服务中断,对生产环境造成重大影响。
天翼云容器引擎以其简便的集群管理机制、强大的弹性扩展功能,以及对应用服务网格与Helm标准模板的深度整合,为企业用户带来了显著的运维简化、成本节约效益,赢得了广大企业的广泛认同与信赖。越来越多的企业选择将原有的Kubernetes集群全面迁移至天翼云容器引擎进行云端托管。本文旨在详述这一迁移过程的具体策略与操作步骤,助力企业顺利实现集群上云的平滑过渡。
迁移方案
集群迁移工作主要涵盖以下六个关键环节:
- 目标集群资源规划: 全面了解云容器引擎集群与自建集群之间的特性差异,合理进行资源分配。为确保迁移后的平稳运行,建议尽可能保持新旧集群在配置上的对应一致性。
- 集群外资源迁移: 如涉及集群外部资源的迁移,可选用相应的迁移解决方案进行操作。
- 迁移工具安装: 完成集群外资源转移后,分别在源集群与目标集群中安装迁移工具Velero。
- 集群内资源迁移: 采用迁移工具Velero,将源集群内部资源备份至对象存储系统,随后在目标集群中执行恢复操作。
- 原集群应用备份: 用户启动备份流程时,Velero会在源集群中生成Backup对象,同步收集并备份相关数据及资源,然后将其打包上传至符合S3协议的对象存储。备份的各类集群资源将以JSON格式文件保存。
- 目标集群应用恢复: 在目标集群进行还原时,Velero会定位到先前存储备份数据的临时对象桶,将备份数据下载至新集群环境中,依据JSON文件内容逐一重新部署各项资源。
- 资源更新适配: 迁移后的集群资源可能出现部署问题,此时需对存在问题的资源进行针对性更新适配,主要涵盖以下几类情况:
- 镜像更新适配
- 访问服务更新适配
- StorageClass更新适配
- 数据库更新适配
- 其他后续工作: 集群资源部署无误后,对迁移后应用的各项功能进行全面验证,逐步将业务流量切至新集群。确认所有服务均正常运作后,可将原集群安全下线。
目标集群资源规划
云容器引擎允许用户对集群资源进行个性化选取,以精准匹配其多样化的业务诉求。如下所示的表1中,列举了集群的指标参数,并提供了本次演示实例的规划选择。用户应依据自身业务的确切需求,对相关设置做出合理调配,其间,我们建议尽可能保持与原集群性能配置的一致性水平。
主要指标参数 指标参数说明 本示例规划 kubernetes版本
1.25.6
1.27.8
1.27.8 网络插件
cubecni:cubecni 是云容器引擎自研的网络插件,支持基于 Kubernetes 标准的网络策略来定义容器间的访问策略
calico:使用社区 calico CNI 插件的IP模式
cubecni apiserver访问 API Server的访问需要依赖ELB实例,您可根据需要选择合适的ELB规格,系统将根据该规格创建一个私网ELB实例。规格选择请见:了解ELB实例规格 标准型I 控制节点数
1:单控制节点,无高可用能力,不建议在生产环境使用
3:基本的高可用能力
5:更多冗余的高可用能力
3 节点规格 分为控制节点规格和工作节点规格,如何选择可以参考:集群规格推荐规划 通用型4C8G 工作节点操作系统
公有镜像:ctyunos201
私有镜像:用户自定义镜像
ctyunos201
集群外资源迁移
集群外资源主要包括自建镜像仓库、自建数据库等。这些迁移工作是可选的,可以根据实际需求决定是否进行。
自建镜像仓库迁移请参见:迁移自建Harbor至容器镜像服务企业版
自建数据库如mysql迁移请参见:使用mysqldump迁移MySQL数据
迁移工具安装
Velero作为一款开源的解决方案,专为Kubernetes集群设计,提供了全面的备份与迁移功能。其内建了对Restic工具的支持,以确保对Persistent Volume(PV)数据的安全备份。借助Velero,用户能够系统性地备份原Kubernetes集群中的各类资源实体,包括但不限于Deployments、Jobs、Services、ConfigMaps等,以及与Pod关联的持久卷数据,并将这些备份安全地传输并储存在指定的对象存储服务中。
当面临灾难恢复场景或有计划的集群迁移需求时,目标集群只需运用同样配置的Velero工具,即可从预先设定的对象存储位置检索相应的备份数据,进而按照实际需求逐步恢复集群资源的状态。
前提条件
- 原始自建集群Kubernetes版本与所选云容器引擎的版本差距尽量小,差距越大,迁移过程中出现不兼容的风险越大
- 准备存放备份数据的对象存储,可以使用云厂商提供的对象存储,或者自建minio服务,本文使用自建MinIO服务
- 已开通迁移的目标云容器引擎集群
- 源集群与目标集群都可以正常访问到对象存储服务
安装MinIO
MinIO 是一个兼容S3接口协议的高性能对象存储开源工具。由于源集群与目标集群都需要能够访问到对象存储服务,建议单独申请一台ECS并绑定EIP作为MinIO服务的载体,源集群与目标集群可以方便的通过公网连接MinIO服务。单独申请一台ECS的另一个好处是将备份资源与集群资源区分开,出问题时彼此不会互相影响。
1、下载MinIO
mkdir /opt/minio
mkdir /opt/miniodata
cd /opt/minio
wget https://dl.minio.org.cn/server/minio/release/linux-amd64/minio
chmod +x minio
sudo mv minio /usr/local/bin/
2、设置MinIO的用户名和密码
注意此方法设置的用户名及密码为临时环境变量,在服务重启后需要重新设定。
export MINIO_ROOT_USER=minio
export MINIO_ROOT_PASSWORD=minio123!
3、启动服务
./minio server /opt/miniodata/ --console-address ":30000" &
以上命令指定了/opt/miniodata目录为备份数据存储的路径,30000端口为console访问端口。关于minio的详细启动参数,请参见:MinIO服务器命令介绍。
4、浏览器访问http://{minio所在ECS的EIP}:30000,可进入MinIO console界面。
安装Velero
首先前往MinIO console界面,创建存放备份文件的桶并命名为velero。此处桶名称可自定义,但安装Velero时必须指定此桶名称,否则将无法访问导致备份失败。
注意Velero服务端在源集群与目标集群上都需要部署,并且部署方法是一致的;
以下命令建议分别在源集群和目标集群的master上执行。
1、下载Velero
wget https://github.com/vmware-tanzu/velero/releases/download/v1.7.0/velero-v1.7.0-linux-amd64.tar.gz
tar -xvf velero-v1.7.0-linux-amd64.tar.gz
cp ./velero-v1.7.0-linux-amd64/velero /usr/local/bin
2、创建密钥文件credentials-velero,用于连接备份数据的对象存储,文件内容如下,注意与安装MinIO时的用户名和密码一致:
[default]
aws_access_key_id = minio
aws_secret_access_key = minio123!
3、部署Velero服务端
velero install \
--provider aws \
--plugins velero/velero-plugin-for-aws:v1.2.1 \
--bucket velero \
--secret-file ./credentials-velero \
--use-restic \
--use-volume-snapshots=false \
--backup-location-config region=minio,s3ForcePathStyle="true",s3Url=http://{minio所在ECS的EIP}:30000
以上命令--bucket参数需要修改为已创建的对象存储桶名称,本例中为velero。--backup-location-config参数中的s3Url要修改为安装MinIO时ECS的EIP和设置的对应端口。关于更多自定义安装参数,请参见:Velero安装文档。
4、Velero实例将默认创建一个名为velero的namespace,执行以下命令可查看pod状态。
$ kubectl get pod -n velero
NAME READY STATUS RESTARTS AGE
restic-xxxxx 1/1 Running 0 50s
velero-xxxxxxx-xxxxxxx 1/1 Running 0 50s
5、查看Velero工具与对象存储的对接情况,状态需要为available
$ velero backup-location get
NAME PROVIDER BUCKET/PREFIX PHASE LAST VALIDATED ACCESS MODE DEFAULT
default aws velero Available 2024-04-04 11:08:12 +0800 CST ReadWrite true
集群内资源迁移
源集群应用备份
注意以下命令在源集群的master上运行。
Velero可以实现多个粒度的集群备份及恢复,如集群级、命名空间级、资源对象级等。Velero备份集群命令基本格式为:velero backup create RESTORE_NAME [flags],它有多种参数,以下举一些例子:
备份集群所有资源
velero backup create cluster-backup
备份一个namespace,如命名空间demo
velero backup create namespace-backup --include-namespaces demo
备份一个namespace下的一种资源,如命名空间demo下的deployments
velero backup create namespace-deploy-backup --include-namespaces demo --include-resources deployments
备份过程中可以通过以下命令查看备份情况:
velero backup get
目标集群应用恢复
注意以下命令在目标集群的master上运行。
Velero恢复/同步数据的命令基本格式为velero restore create RESTORE_NAME [--from-backup BACKUP_NAME] [flags]。以同步上面的namespace-deploy-backup为例,以下命令可以将源集群已备份的数据(即demo命名空间下的deployments),同步到目标集群上,实现集群数据的迁移:
velero restore create --from-backup namespace-deploy-backup
恢复过程中可以通过以下命令查看恢复情况:
velero restore get
资源更新适配
由于基础设施或环境信息的改变,迁移后的资源配置需要针对新环境进行适配。以下列举一些常见的需要适配的资源及对应的处理方法。
镜像更新适配
一般情况下,集群内的应用使用的镜像都会保存在一个镜像仓库中,如果目标集群可以直接访问源集群使用的镜像仓库,那么不需要针对容器镜像做任何适配。
如果原有的镜像仓库无法访问或者有网络性能的问题,就需要在集群外资源迁移时进行镜像仓库迁移,并将应用中的镜像名称更改为新的镜像名称。
访问服务更新适配
如果源集群的服务都是通过集群内的DNS域名访问的,那么不需要针对访问服务做任何适配。
如果是通过NodePort方式访问,需要将源集群的节点IP更改为目标集群的节点IP。
如果集群内应用通过Ingress对外提供服务,需要将域名DNS从源集群的ingress节点IP更改为目标集群的ingress节点IP。如果源集群的应用需要在公网上提供服务,则需要将目标集群的ingress暴露到公网上,具体操作请参见:如何将Ingress服务暴露到公网。
StorageClass更新适配
注意以下操作需要在进行集群备份/恢复之前进行。
由于目标集群所采用的存储基础设施与源集群存在差异,可能导致迁移后存储卷无法实现正常挂载。针对这一情况,您可酌情选取并实施以下任一策略,以顺利完成存储卷的适应性调整。
-
创建ConfigMap映射
apiVersion: v1kind: ConfigMapmetadata: name: change-storageclass-plugin-config namespace: velero labels: app.kubernetes.io/name: velero velero.io/plugin-config: "true" velero.io/change-storage-class: RestoreItemActiondata: {原集群StorageClass name01}: {目标集群StorageClass name01} {原集群StorageClass name02}: {目标集群StorageClass name02}
- 执行以下命令,应用上述的 ConfigMap 配置
$ kubectl create -f change-storage-class.yaml
configmap/change-storageclass-plugin-config created
- 创建同名StorageClass
通过云容器引擎页面在目标集群上创建与源集群名称相同的存储类,过程请参见:使用zos动态存储卷
通过以上任一方法在目标集群创建与源集群同名的StorageClass后,目标集群进行恢复/同步操作时,应用依赖的pv/pvc即可以动态自动创建,不对集群迁移造成影响。
数据库更新适配
如果源数据库进行了迁移,需要在目标集群中将迁移过来的应用配置进行修改,将源数据库地址更改为新数据库地址。
其他后续工作
应用功能验证
迁移工作完成后,需要对迁移后的服务进行功能测试,验证迁移效果。
业务流量切换
功能测试验证通过后,需要将全部网络流量导向目标集群,有以下两种方式可参考:
- DNS流量迁移策略:通过调整DNS系统的配置设定,实现对网络流量的定向引导,将其从源集群平稳过渡至目标集群。
- 客户端层面流量迁移方案:在客户端应用程序上进行代码版本升级或配置更新,以此达到将客户端发起的访问请求重新指向新集群的目的。
原集群下线
待目标集群业务正常运行一段时间后,可以下线原集群,下线原集群过程中请确认:
- 目标集群业务各环节运作顺畅,无异常情况
- 对原集群数据进行备份
- 对已完成迁移且不再需要的备份文件进行清理