温馨提示×

CentOS Jenkins的高可用性方案

小樊
36
2025-12-25 14:12:43
栏目: 智能运维

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 只负责任务编排与调度。
  • 关键步骤
    1. 部署 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)
    2. 安装与初始化 Master(两台)
      • 添加 Jenkins YUM 源并安装,设置 JENKINS_HOME=/var/lib/jenkins(已通过 NFS 挂载)
      • systemctl enable --now jenkins
    3. 配置负载均衡与健康检查(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
    4. 配置 Agent
      • 在 Master 管理界面添加节点(Permanent Agent),设置 远程工作目录标签执行器数;启动方式可选 SSHLaunch agent via Java Web Start
    5. 验证与演练
      • 停止一台 Master,确认 VIP/域名 自动漂移到健康节点,任务可继续调度;回切后检查 $JENKINS_HOME 一致性与构建队列恢复情况。

三、方案二 Kubernetes 方案(适合云原生与大规模)

  • 架构要点
    • Master:以 StatefulSet 部署,挂载 PV/PVC 持久化 $JENKINS_HOME;通过 Ingress(Nginx)对外暴露;可按需禁用或限制 Jenkins CLI 以提升安全。
    • Agent:使用 Kubernetes 插件 动态按需创建 Pod 作为构建执行器,标签驱动调度,自动回收,弹性伸缩。
  • 关键步骤
    1. 准备镜像与目录结构(示例)
      • 构建自定义 jenkins-master 镜像(含 JDK 17、WAR、启动脚本),设置环境变量 JENKINS_HOME=/var/jenkins_home,暴露 8080
    2. 部署 Master(StatefulSet + PVC + Service + Ingress)
      • 通过 StatefulSet 保证有序部署与稳定网络标识;挂载 PV/PVC/var/jenkins_home;Service 固定端口;Ingress 提供域名访问。
    3. 配置 Kubernetes 插件
      • 在 “Manage Jenkins → Cloud → Kubernetes” 中配置 Kubernetes 集群上下文Jenkins URLPod Templates(容器镜像、工作目录、标签、资源请求/限制、卷挂载、ServiceAccount 权限等)。
    4. 验证
      • 创建 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 管理),对外仅暴露必要端口与路径。

0