Ubuntu 上实现 Jenkins 负载均衡的实用方案
一、架构选型与适用场景
- 构建负载均衡:使用 Jenkins Master–Agent(原 Slave)分布式构建,把 Job 分发到多个 Agent 并行执行,适合减轻 Master 编译、测试、打包压力,提升吞吐。
- 访问负载均衡:在多个 Jenkins 实例(多 Master) 或 Master + 静态 Agent 前放置 Nginx/HAProxy,对外暴露单一入口,做 HTTP 层 的请求分发与健康检查,提高可用性与横向扩展能力。
二、方案一 构建负载均衡 Master–Agent 分布式构建(推荐)
- 准备环境
- 在所有 Agent 安装 Java(如 openjdk-11-jdk),创建专用工作目录(如 /opt/jenkins-agent),确保与 Master 网络互通。
- 在 Master 创建 Agent
- 进入 Manage Jenkins → Manage Nodes and Clouds → New Node,类型选 Permanent Agent,填写名称、远程工作目录(如 /opt/jenkins-agent)、标签(如 linux-ubuntu)、启动方式选 Launch agent by connecting it to the master(通过 JNLP/agent.jar 连接)。保存后会显示 Secret 与 JNLP URL。
- 在 Agent 启动连接
- 在 Agent 上执行(示例):
- 下载 agent.jar 到 /opt/jenkins-agent
- 运行:java -jar /opt/jenkins-agent/agent.jar -jnlpUrl http://<MASTER_IP>:8080/computer/<AGENT_NAME>/jenkins-agent.jnlp -secret -workDir “/opt/jenkins-agent”
- 回到 Master 节点列表,确认 Agent 状态为 在线。
- 在 Job 中使用节点
- 在任务配置里勾选 Restrict where this project can be run,填写标签(如 linux-ubuntu);或使用 Node and Label parameter 插件在构建时选择节点,实现按标签调度与均衡。
- 验证
- 触发构建,在控制台输出查看 Agent 主机名/IP,确认任务已分发到目标 Agent。
三、方案二 访问负载均衡 Nginx 或 HAProxy 前置分发
- 适用场景
- 对外提供单一域名/IP 的 Jenkins Web 访问;在多个 Master 或 Master + 静态 Agent 前做 HTTP 层 负载均衡与健康检查。
- 前置准备
- 建议为 Jenkins Web 与 Agent 通信 使用不同端口:例如 Web 用 8080,Agent 用 50000(便于在 LB 上做更细粒度策略与健康检查)。
- 使用 Nginx 示例
- 安装:sudo apt-get install nginx
- 配置 /etc/nginx/sites-available/jenkins:
- upstream jenkins { server <MASTER1_IP>:8080; server <MASTER2_IP>:8080; }
- server { listen 80; server_name jenkins.example.com; location / { proxy_pass http://jenkins; 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; } }
- 启用站点并重启:sudo ln -s /etc/nginx/sites-available/jenkins /etc/nginx/sites-enabled && sudo systemctl reload nginx
- 使用 HAProxy 示例
- 安装:sudo apt-get install haproxy
- 配置 /etc/haproxy/haproxy.cfg:
- frontend http-in bind *:80 default_backend jenkins
- backend jenkins balance roundrobin server master1 <MASTER1_IP>:8080 check server master2 <MASTER2_IP>:8080 check
- 重启:sudo systemctl restart haproxy
- 可选 HTTPS
- 使用 Certbot 为域名申请 Let’s Encrypt 证书并自动配置 Nginx:sudo certbot --nginx -d jenkins.example.com
- 验证
- 访问域名,确认登录页可打开;在 LB 统计页/日志中查看后端 Jenkins 实例的命中与健康检查状态。
四、关键注意事项与最佳实践
- 会话粘滞与 CSRF
- 建议开启 Sticky Session(ip_hash/会话亲和),避免 Web 会话在多个 Master 间漂移;同时开启 CSRF 保护 并使用一致的 Jenkins URL,防止表单提交异常。
- 静态 Agent 端口
- 若前置 LB 也代理 50000(Agent 端口),需保证 LB → Agent 的连通性;更推荐仅代理 8080,让 Agent 直连其所在 Master 的 50000,减少跨 LB 长连接问题。
- 健康检查与故障隔离
- 在 Nginx/HAProxy 为 8080 配置 HTTP 健康检查(如返回 200 的 /login 或 /whoAmI),并对异常节点 自动摘除,避免将构建请求打到不可用实例。
- 数据与一致性
- JENKINS_HOME 仅在 Master 上保留(作业配置、构建历史、插件等)。多 Master 场景需额外做 共享存储/备份与恢复 或使用 Jenkins Operator/Kubernetes 等方案来保障一致性。
- 安全加固
- 仅暴露必要端口(如 80/443 与 50000 内网使用),启用 防火墙 与 反向代理安全头(如 X-Frame-Options、X-XSS-Protection),并为 LB → Jenkins 与 LB → Agent 使用独立网络/ACL。