温馨提示×

Ubuntu Jenkins如何进行负载均衡

小樊
34
2025-12-24 07:10:49
栏目: 云计算

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 连接)。保存后会显示 SecretJNLP 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 访问;在多个 MasterMaster + 静态 Agent 前做 HTTP 层 负载均衡与健康检查。
  • 前置准备
    • 建议为 Jenkins WebAgent 通信 使用不同端口:例如 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 直连其所在 Master50000,减少跨 LB 长连接问题。
  • 健康检查与故障隔离
    • Nginx/HAProxy8080 配置 HTTP 健康检查(如返回 200 的 /login 或 /whoAmI),并对异常节点 自动摘除,避免将构建请求打到不可用实例。
  • 数据与一致性
    • JENKINS_HOME 仅在 Master 上保留(作业配置、构建历史、插件等)。多 Master 场景需额外做 共享存储/备份与恢复 或使用 Jenkins Operator/Kubernetes 等方案来保障一致性。
  • 安全加固
    • 仅暴露必要端口(如 80/44350000 内网使用),启用 防火墙反向代理安全头(如 X-Frame-Options、X-XSS-Protection),并为 LB → JenkinsLB → Agent 使用独立网络/ACL。

0