唯品会容器环境与应用一键拉起——大规模微服务多环境部署管理实践 赵磊

QCon大会

2019/06/25 发布于 技术 分类

QCon  QCon2019 

文字内容
1. 容器云环境应⽤⼀键拉起 唯品会大规模微服务多环境部署管理实践 赵磊 Leon Zhao 高级架构师
2. 2
3. 自我介绍 赵磊: • 唯品会:高级架构师 • 负责容器云平台PaaS系统研发 • 爱立信:首席架构师、部门经理 • 移动业务交付平台/车联网/IoT 有多年的架构设计和产品开发经验,对软件工程和敏捷方法有深入 理解,现关注于软件研发效率提升的工具支撑。 3
4. 目录 • 微服务快速部署的挑战 • 环境与应用一键拉起 • 模型:环境/应用规范化 • 自动化部署:流程与实现 • 落地实践 • • 实际应用推广的困难、挑战与解决方案 目标与演进 4
5. 微服务快速部署的挑战 – 应用部署的进化 传统的软件包+主机+部署脚本 à Kubernetes+Docker镜像 DevOps: CI/CD Pipeline, Continuous Deployment 5
6. 微服务部署依赖 • Database (Single à HA à Sharding) • 缓存:Memcached, Redis, Redis Cluster • 消息队列:RabbitMQ,Kakfa • 配置中心,服务治理,etc. 6
7. 生产 vs 开发测试环境 数以千计的微服务应用 App App App … App 频繁部署/升级 部署/升级/扩容 频繁变更 稳定 一致性如何保证 基础设施需支持大量环境 测试过程中应用的灵活组合 不同环境的访问控制与隔离 有计划 Site A 多个应用版本 联调环境 Site B 开发环境集 Site C … 功能环境集 … 有限的生产环境 大量开发测试环境 7 回归环境 压测环境集 …
8. 从容器编排到应用编排 • 容器的关注点 基础设施与运维 • • • • 资源调度 应用的动态伸缩 应用的访问 集成外部服务 • 应用关注点 应用容器化/微服务 8 • 依赖什么服务 • 资源和扩展需求 • 快速整体部署 – 多个容 器/服务的整体部署
9. 现有工具局限性 • 容器领域 – Docker Compose, Kompose • 需要过多涉及容器本身的知识 (容器编排已经简化和解决的问题!) • 个性化的容器服务依赖控制:定制镜像,initContainer,应用本身控制 • 缺少简单化和平台化的支持 • CD工具 – Jenkins Pipeline, Spinnaker, etc. • 重量级 • 面向过程和流程定义,不易维护和灵活组合 • 上千服务需要多少专门SCM Role? 9
10. 环境应用一键拉起的目标 • 关注点:应用本身的依赖,而非容器的部署描述 • Configuration as Code – 保证可重复性 • 标准化:声明式描述 (应用&环境) • 灵活性:可自动重新组合,适应多种研发项目需求 • 一键快速分钟级部署:减轻环境部署维护负担,提高人效 标准化配置描述驱动部署 开发环境 功能集成环境 回归环境 Kubernetes 10 预发布环境 生产环境
11. 主要使用场景 简化用户操作 • 快速 生成/更新 环境 可视化模板定义和环境管理 • 开发/测试SDK,生成开发/集成测试 部署环境 自动化脚本 – 域名+环境变量配置 • CI/CD Pipeline,流程标准化和自动 化 App Catalogue – 标准化应用/环境定义 • 项目驱动的环境管理、自动部署 API – 应用描述+环境描述定义 自动化 11
12. CICD Pipeline 12
13. 项目驱动环境管理 13
14. 环境与应用一键拉起 – 基础设施 PaaS Portal • 多个功能、性能环境的管理 构 建 管 理 • 数据库、缓存服务的容器化 管理 Jenkins Jenkins Jenkins Jenkins Jenkins Master集群 • 消息服务、配置中心等基础 服务的分区化管理 部署管理 环境管理 应用部署 环境一键拉起 资源配额 资源服务 基础服务集成 流水线 构建容器 build deploy& test 功能测试环境 deploy& test 联调测试环境 回归测试环境 namespace: jenkins-slave 内部测试环境K8S集群 基于唯品会Noah云(Kubernetes) PaaS平台 14 部署环境
15. 平台与网络 15
16. 容器应用状态监控 • 规范定义各类容器内应用/服务的健康检查和标准 • 通过Health Check判断应用/服务Pod Readiness 16
17. 微服务中间件 环境中的应用 • 中间件逻辑分区支持多环境隔离 • 配置中心: Zookeeper树节点结构作为 分区支持 环境名分区,共用基础设施 • 服务注册发现:Zookeeper树节点结 构作为分区支持 • 消息中间件:Queue/Topic名称映射 • 数据中间件/作业中间件:内置 namespace支持多环境使用 hierarchical namespace 17 queue/topic name
18. 应用规范化模型 数据中间件 缓存 数据库 数据服务 环境变量 数据初始化 Application 配置KV 消息服务 最小部署资源 RabbitMQ Kafka 消息中间件 配置中心 18
19. 从应用模型到环境中应用实例 Application Model Application Pod 环境变量 变量替换 环境配置覆盖应用模板 环境变量 应用镜像发现规则 • 应用版本 配置KV 数据服务 配置KV 应用声明版本类型 环境自动关连注入 数据服务 消息服务 消息服务 约束环境声明 部署资源 最小资源 依赖注入/动态绑定 Environment 19 • 应用分支Latest • 应用镜像路径
20. 环境的规范化模型 映射数据源到环境实例 缓存 数据库 App 1 按需创建/映射 App 2 App Catalogue App 3 Kubernetes Namespace 资源分配 应用容器 服务发现注册 自动部署 Environment … container App N 基础服务 • 配置中心 • 中间件 • … 20 container
21. 环境和应用的自动化部署流程 环境创建 基础服务 应用创建 • • • • • • • • • 资源分配 服务分区 Mock服务 数据库/缓存 数据源初始化 消息队列创建 • 自动分析依赖关系,并发初始化服务,并发拉起应用 • 自动化完成资源创建和注册 • 自动化处理环境差异,变量覆盖/注入,注册应用配置中心变量 • 健康检查,服务和应用运行状态事件驱动的流程 21 环境变量 配置中心 应用启动
22. 环境和应用自动化部署流程 DAG - Directed acyclic graph 用于描述部署流程控制步骤 • 起始/结束节点 • 执行节点 • Fork/Join节点 配置中心 配置注入 App 1 配置生成 配置中心 配置注入 App 2 … 缓存 配置生成 … Mock服务 开始 配置生成 配置中心 配置注入 环境创建 数据库 数据中间件 … fork fork 消息服务 22 App N 结束
23. 环境和应用自动化更新 已有App1和App2部署,需要更新App2和增加AppN • 比较和裁剪DAG,生成更新路径 Mock服务 开始 缓存 配置生成 配置中心 配置注入 App 1 配置生成 配置中心 配置注入 App 2 环境创建 数据库 数据中间件 fork fork 结束 消息服务 配置生成 23 配置中心 配置注入 App N
24. 环境和应用自动化部署实现 Start Orchestrator 环境+应用 à DAG 驱动事件 Mock Database Cache Event Manager Messaging 任务执行 中间件注册 中间件注册 Task Executors Join App App Pod Watcher 数据初始化 App 任务执行 应用部署 Watch Join 基础服务 End 24 Kubernetes Pod Event
25. 唯品会的落地实践 – 实际效果 • 典型环境部署案例 • 7~20个关联的应用 • MySQL : 一主多从,多达128个分库分表 • Redis : Single/Sharding/Cluster多种配置并存 • 大量消息队列服务 • 大量数据库和缓存相关环境变量配置,易出错 • 7分钟内完成环境创建 • 自动初始化128个分库,依赖注入生成数据/缓存环境变量 25
26. 微服务基础设施多环境支持 • 数据库和缓存:容器化,每个环境单独实例 • 所有基础设施中间件支持逻辑分区服务 • 消息服务 • 环境分区 à Topic后缀:消息中间件SDK自动适配 • Kafka单一集群过多Topic性能问题:多集群动态分配 26
27. 环境的分区访问和隔离 • HTTP • Skydns 每个环境单独创建统一子域 • 子域内为应用创建域名 • RPC服务注册发现 (唯品会OSP框架) • Zookeeper作为服务注册发现信息存储,按子树支持环境分区 • 基于环境对应子树查询服务 • 边界代理(Vmock),统一转发到外部依赖的环境 • Skydns DNS劫持,转发HTTP • OSP Proxy集成,转发RPC 27
28. 数据Schema和初始数据管理 • 传统数据管理集成 – 多渠道简化数据初始化 • 集成数据变更审批系统获取稳定Schema • SQL脚本支持 • 数据库的快速Clone,多线程导出导入 • 自动化数据Schema与变更管理 • 基于开源Flyway定制的Crius 数据自动管理框架 • 代码库SQL管理标准化+构建插件+CICD集成 • 自动提交变更审批工单 28
29. 数据变更事件服务集成 • CDC(change data capture):应用直接从数据库消费数据变更事件 (唯品会开源RDP) • 应用模型添加RDP服务依赖声明 • 关联的数据源 • 消费数据的Topic名称 • 创建数据库和消息队列后,自动调用CDC服务接口关联数据源和消息Topic MySQL Binlog 解析转换成Kafka消息 消费 Application RDP 29
30. 1000+的微服务推广的挑战与解决 • 自动化生成应用/环境描述 • 逆向工程,基于测试回归环境数据批量生成初始版本 • 从基础服务系统中采集:环境变量,配置,数据Schema • 从日志采集:消息队列 • 用户反馈与快速演进 • 组织级别工作容器环境,基于脚本快速试用 • 收集反馈,快速迭代,自动升级 30
31. 目标与演进 规范化 • 应用/环境标准化 • 基础设施集成 • 应用开放平台服务 紧密集成 • Configuration as Code • 多阶段环境自动部 署 一键拉起 • 项目驱动自动化部 署 • 开发-测试-生产自动 部署 部署全流程标准化 31
32. 32
33. 33