CentOS 上 Jenkins 高可用方案
一、目标与总体架构
- 目标:在 CentOS 上构建可横向扩展、故障可恢复、数据可回滚的 Jenkins 平台,覆盖控制器(Master)与构建代理(Agent)两层,并配套负载均衡与健康检查、备份与恢复、监控告警等工程化能力。
- 架构选型对比:
- 主从 + 共享存储(NFS):以共享的 $JENKINS_HOME 实现多实例“准热备”,配合 HAProxy/Nginx 做 VIP/域名漂移,成本低、落地快,适合中小规模与物理/虚拟机环境。
- Kubernetes 方案:Master 以 StatefulSet 运行并挂载 PV/PVC,构建 Agent 由 Kubernetes 动态创建 Pod,天然弹性伸缩、自愈与滚动升级,适合云原生与大规模场景。
二、方案一 主从 + NFS 共享存储 + 负载均衡(适合物理机/VM)
- 架构要点
- 共享存储:部署 NFS 服务器,导出 /data/share 作为 $JENKINS_HOME 的共享目录;所有 Master 节点以相同路径挂载,实现配置、作业、插件与构建记录的“单写多读”。
- 控制器层:至少 2 台 Master 节点运行相同版本的 Jenkins,前置 HAProxy/Nginx 提供 VIP/域名 与 7 层健康检查(/login 或 /whoAmI),异常自动摘除。
- 代理层:按需横向扩展 Agent(SSH 或 JNLP),通过标签调度构建任务,Master 只负责任务编排与调度。
- 关键步骤
- 部署 NFS(示例)
- 服务端:安装 nfs-utils/rpcbind,创建共享目录并设置权限
- mkdir -p /data/share && chmod 666 /data/share
- /etc/exports 增加:/data/share 10.10.10.0/24(rw,sync,insecure,no_subtree_check,no_root_squash)
- 启动 rpcbind 与 nfs 服务
- 客户端(各 Master):安装 nfs-utils,挂载共享目录到 $JENKINS_HOME(/var/lib/jenkins)
- 安装与初始化 Master(两台)
- 添加 Jenkins YUM 源并安装,设置 JENKINS_HOME=/var/lib/jenkins(已通过 NFS 挂载)
- systemctl enable --now jenkins
- 配置负载均衡与健康检查(HAProxy 示例)
- frontend jenkins
- bind :80
- default_backend jenkins_backend
- backend jenkins_backend
- balance roundrobin
- option httpchk GET /login
- server master01 10.10.10.2:8080 check inter 5s fall 3 rise 2
- server master02 10.10.10.3:8080 check inter 5s fall 3 rise 2
- 配置 Agent
- 在 Master 管理界面添加节点(Permanent Agent),设置 远程工作目录、标签、执行器数;启动方式可选 SSH 或 Launch agent via Java Web Start。
- 验证与演练
- 停止一台 Master,确认 VIP/域名 自动漂移到健康节点,任务可继续调度;回切后检查 $JENKINS_HOME 一致性与构建队列恢复情况。
三、方案二 Kubernetes 方案(适合云原生与大规模)
- 架构要点
- Master:以 StatefulSet 部署,挂载 PV/PVC 持久化 $JENKINS_HOME;通过 Ingress(Nginx)对外暴露;可按需禁用或限制 Jenkins CLI 以提升安全。
- Agent:使用 Kubernetes 插件 动态按需创建 Pod 作为构建执行器,标签驱动调度,自动回收,弹性伸缩。
- 关键步骤
- 准备镜像与目录结构(示例)
- 构建自定义 jenkins-master 镜像(含 JDK 17、WAR、启动脚本),设置环境变量 JENKINS_HOME=/var/jenkins_home,暴露 8080。
- 部署 Master(StatefulSet + PVC + Service + Ingress)
- 通过 StatefulSet 保证有序部署与稳定网络标识;挂载 PV/PVC 到 /var/jenkins_home;Service 固定端口;Ingress 提供域名访问。
- 配置 Kubernetes 插件
- 在 “Manage Jenkins → Cloud → Kubernetes” 中配置 Kubernetes 集群上下文、Jenkins URL、Pod Templates(容器镜像、工作目录、标签、资源请求/限制、卷挂载、ServiceAccount 权限等)。
- 验证
- 创建 Pipeline,使用 agent { kubernetes { yaml ‘’’ podTemplate … ‘’’ } } 动态申请 Agent;观察 Pod 创建/销毁与日志回传是否正常。
四、稳定性与运维要点
- 数据与备份
- 定期备份 $JENKINS_HOME(JAR/配置/作业/插件/构建记录),建议脚本化:停止服务 → 打包归档(含时间戳)→ 清理过期备份 → 记录校验;结合 Cron 定时执行,确保可快速回滚。
- 服务治理
- 使用 systemd 托管 Jenkins 进程,配置 JAVA_OPTS(如 -Xms/-Xmx)、运行用户、优雅停机、开机自启,提升自愈与可观测性。
- 性能与可用性
- 资源基线:生产建议 4 核 CPU/8G 内存 起步,推荐 8 核/16G+;使用 SSD 降低 I/O 瓶颈;合理设置 并发构建数 与 JVM 堆;定期清理旧构建与制品;插件保持更新并移除未使用插件;必要时配置 Git 克隆超时 与国内插件镜像源。
- 时间同步与网络
- 所有节点启用 NTP 时间同步,避免因时钟漂移导致构建与插件问题;跨机房/公网场景确保 JNLP/SSH 端口与代理连通性。
五、落地选型与注意事项
- 选型建议
- 物理机/VM 且预算有限:优先采用 主从 + NFS + VIP/HAProxy,实现快速可用与较低成本。
- 云原生/弹性需求强:采用 Kubernetes 方案,获得更好的弹性、自愈与滚动升级能力。
- 重要注意事项
- NFS 单点风险:建议为 NFS 配置高可用(如 DRBD/双活/云盘快照),并定期演练切换;Master 层再配合 VIP/健康检查 实现快速故障转移。
- 有状态升级:升级前完整备份 $JENKINS_HOME;Kubernetes 场景优先使用 StatefulSet 与滚动更新策略,避免配置漂移。
- 安全加固:限制 Jenkins CLI、最小权限运行、凭据集中管理(Credentials Binding/Secret 管理),对外仅暴露必要端口与路径。