个人拙见,仅供参考
某平台推行容器化各个人预分析
为了推行容器化,基于个人经验提出一些个人角度的分析说明,比较粗糙,后续应该会更新;
背景说明:
- 应用容器化改造需求
- 公有云运行环境:阿里云为主
- 可行性和风险点分析
脑图图示(右键打开查看大图):
详细内容
-
【开发层面】研发配合内容:
- 收集整理所有开发语言、框架;编译、进程启动方式/参数尽量统一;
- 以语言+框架为维度进行标准化 Dockerfile 定制;
- 容器化改造过程中一些固有方式的改造,如:根据日志收集方案修改;日志输出模式或控制日志大小;根据 services 特性进行调用改造(部分去注册中心);
- http 应用基于框架或自行开发实现标准的应用层健康检查接口,供 k8s 状态检测使用;
- pod 规格(内存/cpu)的规划:容器化过程中需要评估统一生产级别 pod 规格的可行性,设置单 pod 的基准性能配置(CPU&内存),通过横向扩容(弹性伸缩节点)的方式提升系统承载量
-
【运维支撑层面】发布系统重构:
- jenkins slave 是否进行容器化改造(1 期:实现功能:jenkins 分布式架构 + slave 编译环境规划;2 期:基于共享库的 pipeline 优化改造)
- 发布流程重新设计:流水线定制、JAVA、node 的编译缓存方案设计(用于加速构建);
-
【运维支撑层面】日志系统:
- 建议避免日志文件落盘,输出到 stdout 或 stderr:可无缝对接阿里云日志服务或者流行开源容器化日志收集系统;
- 如若保持现有模式日志文件落盘:需精简日志输出、对 pod 设置磁盘容量限制,否则会触发基于 QOS 的异常驱逐导致业务波动;
-
【运维支撑层面】监控系统:
- 云原生支持 Prometheus,跟现有监控方案兼容性很高;改造成本较低
-
【运行环境层面】阿里云 k8s 产品调研,关键点:
- 七层代理 ingress-controller 插件的可用性和扩展性(服务高可用/避免单点、应对业务增长方面考虑);
- 评估 AES 必要性(阿里云自研 nginx-ingress-controller 替代产品)
- 内外网 ingress-controller 是否有规划需求
- 存储方案设计:虽然 mars 应用均为无状态应用,后期必然有工具类有状态应用容器化,需要提前结合阿里云 paas 产品规划存储方案;(前瞻性考虑)
- 标准化编排文件定制与版本管理(使用时基于固定模版自动生成或者使用 kustomize 结合 gitlab 进行托管)
- k8s 版本选型:目前 AKE 未提供 1.20 以上 k8s 版本的 paas 产品,当前最新稳定版 k8s(1.20+)已经去 docker 话,需和阿里云确认后期改造成本(改造过程中的风险点和兼容性考虑)
- 镜像仓库选型:自建或公有云 paas 产品
- 七层代理 ingress-controller 插件的可用性和扩展性(服务高可用/避免单点、应对业务增长方面考虑);
-
【运行环境层面】k8s 集群使用规划:
- 各环境运行集群的规划:推荐环境拆分集群,强制网络隔离,降低耦合性;并且降低故障影响范围
- 基于标准 CNI 接口的网络插件选型(结合阿里云当前支持情况进行 OverLay 与 UnderLay 方案选型评估:Terway 或 Flannel)
- 全局环境变量或配置(环境级别)的提取与设置(如 apollo 连接地址、通用日志路径、环境标识等)
- 集群使用的网段规划:在保证与现有的办公网段、公有云已经使用或者将来规划使用的 VPC 网段不重合的基础上,对集群节可用网段做好充足规划应对后期业务增长;
- 按服务等级或类型进行硬件级别隔离降低故障影响面(基于节点亲和性调度进行规划)
-
【实际接入层面】业务切换规划:
- 任务拆分、排期,按项目实施规范落实
- 按计划根据关联性分批迁入(边缘性的业务首批迁入,其他业务依次按计划分批迁入)
部分已知难点:
- 应用标准化改造成本;
- 前期各组件选型及实测;
部分已知风险点:
- 实际上线后高并发场景下的 pod 稳定性
- java 应用容器化后应用间隔离不彻底,存在资源争用问题触发 pod 驱逐;
- 如果 JVM 策略不合适在有使用限额的场景下可能会偶现 OOM 的情况;
- 如果不设计灰度方案,节点比较多的服务(如 20 个节点的 quaoar)的发布影响范围会比较大(一发全发,一回滚全回滚;虽然可以手动控制中断 rolling update,但较难与发布系统整合)