在 CentOS 上实现 Jenkins 高可用的落地方案
一、总体架构与前置条件
- 架构选型建议采用“Active/Standby 双 Master + 共享存储 + 外部负载均衡”来承载 Jenkins 控制器的故障切换,配合“分布式 Agent 集群”承载构建负载,避免单点。生产环境建议 Master 节点至少4 核 CPU、8GB 内存,更优为8 核 16GB+,并使用SSD降低 I/O 瓶颈。所有节点统一Java 版本(Jenkins 2.x 推荐 Java 11+),并确保节点间网络互通与时钟同步(NTP)。
二、共享数据与配置持久化
- 选择一种“集中式、可被多实例挂载”的存储方案作为 Jenkins 主目录(JENKINS_HOME),常见有:NFS、CephFS、GlusterFS、云盘(如 CFS)。以 NFS 为例(两台 Master 均执行):
- 安装 NFS 客户端:sudo yum install -y nfs-utils
- 创建本地挂载点:sudo mkdir -p /var/lib/jenkins
- 挂载共享目录(示例):sudo mount -t nfs 192.168.10.10:/data/jenkins /var/lib/jenkins
- 开机自动挂载:将“192.168.10.10:/data/jenkins /var/lib/jenkins nfs defaults 0 0”写入 /etc/fstab
- 权限与安全:
- 建议运行 Jenkins 的系统用户为jenkins(UID/GID 一致),并确保共享目录对该用户可读写(如 chown -R jenkins:jenkins /var/lib/jenkins)。
- 备份策略:对 JENKINS_HOME 做定期全量/增量备份(如每日 rsync 到备份服务器,或定时 tar 归档),并保留最近若干份历史版本以便回滚。
三、部署双 Master 与 Keepalived 故障切换
- 安装与基础配置(两台 Master 均执行):
- 安装 Jenkins(YUM 源方式):
- sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
- sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key
- sudo yum install -y jenkins java-11-openjdk
- 统一关键配置(/etc/sysconfig/jenkins):
- 设置 JENKINS_HOME=/var/lib/jenkins(确保两节点一致)
- 设置 JENKINS_PORT=8080(避免端口冲突,两台保持一致)
- 可选:JENKINS_ARGS=“–httpListenAddress=127.0.0.1”(仅本地监听,由前端代理转发)
- 启动服务:sudo systemctl enable --now jenkins
- Keepalived 配置虚拟 IP(VIP)与健康检查(两台 Master 差异化配置):
- 安装:sudo yum install -y keepalived
- 示例配置 /etc/keepalived/keepalived.conf(MASTER1 与 MASTER2 的 state/priority/权重不同):
- vrrp_instance VI_1 {
state MASTER # MASTER2 改为 BACKUP
interface eth0 # 按实际网卡名调整
virtual_router_id 51
priority 100 # MASTER2 设为 90
advert_int 1
unicast_src_ip 192.168.10.11 # 本机 IP
unicast_peer { 192.168.10.12 } # 对端 IP
virtual_ipaddress { 192.168.10.100/24 }
track_script { jenkins_check }
}
- vrrp_script jenkins_check {
script “/usr/bin/curl -f http://127.0.0.1:8080/login || exit 1”
interval 5
weight -20
fall 3
rise 2
}
- 启动:sudo systemctl enable --now keepalived
- 说明:通过 VIP(如192.168.10.100)对外提供访问,Keepalived 负责主机故障时的自动漂移,共享存储确保切换后配置与任务不丢失。
四、接入负载均衡与健康检查
- 方案 A(四层高可用):在 VIP 前再加一层 LVS + Keepalived,实现更高可用与性能(可选,适合大规模或严格 SLA 场景)。
- 方案 B(七层灵活转发):使用 Nginx/HAProxy 对 VIP 或两台 Master 做反向代理与健康检查,示例 Nginx 片段:
- upstream jenkins {
server 192.168.10.100:8080 max_fails=3 fail_timeout=30s;
也可直连两台 Master:server 192.168.10.11:8080; server 192.168.10.12:8080;
keepalive 32;
}
server {
listen 80;
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;
}
}
- 健康检查建议:对 /login 或 /health 做 HTTP 探活,失败阈值与超时按实际网络与启动速度调整。
五、构建负载分摊与稳定性优化
- 分布式 Agent 集群(多台构建机):
- 在“Manage Jenkins → Manage Nodes and Clouds → New Node”创建 Agent,配置标签(Label)、远程工作目录、执行器数量等;连接方式可选:
- SSH 启动:在 Master 上配置到 Agent 的免密登录,稳定且易于维护。
- JNLP 启动:在 Agent 上运行 java -jar agent.jar -jnlpUrl http://jenkins/computer//slave-agent.jnlp,适合跨网段或防火墙受限环境。
- 按业务类型为 Agent 打标签,Job 通过标签选择节点,提升资源利用率与并发能力。
- 稳定性与性能要点:
- 调整 JVM 堆大小(如 -Xms/-Xmx),避免 OOM;结合节点资源设置并发构建数上限,防止过载。
- 定期更新/清理插件,移除未使用插件;必要时使用国内插件镜像源加速。
- 定期清理旧构建与制品,避免磁盘被占满;对大仓库适当延长 Git Clone 超时。
- 建议接入监控告警(如 Prometheus + Grafana 采集 Jenkins 指标与系统指标),并设置日志轮转(logrotate)。