跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像AI 生图工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Javajava

Jenkins 构建集群在 Kubernetes 上的实践与优化

分享了 Jenkins 构建集群从传统节点到 Kubernetes 的演进实践。针对大型团队 CI 面临的资源闲置、空间不足及环境异构问题,依次探讨了基于 Label 的资源池化管理、Docker 插件容器化及 K8s 深度集成方案。通过优化调度策略、清理 Workspace 及配置资源限制,实现了资源利用率提升 50% 以上及成本下降 35%。K8s 方案虽需关注高可用架构,但在大规模场景下提供了最佳的环境隔离与弹性伸缩能力。

战神发布于 2025/2/23更新于 2026/7/2330 浏览
Jenkins 构建集群在 Kubernetes 上的实践与优化

Jenkins 构建集群在 Kubernetes 上的实践与优化

在大型团队的持续集成(CI)实践中,构建效率与资源管理往往是核心痛点。本文将结合 Jenkins Slave 管理的演化过程,分享从传统节点到容器化、再到 Kubernetes 集群化的实战经验。

主要涵盖以下四个维度:

  1. Jenkins 分布式构建架构
  2. 基于 Label 的 Slave 集群管理
  3. 基于插件的容器化实践
  4. 基于 Kubernetes 的容器化实践

一、Jenkins 分布式构建架构

1.1 架构设计

Jenkins 采用 Master-Slave 分布式架构是提升性能的关键。Master 负责项目管理与任务调度,而具体的编译、测试等构建任务则分担到不同的 Slave Node 上运行。如果单纯依赖 Master 进行构建,除了承担业务开销外,还会大量占用其内存和 CPU 资源,影响系统稳定性。

Jenkins 分布式架构图

1.2 Slave 连接方式

Slave 代理通常有两种连接模式:

  • SSH 启动:Master 主动发起连接请求,配置相对直接。
  • JNLP 启动:基于 Java Web Start,由 Slave 主动向 Master 发起连接。

这两种方式在后续的集群管理中都会涉及,选择哪种取决于网络环境和安全策略。

Jenkins Slave 连接方式

1.3 调度策略

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

Jenkins 调度策略

在实际使用中,这可能导致两种常见现象:

  1. 指定特定 Slave 时,所有构建都固定在该节点。
  2. 使用 Label 时,虽然关联了多个 Slave,但大部分构建仍集中在其中一个节点。

若需打破这种默认行为,可引入如 Least Load 等插件,实现负载均衡调度。

二、基于 Label 的 Slave 集群管理

2.1 复杂环境挑战

