Debian 上实现 Jenkins 负载均衡的可落地方案
一、总体架构与适用场景
- 推荐采用 Master–Agent(原 Master–Slave) 模式:多个 Agent 承担构建任务,实现任务级并行与负载分担;前端用 HAProxy/Nginx 对多个 Master 做 VIP/域名 统一入口与故障切换,实现入口级高可用。
- 典型拓扑:
- 用户/CI → HAProxy/Nginx(80/443) → Jenkins Master 1/2(8080) → Agent 1…N
- 构建任务由 Master 调度到带合适 Label 的 Agent 上执行。
- 适用场景:日常构建并发、多团队共享、需要横向扩容与快速故障切换的团队。
二、快速落地步骤(HAProxy + Master–Agent)
- 准备环境
- 在 Debian 上安装 JDK、Jenkins(建议 LTS),确保各节点时间同步(如 NTP)。
- 建议为 JENKINS_HOME 使用外置存储(如 NFS/块存储),便于多 Master 共享或与 Agent 解耦。
- 部署多个 Master(用于入口高可用)
- 安装方式与单机一致(apt 源或官方包),各 Master 保持相同插件与全局配置;为避免争用,建议仅让 一个 Master 处于可写/活动状态,其余处于待命或仅提供只读/跳转能力(避免多主同时写入同一 JENKINS_HOME)。
- 配置 Master–Agent
- 在 Manage Jenkins → Manage Nodes and Clouds → New Node 创建多个 Agent,设置 Label(如:linux、docker、gpu)。
- 连接方式二选一:
- SSH 启动 Agent(Master 主动连 Agent);
- JNLP/Java Web Start(Agent 主动连 Master,适合跨网段/容器)。
- 在 Job 的 Label Expression 中指定目标 Label,实现按标签调度与负载分担。
- 配置 HAProxy 作为入口负载均衡
- 安装:sudo apt install haproxy
- 示例 /etc/haproxy/haproxy.cfg:
- frontend jenkins
- bind *:80
- default_backend jenkins_servers
- backend jenkins_servers
- balance roundrobin
- server master1 192.168.1.11:8080 check
- server master2 192.168.1.12:8080 check
- 启用:sudo systemctl enable --now haproxy
- 可选:为 Nginx 配置 SSL/TLS
- 使用 Certbot 一键申请并自动配置:sudo certbot --nginx -d jenkins.example.com。
三、配置示例与关键参数
- HAProxy 健康检查与会话保持
- 建议开启 HTTP 检查(如 /login 页面)和健康阈值;如需会话粘性,可结合 stick-table 与 cookie 实现,但注意对 WebSocket/JNLP 长连接的影响。
- Nginx 反向代理常用头与长连接
- 关键头:
- proxy_set_header Host $host;
- proxy_set_header X-Real-IP $remote_addr;
- proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
- proxy_set_header X-Forwarded-Proto $scheme;
- 建议开启 proxy_http_version 1.1 与 proxy_read_timeout,提升控制台与代理通道稳定性。
- 调度策略与 Agent 资源
- 通过 Label 将 CPU/内存/GPU/工具链不同的 Agent 分组;为 Agent 设置合理的 Executors(并发构建数),避免资源争用。
- 安全加固
- 仅暴露 80/443 与必要的 JNLP 端口(默认 50000);限制管理端口访问;为 Jenkins URL 配置一致的 Base URL 与 CSRF 保护。
四、进阶方案
- 容器化与 Kubernetes
- 使用 Jenkins LTS 镜像与 Kubernetes Plugin,按需动态创建 Ephemeral Agent Pod,按 Label 调度,构建结束自动回收,具备良好的弹性与资源利用率。
- 多 Master 共享存储与有状态服务
- 若需多 Master 同时对外服务,务必引入共享 JENKINS_HOME(如 NFS/云盘)与分布式锁/一致性机制,或采用 Jenkins Operator 等方案降低运维复杂度。
- 大规模与高性能入口
- 入口层可在 HAProxy/Nginx 前叠加 LVS/Keepalived 实现更高可用与更大吞吐。
五、验证与常见问题
- 验证要点
- 通过 VIP/域名 访问,确认能登录并创建任务;
- 在多个 Agent 上观察 Executor 占用与任务分布;
- 手动停用某个 Master,确认 HAProxy 自动切换且构建不受影响;
- 检查 /var/log/haproxy.log 或 /var/log/nginx/access.log 的调度与健康检查记录。
- 常见问题
- 构建日志丢失或找不到工作空间:确认 JENKINS_HOME 一致或 Agent 工作目录 正确挂载;
- JNLP 连接不稳定:检查 JNLP 端口(50000) 与防火墙、NAT、反向代理超时设置;
- 静态资源加载慢:为 Nginx 开启 gzip 与合适的 缓存头。