服务平滑迁移方案设计传统的部署模式存在着过多的服务器资源,再加上没有统一的管理,导致管理难度增加,也增加了资源的浪费。为
1. 迁移背景
任务系统服务仅作为直播系统中的一个模块,存在着过多的服务器资源,再加上没有统一的管理模式,导致管理难度增加,也增加了资源的浪费。为了提高资源利用率并简化管理,计划将任务系统中8台8c64g规格服务器迁移至容器环境中。
2. 迁移目标
1. 实现平滑迁移,最小化对业务的影响。
2. 落地简单,简化服务器管理和维护流程,减少人力运维成本。
3. 服务器资源得到合理利用,进程管理需要有保障。
4. 为团队技术基建调研和赋能,方便扩展以后其他功能模块的重构或者转移。
3. 迁移注意事项
1. 需要兼容现有Java服务环境、保证无缝式切换。
2. 服务器IP地址变更,需要检查网关、负载均衡、代码、配置文件、IP白名单等地方是否需要同步更改。
3. 采用渐进式增量更新迁移,先保证旧机器正常运行的情况下增量迁移的方式。
4. 需要与团队内Go、PHP、Node、前端、客户端等开发同学核对,是否有写死IP、白名单的情况,有的话需要告知同步修改。
4. 迁移方案调研
4.1. 容器化方案
4.1.1. 容器镜像服务选型
容器镜像服务是面向程序镜像的高效分发服务,具有分发加速、多代码源构建加速等能力。镜像服务有很多,这里只列两种比较适合咱们落地的。
● Docker Registry Registry | Docker Docs
优势:服务器内简易部署、管理方便。
● 阿里云容器镜像服务ACR 什么是容器镜像服务ACR - 容器镜像服务 ACR - 阿里云
优势:免部署管理,多链路加速。
4.1.2. 容器应用程序管理
● Docker Compose docker compose | Docker Docs
优势:易于配置,通过docker-compose.yml文件定义服务、网络和卷,提供容器基本参数监控,自动重启,异常心跳检测等功能,支持快速编排多容器应用的部署和管理。
4.1.3. 容器集群编排选型
容器编排是管理容器如何在生产中运行和交互的过程,使用容器集群编排工具可以大大简化部署、扩展和管理容器化应用的过程。
● 阿里云ACK(Kubernetes版) 什么是阿里云容器服务Kubernetes版 - 容器服务 Kubernetes 版 ACK - 阿里云
优势:支持大规模集群,一键创建集群,支持灰度发布、应用监控、高性能日志采集等,SLA有保障。
不足:在高级功能和扩展性方面不如Kubernetes,对于大规模集群可能会遇到限制。
● Kubernetes ( KubeSphere开源容器平台 )KubeSphere_企业级云原生产品与服务_技术赋能数字化转型与商业运营
优势:自动化容器部署、扩展和运维,支持多主节点高可用性,社区支持强大。
不足:学习部署成本相对较高,需要较强的运维能力。
● Docker Swarm docker swarm | Docker Docs
优势:与Docker环境的高度集成,简单易上手,轻量级并且足够用于小到中等规模的部署。
不足:在高级功能和扩展性方面不如Kubernetes,对于大规模集群可能会遇到限制。
4.2. 方案搭配
4.2.1. 全云服务容器解决方案
阿里云ACK(Kubernetes版)+ 阿里云镜像服务(ACR)+ 云效流水线DevOps
● 优势:所有组件均来自同一云服务提供商,保证了高度的兼容性和集成度,简化了管理和操作。
● 不足:相比于自建方案,全云服务可能会有更高的成本,特别是在流量和资源使用量较大时。
4.2.2. 自建方案一
Docker Swarm集群编排 + Docker Registry镜像服务 + Docker Compose容器管理
● 优势:Docker Swarm提供了较为简单的集群管理和编排能力,适合小型至中型的项目,使用开源工具和自建的资源,可以在成本可控的情况下进行高效的容器管理。
● 不足:需要自行负责系统的维护和运维,包括但不限于硬件故障、软件更新等
4.2.3. 自建方案二
KubeSphere开源容器平台 + Docker Registry镜像服务
● 优势:KubeSphere提供了一个易于使用的界面和丰富的功能,包括但不限于多租户管理、服务网格、DevOps等。
● 不足:虽然KubeSphere旨在简化Kubernetes的管理,但部署和管理一个高可用的容器化环境仍然需要一定的技术深度和较多的运维工作。
5. 迁移步骤
5.1. 准备阶段
评估现有环境
● 资源评估:评估当前任务服务在ECS上的资源使用情况(CPU、内存、磁盘、网络)。
● 依赖分析:确定任务系统的所有外部依赖项,如数据库、缓存服务、Redis消息队列等。
确定目标容器平台
● 详情可见 4.2 方案搭配章节。
学习和培训
● 如果团队对目标容器平台的落地不熟悉,安排必要的学习和培训。
ACK实例购买与配置步骤
1. 购置ACK 托管版 Pro版本:服务器地区、可用区选择与系统其他的核心服务所在区域保持一致。
2. 选择节点规格:这里的节点是工作节点(即程序部署应用进程的节点池),容器集群管理调度节点(即K8S相关组件)已经托管,无需关心配置细节,节电池与工作节点也可随时动态加减。
3. 配置核心组件:如无特殊需求,选择默认勾选的组件即可,后续可以动态增加。
5.2. 容器化配置
创建Dockerfile
● 创建一个Dockerfile来定义Java服务的容器镜像,包括Java环境、应用程序及其依赖。
构建和测试容器镜像
● 使用Dockerfile构建容器镜像。
● 在开发或测试环境中部署该镜像,确保Java服务在容器中正常运行。
优化容器镜像
● 调整和优化容器配置,如调整JVM参数以适应容器环境。
● 确保镜像大小合理,删除不必要的文件,减小镜像大小,加速部署。
5.3. 容器编排和部署
3.1. 编写编排配置
● 使用Docker Compose、Kubernetes manifest或Helm chart定义服务的部署、网络和存储配置。
3.2. 配置服务发现和负载均衡
● 配置容器服务的服务发现机制和负载均衡,确保流量能够平滑转移到容器化环境。
3.3. 环境变量和配置管理
● 使用环境变量或配置映射管理应用配置,以方便在不同环境间迁移和部署。
5.4. 平滑迁移
4.1. 增量灰度发布
● 注册中心中增加服务消费者,逐步将流量从ECS迁移到容器化环境。
● 监控应用性能和日志,确保容器化环境下的服务稳定运行一段时间后再剔除旧ECS。
4.2. 回滚计划
1. 保留原有旧Ecs实例,新增容器工作节点实例进行部署
2. 需要Nginx/网关逐步配置部分流量至新实例,备份好旧的配置,如遇到新实例出现问题的情况,及时回滚配置。
3. 当全量迁移完毕到新实例后,保留旧Ecs实例节点一个月,如遇到问题依旧可以修改配置快速根据切换到旧Ecs实例。
4.3. 数据迁移
● 如果Java服务依赖外部存储,比如数据库、日志、文件等,计划并执行数据迁移策略,确保数据的一致性和完整性。
5.5. 后迁移计划
5.1. 监控和日志
● 配置容器化环境的监控和日志收集,持续观察应用性能和资源使用情况。
5.2. 性能调优
● 根据监控数据进行性能调优,可能包括调整容器资源限制、优化应用配置等。
5.3. 容器安全
● 审查并加强容器安全措施,如镜像安全扫描、容器运行时安全。
5.6. 文档和培训
● 更新开发和运维文档,反映容器化环境的变更。
● 对团队成员进行必要的培训,确保他们能够有效管理和维护容器化环境。
6. 落地参考资料
如何在ACK集群中通过控制台快速搭建魔方游戏 - 容器服务 Kubernetes 版 ACK - 阿里云
【Docker】Docker Registry(镜像仓库)-CSDN博客
分布式训练 最小化部署docker swarm + docker-compose落地方案_docker-compose docker swarm怎么一起使用-CSDN博客
转载自:https://juejin.cn/post/7404816724173930547