阿里巴巴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