在 Ubuntu 上实现 Jenkins 高可用部署
一 架构选型与前置准备
- 架构选型
- 主备高可用:部署2 台 Jenkins Master,通过Keepalived + VIP实现故障自动切换,前端用 Nginx/HAProxy 做健康检查与流量转发,避免单点故障。
- 弹性扩展:采用 Master–Agent 分布式构建,构建任务在多个 Agent 上并行执行,Master 仅负责任务调度与配置管理。
- 资源与版本
- 推荐 OpenJDK 11、Ubuntu 20.04/22.04 LTS,并为 JENKINS_HOME 使用独立磁盘或网络存储(如 NFS/块存储),确保数据一致与可快速恢复。
- 基础组件
- 负载均衡与健康检查:Nginx/HAProxy
- 高可用控制:Keepalived(VRRP)
- 监控告警:Prometheus + Grafana
- 日志集中:ELK(Elasticsearch + Logstash + Kibana)
- 配置即代码:JCasC(Configuration as Code) 管理插件与系统配置,提升一致性与可恢复性。
二 方案一 主备高可用 Master + Keepalived + 负载均衡
- 安装与初始化(两台 Master 均执行)
- 安装 Java 与 Jenkins(以 OpenJDK 11 为例):
- sudo apt-get update && sudo apt-get install -y openjdk-11-jdk
- wget -q -O - https://pkg.jenkins.io/debian/jenkins.io.key | sudo apt-key add -
- sudo sh -c ‘echo deb http://pkg.jenkins.io/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list’
- sudo apt-get update && sudo apt-get install -y jenkins
- sudo systemctl enable --now jenkins
- 共享存储与目录
- 将 /var/lib/jenkins 挂载到共享存储(如 NFS),两台 Master 使用同一 JENKINS_HOME,避免切换后配置与任务不一致。
- 配置 Master 仅作为“调度器”
- 在 Manage Jenkins → Configure System 将“执行者数量(# of executors)”设为 0,避免 Master 本地执行构建,降低状态争用风险。
- Keepalived 配置(示例)
- 主节点(MASTER)keepalived.conf 关键片段:
- vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 51 priority 100 advert_int 1 unicast_src_ip 10.0.0.11 unicast_peer { 10.0.0.12 } virtual_ipaddress { 10.0.0.100/24 } }
- 备节点(BACKUP)将 state 改为 BACKUP、priority 略低(如 90),其余一致。
- 启动:sudo systemctl enable --now keepalived
- Nginx 健康检查与转发(示例)
- 健康检查:/usr/lib/nginx/sbin/nginx -t && sudo systemctl reload nginx
- 配置片段:
- upstream jenkins { 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; location / { proxy_pass http://jenkins; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }
- 使用说明
- 通过 VIP 10.0.0.100 访问 Jenkins;Keepalived 自动切换故障节点,Nginx 自动摘除异常实例。
三 方案二 Master–Agent 分布式构建与弹性扩展
- 节点规划
- 在多台 Agent 上安装 OpenJDK 11,保持与 Master 的 Java 版本一致,避免兼容性问题。
- 添加 Agent 的两种方式
- SSH 方式(推荐)
- 在 Manage Jenkins → Manage Nodes and Clouds → New Node 创建“Permanent Agent”,填写 Remote root directory、Labels、Usage 等;在“Launch method”选择 Launch agents via SSH,配置主机、凭据与 Java 路径,保存后自动连接。
- JNLP 方式
- 在节点页面下载 agent.jar 或 slave-agent.jnlp,在 Agent 主机执行:java -jar agent.jar -jnlpUrl http://jenkins-url/computer/agent-name/slave-agent.jnlp
- 任务调度与标签
- 为 Agent 设置有意义的 Labels(如:linux、docker、gpu),在 Job 或 Jenkinsfile 中使用 agent { label ‘linux’ } 或“限制项目的运行节点”实现定向调度与并行构建。
- 容器化与动态扩缩
- Docker:使用 jenkins/ssh-agent 或自定义 Agent 镜像,挂载 /var/run/docker.sock 以支持容器内构建。
- Kubernetes:通过 Kubernetes Plugin 动态按需创建 Pod 作为 Agent,实现弹性伸缩与资源隔离。
四 运维与稳定性最佳实践
- 配置即代码与一致性
- 使用 JCasC(Configuration as Code) 管理安全域、授权策略、工具与插件清单,配合版本控制,确保环境可重建与一致性。
- 监控与日志
- 启用 Prometheus 采集 Jenkins 指标、Grafana 可视化;集中收集 Jenkins 日志 到 ELK,便于故障排查与审计。
- 安全加固
- 在 Manage Jenkins → Configure Global Security 启用安全域(如 Jenkins 自有用户库、LDAP/AD),授权策略建议 Matrix-based security 或 Role-Based Strategy;凭据使用 Credentials Binding 插件加密存储。
- 备份与恢复
- 定期备份 JENKINS_HOME(含 jobs/、plugins/、config.xml 等),并进行恢复演练;共享存储或备份策略应具备版本化与异地能力。