Jenkins 构建集群在 Kubernetes 上的实践与优化
在大型团队的持续集成(CI)实践中,构建效率与资源管理往往是核心痛点。本文将结合 Jenkins Slave 管理的演化过程,分享从传统节点到容器化、再到 Kubernetes 集群化的实战经验。
主要涵盖以下四个维度:
- Jenkins 分布式构建架构
- 基于 Label 的 Slave 集群管理
- 基于插件的容器化实践
- 基于 Kubernetes 的容器化实践
一、Jenkins 分布式构建架构
1.1 架构设计
Jenkins 采用 Master-Slave 分布式架构是提升性能的关键。Master 负责项目管理与任务调度,而具体的编译、测试等构建任务则分担到不同的 Slave Node 上运行。如果单纯依赖 Master 进行构建,除了承担业务开销外,还会大量占用其内存和 CPU 资源,影响系统稳定性。

1.2 Slave 连接方式
Slave 代理通常有两种连接模式:
- SSH 启动:Master 主动发起连接请求,配置相对直接。
- JNLP 启动:基于 Java Web Start,由 Slave 主动向 Master 发起连接。
这两种方式在后续的集群管理中都会涉及,选择哪种取决于网络环境和安全策略。

1.3 调度策略
Jenkins 默认的调度策略基于一致性哈希算法(Consistent Hashing),综合考虑 Node、可用执行器数量及 Job Name,为每个 Job 生成一个优先级列表。这意味着同一个 Job 的多次构建往往会倾向于落在同一个 Slave 上,除非该节点不可用或无空闲执行器。

在实际使用中,这可能导致两种常见现象:
- 指定特定 Slave 时,所有构建都固定在该节点。
- 使用 Label 时,虽然关联了多个 Slave,但大部分构建仍集中在其中一个节点。
若需打破这种默认行为,可引入如 Least Load 等插件,实现负载均衡调度。
二、基于 Label 的 Slave 集群管理
2.1 复杂环境挑战
以安卓产品为例,CI 环境面临诸多挑战:
- 业务差异大:支持手机、电视、车机等多种产品线。
- 构建类型多:Daily Build、Test Build、APK 编译等。
- 代码体量大:单个 TV 项目源码可达 50GB+,编译空间需求高达 100-200GB。
- 编译时间长:并行物理机 24 线程,耗时约 2-3 小时。








