阿里巴巴CI平台架构演进

如果无法正常显示,请先停止浏览器的去广告插件。
分享至:
1. 阿里巴巴CI平台架构演进 阿里云技术专家 胡晓宇(昌意)
2. 讲师简介 2013年毕业后加入阿里巴巴,长期负责阿里 巴巴集团研发效能相关的工具平台开发。目前 主要负责阿里云公有产品云效流水线Flow的产 品研发。 胡晓宇 阿里巴巴 技术专家 ee.msup.com.cn
3. 1 CI平台核心技术 指标 ee.msup.com.cn 2 阿里巴巴CI平 台演进 3 使用云原生技术 赋能CI平台
4. CI平台核心技术指标 稳定性 当任意用户触 发构建时,平 台可以在可接 受的时间内开 始构建,并完 成构建 ee.msup.com.cn 成本 在支撑用户构 建需求的前提 下,尽量少的 减少浪费,提 高资源利用率 构建速度 在保证构建隔 离性的前提下, 尽可能的降低 构建时长 构建安全 不但要确保用 户的构建环境 不被其他的平 台使用者窥探 到,同时要保 证系统的本身 不被恶意攻击
5. 阿里巴巴CI平台演进 ~ 2016 内部使用 物理机时代 稳定性 成本 速度 安全 ee.msup.com.cn 差 高 快 差 2016~201 9 内部使用 容器时代 稳定性 成本 速度 安全 优 低 慢 优 2019~202 1 商业化 云原生时代 稳定性 成本 速度 安全 高 低 快 强
6. 使用云原生技术赋能CI平台 CI平台 使用阿里云ACK OpenApi Service • 集群管理 租 户 管理 配额/ 账单 构建 任务 构建 调度 日 志 缓存 ➁ • 集群伸缩 集群度量 • 构建资源 共享公共集群 ee.msup.com.cn • 物理机/虚拟机 K8S Job Controller 租户独占私有集群 构建任 务pod Job Runner 构建任 务 容器 依靠云本身的容灾能力打 造更好的稳定性 使用ACK的弹性容器实例 和集群伸缩能力来应对突 发流量,从而降低成本 使用缓存和更好的工具 (比如buildkit)来构建速 度 使用K8S的资源和网络隔 离能力和安全容器来提高 安全性
7. 稳定性 常见稳定性 问题 ee.msup.com.cn 构建集群稳定性 任务可下发与执行 突发任务量
8. 稳定性 —— 构建资源稳定性 构建资源 北京 可用区A • 集群故障时,全局故障 单集群 ee.msup.com.cn
9. 稳定性 —— 构建资源稳定性 构建资源 北京 可用区A 单集群 构建资源 北京 可用区A 多集群热备 ee.msup.com.cn • • • 任务调度需要负载均衡 单集群故障时通过集群隔离可快速恢复 故障隔离时需要考虑容量是否足够
10. 稳定性 —— 构建资源稳定性 构建资源 北京 可用区A 单集群 构建资源 北京 可用区A 多集群热备 构建资源 北京 可用区A 北京 可用区B 北京 可用区C • 单集群故障时 无风险 • 单可用区(等同于机房)故障时 无风险 多集群,多可用区热备 ee.msup.com.cn
11. 成本 ——任务量监控 任务量监控 • • • ee.msup.com.cn 工作时间段持续高水位 非工作时间段持续低水位 资源浪费
12. 成本 ——弹性调度 CI平台 OpenApi Service 集 群伸缩 集群 管理 ➀ 集 群度量 构 建调度 … 共享公共集群 Node Pod ee.msup.com.cn Pod Node Pod Pod Pod Pod Metrics Controller ➀ Metrics Controller • 采集集群负载
13. 成本 ——弹性调度 CI平台 OpenApi ➁ Service 集 群伸缩 集群 管理 集 群度量 构 建调度 … ➁ 集群伸缩 共享公共集群 Node Pod ee.msup.com.cn Pod • Node Pod Pod Pod Pod Metrics Controller 根据集群度量进行集群 节点伸缩
14. 成本 ee.msup.com.cn ——弹性实例引入 普通Pod 弹性容器实例(ECI Pod) 1. 从节点调度 1. 无固定节点 2. 规格受限 2. 无规格限制 3. 启动时长在1~3s(使用节点镜像缓存) 3. 启动时长约10s+,需要外挂缓存 4. 固定节点计费 4. 按照使用时长计费
15. 成本 ——弹性实例引入 CI平台 OpenApi Service 集 群伸缩 集群 管理 集 群度量 构 建调度 … ➀ 集群中安装Virtual Node组件 共享公共集群 Node Pod Pod Pod ECI Kubelet ee.msup.com.cn ➁ 需要调度ECI时给pod spec打上对 应的annotation Virtual Node ECI ECI alibabacloud.com/eci=true
16. 成本 ——弹性实例调度时机 CI平台 OpenApi Service 集 群伸缩 集群 管理 集 群度量 构 建调度 共享公共集群 Node Pod Pod Virtual Node Pod ECI Kubelet ee.msup.com.cn ECI ECI … 根据集群度量 • 集群资源不足时,构建调度模块 调度ECI • 集群资源充足时,构建调度模块 调度给固定节点
17. 成本 集 群伸缩 集 群度量 构 建调度 • 测试环境成本节约95% + • 生产环境成本降低超50% • 解决了突发任务量的风险 Virtual Node ECI ee.msup.com.cn ECI ECI
18. 构建速度 核心关键字 • runs-on • namespace • machineType • steps 构建Job Spec描述示例 ACK集群 Job Spec namespace steps Pod Step-1 containers Step-2 Step-N … ee.msup.com.cn
19. 构建速度 —— 系统耗时分析 ACK集 群 任务Pod 执行引擎 镜像构建 状态/日志 回传 Job Spec 系统耗时 • 调用ACK集群拉起Pod的时 间 • 在Pod中启动容器的时间 • 状态机日志回传的时间 ee.msup.com.cn Java构建 用户构建耗时 • 每个容器中实际进行构建的 时间,比如运行maven构建, 镜像构建等
20. 构建速度 —— 系统耗时优化 任务下发构建集群 调度pod 下载代码 Java构建 镜像构建 结果解析 ee.msup.com.cn ➀ 步骤容器 启动 镜像拉取 ➀ 容器启动 容器执行 构建环境 启动 ➀ 镜像拉取速度 ➁ 步骤容器启动加速
21. 构建速度 ——启动速度1.0 Node Pod InitContainers ➀ Step-1 Step-2 … Step-N 步骤镜像缓存 ee.msup.com.cn ➀ 串行执行控制 step-1~step-n 按照Job Spec使用 initContainers顺序编排
22. 构建速度 ——启动速度1.0 Node Pod InitContainers ➁ Step-ctl-1 Step-1 Step-2 Step-ctl-2 … Step-ctl-N Step-N 共享工作区 ➁ entrypoint ➁ ctl-files 步骤镜像缓存 ee.msup.com.cn CI平台 ➁ 状态同步 • entrypoint • step-ctl-n • ctl-files
23. 构建速度 ——启动速度1.0 step-1 entrypoint ctl-files step-ctl-1 step-1 … step-2 step-n 成功 echo 0>ctl-files/step-n 失败 echo 1>ctl-files/step-n 容器的入口脚本 由entrypoint代理 step-ctl-n … 检查 ctl-files/step-n 根据step-n的值退出 退出码0,同步步骤成功 退出码1,同步步骤失败 CI平台 ee.msup.com.cn … step-n
24. 构建速度 ——启动速度2.0 Node 串行执行控制 Pod Containers ➀ Step-1 ➀ Step-ctl Log Collector Step-2 … Buildkit Deamon Step-N 共享工作区 ➀ entrypoint ➀ wait-files 步骤镜像缓存 ee.msup.com.cn (1)step-1~step-n 按照Job Spec编排出的步骤 容器,所有容器启动但不执 行 状态同步 CI平台 (2)entrypoint 代理原步骤容器入口 (3)wait-files entrypoint监听 step-ctl监听 (4)step-ctl 控制流容器,负责控制每个 步骤容器step-n的执行与停 止,同时负责状态同步
25. 构建速度 ——启动速度2.0 • • • 已完成 执行中 待执行 step-1 CI平台 step-2 … entrypoint step-n 容器的入口脚本 由entrypoint代理 step-ctl step-n+1 监听wait_files目录中的文件 通过步骤wait_file_n中的exitcode同步对应步骤状态 通过监听wait_files目录中创建的finish_file创建进行退出 … wait-files wait_file_1 • • • wait_file_2 当step-n的entrypoint监听到wait_file_n创建,开始执行 当step-n执行完成,entrypoint创建wait_file_n+1 当step-n识别到自己是最后一个步骤,创建finish_file ee.msup.com.cn … wait_file_n- 1 wait_file_n
26. 构建速度 ——启动速度 构建环境1.0 • • InitContainers顺序更新镜像、启动(慢) 多个step-ctl容器(额外的启停开销) ee.msup.com.cn 构建环境2.0 • • • Containers同时更新镜像,同时启动(快) 单个step-ctl容器 系统耗时整体下降
27. 构建速度 —— 用户耗时优化 ACK集群 OSS ACK集群 任务 Pod 缓存restore 任务 Buildkitd恢 Pod 复 Java构建 镜像构建 Buildkitd缓 存导出与上 传 缓存归档 ACK集群 1. 通用文件型 缓存 任务 Pod Java构建中 预置常用的 Jar包,以提 高速度 2.针对特定技术 栈的缓存预置 ee.msup.com.cn 3.针对镜像构建 的缓存方案 OSS
28. 构建速度 —— 用户耗时优化 任务下发构建集群 调度pod 什么是buildkit? Buildkit的优势 • 更灵活的缓存机制 • 可以支持不需要privileged • 多阶段构建的速度优势 下载代码 ee.msup.com.cn ➁ Java构建 启动buildkitd 步骤的执行 镜像构建 等待buildkitd 启动完成 结果解析 执行镜像构建 buildctl ➁ 镜像构建加速
29. 构建速度 ——镜像构建加速 sync Pod 加载buildkit 缓存 Containers … 等待buildkitd 启动完成 Step 镜像构建 镜像构建 … 缓存gc 缓存上传 ee.msup.com.cn Step-ctl … 启动buildkitd • 通过增加镜像构建缓存的 制作,有效减少镜像构建 时长
30. 构建速度 ——镜像构建加速 Pod Step-ctl … … 镜像构建 Step 镜像构建 Step-ctl ➁ Step 镜像构建 … 等待buildkitd 启动完成 Containers Step 下载代码 … 启动buildkitd Containers 加载buildkit 缓存 启动buildkitd … 加载buildkit 缓存 async Pod 等待 buildctl调用 … sync Buildkit ➀ Deamon 缓存gc 缓存上传 等待完成信号 缓存gc 缓存上传 sync 等待buildkitd 启动完成 • 通过增加镜像构建中相对 耗时的缓存处理 &deamon启动等异步处 理降低步骤耗时 ee.msup.com.cn 镜像构建 通知deamon buildctl --addr tcp://localhost:$port build …
31. 构建安全 K8S构建集群的攻击面 从Master发起 • Apiserver ee.msup.com.cn 从Worker发起 • 网络 • 容器安全
32. 构建安全 构建集群外发起 安全问题 任务量 租户隔离 构建集群内发起 网络安全 容器安全 ee.msup.com.cn
33. 构建安全 OpenApi Service ➀ 租户 ➀ 租户 租户 配额 配额 配额 构建 任务 ➀ namespace namespace Pod runV ResourceQuota Global Networkpolicy ee.msup.com.cn • Namespace隔离租户的 pod/secret等资源 • resourceQuota限制租户滥 用构建资源 • 配额控制租户的任务并发度 公共构建集群 runV ResourceQuota ➀ 租户隔离 构建 任务 构建 任务 Pod Metrics Controller 鉴权 namespace Pod runV ResourceQuota
34. 构建安全 OpenApi 鉴权 Service 租户 ➀ 租户 租户 配额 配额 配额 构建 任务 ➁ 网络隔离 构建 任务 构建 任务 公共构建集群 namespace Pod ResourceQuota ➁ ee.msup.com.cn ➁ Pod runV Metrics Controller namespace namespace runV ResourceQuota Global Networkpolicy ➁ Pod runV ResourceQuota • Networkpolicy • Selector app == build • Deny Egress -10.0.0.0/8 -172.16.0.0/12 -192.168.0.0/16
35. 构建安全 OpenApi 鉴权 Service 租户 ➀ 租户 租户 配额 配额 配额 构建 任务 ➂ 容器安全 • runC->runV 构建 任务 构建 任务 公共构建集群 namespace namespace Pod Metrics Controller ➂ runV ResourceQuota Pod Pod ➂ runV ResourceQuota Global Networkpolicy ee.msup.com.cn namespace ➂ runV ResourceQuota
36. 总结与展望 稳定性 成本 构建速度 构建安全 易用性 开放性 • spec规范,易于迁 移 • 步骤的贡献 ee.msup.com.cn
37. 总结与展望 稳定性 成本 构建速度 构建安全 易用性 开放性 • 接口能力 • 异构场景 • 国产化 • 移动端vm ee.msup.com.cn
38. Q&A ee.msup.com.cn
39. 关注msup公众号 获取更多工程效能实践案例
40. 商业化全貌 ➀ 代码托管平台 ➂ 应用构建 CI平台 代码扫描 函数服务 Serverless Dev 流水线Flow 商业化 CI平台 OpenApi ➀ 支持了主流的代码托管平台 • 云效Codeup Service 租 户 管理 构建 任务 配额/ 账单 日 志 数仓 集群管理 构建 调度 ➁ 支持了常见的制品仓库类型 • 云效统一制品仓库packages 集群伸缩 缓存 步骤 Registry 集群度量 ➁ 制品仓库 Maven Repository 构建资源 共享公共集群 Npm仓库 物理机/虚拟机 K8S Docker仓库 … ee.msup.com.cn Job Controller 租户独占私有集群 构建任 务pod Job Runner 构建任 务 容器 ➂ 支撑了多种服务类型 • 云效Codeup代码扫描 • 云效流水线Flow

Home - Wiki
Copyright © 2011-2024 iteam. Current version is 2.139.0. UTC+08:00, 2024-12-25 14:53
浙ICP备14020137号-1 $Map of visitor$