以安卓产品为例,CI 环境面临诸多挑战:

  • 业务差异大:支持手机、电视、车机等多种产品线。
  • 构建类型多:Daily Build、Test Build、APK 编译等。
  • 代码体量大:单个 TV 项目源码可达 50GB+,编译空间需求高达 100-200GB。
  • 编译时间长:并行物理机 24 线程,耗时约 2-3 小时。
  • 环境异构:不同产品线的服务器配置、版本、CPU 等资源不一致。
  • 2.2 常见问题

    随着业务发展,我们遇到了典型的瓶颈:

    • 资源闲置与排队并存:部分 Slave 空闲,但队列中任务积压。
    • 空间不足:Workspace 遗留导致构建失败。
    • 环境隔离难:业务间无法共享编译环境,导致重复建设。

    2.3 优化改进

    针对上述问题,我们实施了四项优化措施:

    1. 同质 Slave 统一 Label:将同类型 Slave 打上相同标签,同类型 Job 通过 Label 调度,形成资源池。
    2. 调整 Executor 数量:根据业务场景适量增加 Slave 的执行器数量,提升并发能力。
    3. 定时清理 Workspace:扫描并清理废弃 Job 的残留文件,释放磁盘空间。
    4. 配置清理规则:在 Post Build Action 中设置清理策略,保留必要的缓存(如 ccache),删除无用文件。

    例如,通过保留关键缓存,可将 200GB 的编译空间压缩至 50GB 左右,极大缓解存储压力。

    2.4 优化效果

    实施后取得了显著成效:

    • 并发能力提升:Label 资源池化有效缓解了队列等待。
    • 空间利用率提高:构建失败率因空间不足大幅下降。
    • 资源趋于均衡:Disk 和 CPU 利用率在不同 Slave 间更加均匀。

    优化效果对比

    2.5 方案反思

    优势:资源池化、并发量增大、Job 配置透明化。

    局限:Jenkins 内置调度策略可能导致资源不均;同一 Job 多次构建倾向同一节点;环境隔离性较差,业务调整时需重构基础设施。

    三、基于 Docker 插件的容器化实践

    3.1 需求驱动

    APK 编译面临单点服务器性能差、环境依赖复杂、并发困难等问题。引入容器化成为必然选择。

    3.2 镜像固化

    Docker Image 需包含构建账号、权限、SDK/NDK 及工具链。建议按产品线划分镜像,避免'大而全'导致的维护成本过高。同时需配套自动化构建、更新和部署流程。

    3.3 插件集成

    使用 Jenkins Docker 插件(如 0.15.0 版本)可实现容器化 Slave。插件支持 SSH 连接,后续版本开始支持 JNLP。

    配置要点:

    • 添加 Docker Host 信息,可视为普通 Slave。
    • 定义 Docker Template,关联具体镜像。

    Docker 插件配置

    3.4 配置示例

    • Name:Docker 配置名称。
    • Docker URL:连接 Docker Host 的地址。
    • Container Cap:设置并发数量限制。
    • Launch Method:连接方式(早期仅支持 SSH)。

    配置示例

    3.5 方案反思

    优势:环境标准化、隔离性好、按需弹性伸缩、资源共享。

    局限:Docker Host 与 Image 强耦合,配置繁琐;调度策略仍依赖 Jenkins 默认机制,存在不均衡风险。

    四、基于 Kubernetes 的容器化实践

    4.1 为什么选择 K8s

    面对 Docker 插件的局限性,Kubernetes 提供了更强大的编排能力。它支持 Pod 概念,允许在一个 Pod 中运行多个 Container,并通过插件创建 Pod 来挂载 Jenkins Slave。

    4.2 业务需求

    • 资源收缩严重,需保障业务正常运转。
    • 容器化与标准化,确保构建环境隔离。
    • 利用 K8s 资源限制与调度策略,实现服务器资源共享。

    此外还需考虑性能对比、版本选择、Registry 管理及构建优化(如代码镜像、编译缓存)。

    4.3 可行性验证

    通过 VM 与 Docker 容器的编译性能对比测试,确认两者性能基本一致,坚定了迁移信心。

    4.4 组件版本

    参考主流稳定版本组合,确保兼容性。

    4.5 镜像构建

    使用 Ansible Playbook 批量部署环境,结合 Dockerfile 自动化构建镜像。

    4.6 依赖管理

    • 外部工具:单一可信数据源,Ceph 存储,Node 通过 NFS 挂载。
    • 代码镜像:本地目录挂载,Volume 使用。
    • 编译缓存:本地目录挂载,支持命中率统计和多基线复用。

    4.7 全景架构

    Jenkins 通过 K8s 插件在 Node 上创建容器作为 Slave。外部依赖包括 Cache、Tools、Mirror、Harbor 及监控组件 Grafana。

    Jenkins 集成 K8s 全景

    4.8 实施效果

    迁移至容器化后:

    • 资源利用率提升 50% 以上。
    • 资源成本下降 35%。
    • 新业务上线速度显著加快。

    4.9 插件配置

    • 配置 Kubernetes API URL。
    • 添加 Pod Template(Image)。
    • 启动命令间接使用 JNLP。
    • 配置资源限制(CPU/Memory)。

    4.10 配置示例

    注意划线部分的参数配置,确保连接正常。

    配置示例

    4.11 资源限制

    对 CPU 和 Memory 设置 Limit 和 Request,防止资源争抢影响集群稳定性。

    资源限制配置

    4.12 启动脚本

    容器启动脚本需处理 SECERT 和 SLAVE_NAME 参数,JENKINS_URL 通常设置为环境变量。

    容器启动脚本

    4.13 方案反思

    优势:继承 Docker 优点,支持资源限制,利用 K8s 原生调度。

    局限:K8s Cluster 的高可用性至关重要,单 Master 故障会导致整个构建集群瘫痪,需自行实现 HA 方案。

    4.14 持续改进

    未来方向包括 Jenkins Master 容器化、Job 脚本化以及流水线驱动的持续交付。

    4.15 总结

    方案效果注意点
    Label1. Slave 资源池化,整体资源利用率提高
    2. 构建并发量提升
    3. Slave 变动对 Job 配置透明化
    1. 环境一致性要求高
    2. Workspace 清理问题
    3. 默认调度策略不完美
    Docker1. 环境标准化、隔离性、可移植性
    2. 容器 Slave 按需弹性伸缩
    3. 服务器资源共享
    4. 并发量可控
    1. Host 与 Image 强耦合
    2. 默认调度策略
    3. Registry 管理成本高
    Kubernetes1. 具备 Docker 插件所有优点
    2. 资源申请限制灵活
    3. 使用 K8s 调度策略
    1. Cluster 高可用性问题
    2. 监控重要性
    3. 配套管理工作量大

    三种方案各有优劣,应根据实际业务规模与团队技术栈选择合适的落地路径。

    目录

    1. Jenkins 构建集群在 Kubernetes 上的实践与优化
    2. 一、Jenkins 分布式构建架构
    3. 1.1 架构设计
    4. 1.2 Slave 连接方式
    5. 1.3 调度策略
    6. 二、基于 Label 的 Slave 集群管理
    7. 2.1 复杂环境挑战
    8. 2.2 常见问题
    9. 2.3 优化改进
    10. 2.4 优化效果
    11. 2.5 方案反思
    12. 三、基于 Docker 插件的容器化实践
    13. 3.1 需求驱动
    14. 3.2 镜像固化
    15. 3.3 插件集成
    16. 3.4 配置示例
    17. 3.5 方案反思
    18. 四、基于 Kubernetes 的容器化实践
    19. 4.1 为什么选择 K8s
    20. 4.2 业务需求
    21. 4.3 可行性验证
    22. 4.4 组件版本
    23. 4.5 镜像构建
    24. 4.6 依赖管理
    25. 4.7 全景架构
    26. 4.8 实施效果
    27. 4.9 插件配置
    28. 4.10 配置示例
    29. 4.11 资源限制
    30. 4.12 启动脚本
    31. 4.13 方案反思
    32. 4.14 持续改进
    33. 4.15 总结
    • 免费图片AI生成工具免费生成了解详情
    • Magick API 一键接入全球大模型注册送1000万token查看
    • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
    • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
    • 100+免费在线小游戏爽一把
    极客日志微信公众号二维码

    微信扫一扫,关注极客日志

    微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

    更多推荐文章

    查看全部
    • Docker 部署 Music-Tag-Web 音乐标签编辑工具
    • ASP.NET Core Web API 控制器及方法注解详解
    • 前端开发者 Agent 工程化开发学习路线
    • MWC 2026 IQ 时代与 DeepSeek V4 多模态技术解析
    • OpenAI DALL·E 3 技术解析:ChatGPT 整合与图像生成能力升级
    • LLM 提示工程技巧总结:从 Zero-Shot 到 Chain-of-Thought
    • 现代 C++ constexpr 特性演进:从 C++11 到 C++20
    • VSCode Git 插件详解与配置指南
    • 用 AI 打造鸿蒙游戏 NPC 的开发体验与思考
    • Python 技能变现指南:合法合规的兼职方向与技术实践
    • FPGA 摄像头到屏幕完整链路:OV5640 采集到 HDMI 实时显示
    • GitHub 代码搜索实战:工具推荐与高级语法详解
    • Docker 基础:虚拟化原理与容器化实战
    • HarmonyOS6 RcImage 组件填充模式与形状系统设计(一)
    • Python 词云库 wordcloud 中文显示问题详解
    • 本地大模型部署的残酷真相:成本、门槛与真实体验
    • 从零写 Agent 框架:Workflow 与 Runtime 模块设计
    • Qlib 前端可视化平台助力量化投资
    • 全国计算机等级考试(二级 Web)安排与真题解析
    • C++原子操作:从底层原理到实战应用

    相关免费在线工具

    • Keycode 信息

      查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

    • Escape 与 Native 编解码

      JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

    • JavaScript / HTML 格式化

      使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

    • JavaScript 压缩与混淆

      Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

    • Base64 字符串编码/解码

      将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

    • Base64 文件转换器

      将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online