温馨提示×

Jenkins在Ubuntu中如何实现负载均衡

小樊
40
2025-11-30 15:49:01
栏目: 云计算

在 Ubuntu 上实现 Jenkins 负载均衡

架构与适用场景

  • 面向 UI 与 API 的访问层负载均衡:使用 NginxHAProxy 对外暴露 80/443,将请求转发到多个 Jenkins Controller 实例,实现入口高可用与横向扩展。
  • 面向构建执行层的负载均衡:通过 Jenkins Controller–Agent(原 Master–Slave) 分布式构建,把构建任务调度到多个 Agent 节点,提升构建吞吐与弹性。上述两种可叠加使用:入口做 Controller 负载均衡,后台用 Agent 扩展执行能力。

方案一 入口负载均衡 Nginx 或 HAProxy

  • 前置准备
    • 部署并启动多个 Jenkins Controller,分别监听 8080(或各自配置的端口),确保各实例的 JENKINS_HOME 数据一致(如通过共享存储或定期备份/恢复),避免作业历史、插件与凭证不一致。
    • 统一域名与跳转:对外仅暴露域名(如 jenkins.example.com),HTTP 自动跳转 HTTPS
  • Nginx 示例(/etc/nginx/sites-available/jenkins)
    • 安装:sudo apt update && sudo apt install -y nginx
    • 配置:
      upstream jenkins_controllers {
          least_conn;                 # 或 round-robin
          server 10.0.0.11:8080 max_fails=3 fail_timeout=30s;
          server 10.0.0.12:8080 max_fails=3 fail_timeout=30s;
      }
      
      server {
          listen 80;
          server_name jenkins.example.com;
          return 301 https://$host$request_uri;
      }
      
      server {
          listen 443 ssl http2;
          server_name jenkins.example.com;
      
          ssl_certificate /etc/letsencrypt/live/jenkins.example.com/fullchain.pem;
          ssl_certificate_key /etc/letsencrypt/live/jenkins.example.com/privkey.pem;
      
          location / {
              proxy_pass http://jenkins_controllers;
              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 90s;
          }
      }
      
    • 启用与检查:
      • sudo ln -s /etc/nginx/sites-available/jenkins /etc/nginx/sites-enabled/
      • sudo nginx -t && sudo systemctl reload nginx
  • HAProxy 示例(/etc/haproxy/haproxy.cfg)
    • 安装:sudo apt update && sudo apt install -y haproxy
    • 配置片段:
      frontend http_front
          bind *:80
          bind *:443 ssl crt /etc/letsencrypt/live/jenkins.example.com/fullchain.pem
          http-request redirect scheme https unless { ssl_fc }
          default_backend jenkins_backend
      
      backend jenkins_backend
          balance leastconn
          option httpchk GET /login
          server controller1 10.0.0.11:8080 check inter 5s fall 3 rise 2
          server controller2 10.0.0.12:8080 check inter 5s fall 3 rise 2
      
    • 启用:
      • sudo systemctl enable --now haproxy
  • 可选 SSL
    • 使用 Certbot 获取并自动配置证书:sudo apt install -y certbot python3-certbot-nginx && sudo certbot --nginx -d jenkins.example.com(按提示操作,证书自动续期)。

方案二 构建负载均衡 Jenkins Controller–Agent

  • 在 Controller 节点添加 Agent
    • 进入 Manage Jenkins → Manage Nodes and Clouds → New Node,类型选 Permanent Agent,配置:
      • Name:如 agent-01
      • Remote root directory:如 /var/lib/jenkins-agent
      • Launch method:推荐 SSH(在目标机器上预先创建 jenkins 用户并配置免密登录),或使用 JNLP
  • 在 Agent 节点安装与启动
    • 安装 Java(如 OpenJDK 11):sudo apt update && sudo apt install -y openjdk-11-jdk
    • 作为系统服务运行(示例以 systemd 单元文件管理,具体以官方包或脚本为准):
      # /etc/systemd/system/jenkins-agent.service
      [Unit]
      Description=Jenkins Agent
      After=network.target
      
      [Service]
      User=jenkins
      WorkingDirectory=/var/lib/jenkins-agent
      ExecStart=/usr/bin/java -jar /var/lib/jenkins-agent/agent.jar \
        -url http://jenkins.example.com/ \
        -secret <AGENT_SECRET> \
        -name agent-01 \
        -workDir /var/lib/jenkins-agent
      Restart=always
      
      [Install]
      WantedBy=multi-user.target
      
      • 启动:sudo systemctl daemon-reload && sudo systemctl enable --now jenkins-agent
  • 验证与扩展
    • Manage Nodes 页面查看 Agent 在线状态、可用 Executors 数量与负载。
    • 按需横向扩展多个 Agent(不同操作系统、不同标签 Label 以匹配构建需求),并在 Job 配置中使用 Label 约束执行节点。

验证与运维要点

  • 健康检查与故障转移
    • Nginx/HAProxy 对 /login/api/json 做健康探测;设置 max_fails/fall/risetimeout,确保异常节点自动摘除与恢复。
  • 会话与粘性
    • 建议以 无状态 方式使用 Jenkins(避免依赖本地会话),必要时在负载均衡器启用 最少连接源地址哈希 提升稳定性。
  • 数据与一致性
    • Controller 场景务必保证 JENKINS_HOME 一致(插件、作业配置、凭证等);可通过 NFSRsync 或配置管理工具同步,并定期做 备份/恢复演练
  • 监控与告警
    • 监控 Controller/Agent CPU、内存、磁盘 IO 与 响应时延;对 5xx502/504健康检查失败 设置告警;结合 日志聚合构建队列 指标进行容量规划。

0