Jenkins 架构:Master/Agent 详解
Jenkins 采用经典的 Master/Agent(主节点/工作节点)分布式架构。这种设计将控制平面与执行平面分离,使得 Jenkins 能够横向扩展,承载大规模、异构的 CI/CD 任务。理解 Master 与 Agent 的职责划分及通信机制,是高效运维 Jenkins 集群的基础。
1. Master 与 Agent 的职责边界
Master 节点是 Jenkins 的控制中枢,负责管理整个系统的状态、调度任务、存储配置与构建产物。Agent 节点是实际执行构建任务的“工人”,接收 Master 下发的指令并运行 Pipeline 或 Job。
| 角色 | 核心职责 | 关键组件 / 数据 | 典型负载 |
|---|---|---|---|
| Master | 任务调度、配置管理、用户认证、插件管理、构建历史存储 | Jenkins Home 目录、Job 配置、凭证、插件、构建记录 | 轻量级(CPU 低,磁盘 I/O 中等) |
| Agent | 拉取代码、编译、测试、打包、部署等实际构建步骤 | Workspace(工作空间)、构建工具链(JDK、Maven、Node.js) | 重量级(CPU 高,内存大,磁盘 I/O 密集) |
最佳实践: 生产环境中,Master 节点应避免执行任何构建任务(即禁用“内建节点”上的执行器),以确保调度稳定性和 UI 响应速度。所有构建负载应全部分配给 Agent 节点。
2. Master/Agent 通信机制
Master 与 Agent 之间通过 TCP/IP 协议进行双向通信。Jenkins 使用自定义的 Remoting 协议(基于 Java RMI 和 NIO)来传输命令、文件和控制流。通信链路始终由 Agent 主动发起,Master 监听并响应。
2.1 连接建立方式
- JNLP(Java Web Start)方式: Agent 通过一个 JNLP 文件获取 Master 的地址和端口,然后建立 TCP 连接。适用于动态 Agent(如 Kubernetes Pod、Docker 容器)。
- SSH 方式: Master 通过 SSH 协议连接到 Agent 节点,并在远程启动 Agent 进程。适用于固定 IP 的虚拟机或物理机。
- Windows 服务方式: Agent 以 Windows 服务形式运行,通过 JNLP 或自定义端口与 Master 通信。
2.2 通信协议栈
Remoting 协议栈分为三层:
- 传输层: 基于 TCP Socket,默认端口 50000(可配置)。
- 协议层: 使用
Command/Response模式,序列化 Java 对象进行交互。 - 应用层: 传递 Pipeline 步骤、文件传输、日志流、环境变量等业务数据。
安全提示: 建议启用 TCP 端口加密 和 Agent → Master 访问控制(在“全局安全配置”中设置),防止中间人攻击或未授权 Agent 接入。
3. Master/Agent 架构示意图
下图展示了 Jenkins 分布式架构的核心组件与通信流向:
4. Agent 的启动与注册流程
一个 Agent 从启动到就绪,经历以下关键步骤:
- 获取连接信息: Agent 通过 JNLP 文件或 SSH 配置获取 Master 的 IP 和端口。
- 建立 TCP 连接: Agent 向 Master 的 50000 端口发起 Socket 连接。
- 握手与认证: 交换 Secret(密钥),验证 Agent 身份是否在 Master 的白名单中。
- 资源协商: Agent 上报自身标签(Label)、执行器数量、系统属性(OS、工具路径)。
- 进入空闲状态: Master 将 Agent 标记为“在线”,等待 Job 调度。
常见故障: 如果 Agent 长时间处于“连接中”或“离线”状态,请检查:
• Master 防火墙是否放行 50000 端口。
• Agent 上的 Java 版本是否与 Master 兼容(推荐 Java 11 或 17)。
• JNLP 文件中的 Secret 是否过期或错误。
• Master 防火墙是否放行 50000 端口。
• Agent 上的 Java 版本是否与 Master 兼容(推荐 Java 11 或 17)。
• JNLP 文件中的 Secret 是否过期或错误。
5. 执行器与任务分配
每个 Agent 可以配置多个 执行器(Executor),即并行执行构建任务的“槽位”。Master 根据以下策略将 Job 分配给 Agent:
- 标签匹配: Job 通过
label指令指定目标 Agent(如agent { label 'linux && docker' })。 - 负载均衡: 当多个 Agent 满足标签条件时,Master 优先选择空闲执行器最多的 Agent。
- 任务队列: 如果所有匹配 Agent 的执行器都被占用,Job 进入等待队列,直到有执行器释放。
| 配置项 | 说明 | 推荐值 |
|---|---|---|
| 执行器数量 | Agent 上可并行运行的 Job 数 | CPU 核心数 × 1.5(I/O 密集型)或 CPU 核心数(计算密集型) |
| 标签 | 用于标识 Agent 的能力(如 OS、工具链) | 例如:linux、windows、docker、gpu |
| 工作空间根目录 | Agent 上存放构建代码的路径 | 建议使用独立磁盘分区,避免系统盘写满 |
6. 高可用与扩展建议
基于 Master/Agent 架构,Jenkins 集群的扩展策略如下:
- 水平扩展 Agent: 使用 Kubernetes 插件或 Docker 插件动态创建 Agent,按需伸缩,节省资源。
- Master 高可用: 通过外部数据库(如 MySQL/PostgreSQL)和共享存储(如 NFS)实现 Master 冷备或主从切换。
- 网络隔离: 将 Agent 部署在不同网络区域(如开发网、测试网、生产网),通过 Master 统一调度,避免跨网段直接暴露。
生产级配置要点:
• Master 节点:4 核 CPU、8GB 内存、100GB SSD(仅存储配置和元数据)。
• Agent 节点:根据构建负载配置 8~32 核 CPU、16~64GB 内存、200GB+ SSD(用于 Workspace 和缓存)。
• 网络延迟:Master 与 Agent 之间的 RTT 应小于 10ms,否则文件传输和日志流会成为瓶颈。
• Master 节点:4 核 CPU、8GB 内存、100GB SSD(仅存储配置和元数据)。
• Agent 节点:根据构建负载配置 8~32 核 CPU、16~64GB 内存、200GB+ SSD(用于 Workspace 和缓存)。
• 网络延迟:Master 与 Agent 之间的 RTT 应小于 10ms,否则文件传输和日志流会成为瓶颈。