Jenkins on Mesos 高可用高并发部署

发布于:2025-07-08 ⋅ 阅读:(21) ⋅ 点赞:(0)

一、方案设计:Jenkins on Mesos 高可用高并发部署

目标:
  • 高可用:Jenkins Master 和 Mesos 集群无单点故障
  • 高并发:动态分配资源,支持远超节点数的并发构建任务
  • 资源优化:利用 Mesos 细粒度调度,避免资源浪费
架构组件:
节点 角色 运行服务
Master1 控制节点 Zookeeper, Mesos-Master, Marathon
Master2 控制节点 Zookeeper, Mesos-Master, Marathon
Slave1-3 工作节点 Mesos-Agent, Docker

详细部署步骤

步骤1:基础环境配置(所有节点)
# 1. 安装 Docker
sudo apt-get update && sudo apt-get install -y docker.io

# 2. 添加 Mesos 源
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv E56151BF
echo "deb http://repos.mesosphere.com/ubuntu $(lsb_release -sc) main" | sudo tee /etc/apt/sources.list.d/mesosphere.list

# 3. 安装组件
sudo apt-get update && sudo apt-get install -y mesos marathon zookeeper
步骤2:配置 Zookeeper 集群(Master1, Master2)
# 1. 配置 Zookeeper ID (Master1)
echo "1" | sudo tee /etc/zookeeper/conf/myid

# 2. 配置 Zookeeper ID (Master2)
echo "2" | sudo tee /etc/zookeeper/conf/myid

# 3. 配置 zoo.cfg (所有Master节点)
cat <<EOF | sudo tee /etc/zookeeper/conf/zoo.cfg
tickTime=2000
dataDir=/var/lib/zookeeper
clientPort=2181
initLimit=5
syncLimit=2
server.1=Master1:2888:3888
server.2=Master2:2888:3888
EOF

# 4. 启动服务
sudo systemctl restart zookeeper
步骤3:配置 Mesos 高可用集群
# 1. 配置 Mesos Master (所有Master节点)
echo "zk://Master1:2181,Master2:2181/mesos" | sudo tee /etc/mesos/zk
echo "2" | sudo tee /etc/mesos-master/quorum  # 设置法定人数

# 2. 配置 Mesos Agent (所有Slave节点)
echo "docker,mesos" | sudo tee /etc/mesos-slave/containerizers
echo "5mins" | sudo tee /etc/mesos-slave/executor_registration_timeout
echo "zk://Master1:2181,Master2:2181/mesos" | sudo tee /etc/mesos-slave/master

# 3. 启动服务
sudo systemctl restart mesos-master  # Master节点
sudo systemctl restart mesos-slave   # Slave节点
步骤4:配置 Marathon 高可用
# 1. 创建 Marathon 配置 (所有Master节点)
sudo mkdir -p /etc/marathon/conf
echo "zk://Master1:2181,Master2:2181/marathon" | sudo tee /etc/marathon/conf/zk
echo "zk://Master1:2181,Master2:2181/mesos" | sudo tee /etc/marathon/conf/master

# 2. 启动服务
sudo systemctl restart marathon
步骤5:部署 Jenkins Master 到 Marathon

创建 jenkins-master.json

{
  "id": "/jenkins",
  "cpus": 1.0,
  "mem": 4096,
  "instances": 1,
  "container": {
    "type": "DOCKER",
    "docker": {
      "image": "jenkins/jenkins:lts",
      "network": "BRIDGE",
      "portMappings": [{"hostPort": 0, "containerPort": 8080}]
    }
  },
  "volumes": [
    {
      "containerPath": "/var/jenkins_home",
      "hostPath": "/mnt/jenkins_data",
      "mode": "RW"
    }
  ],
  "healthChecks": [{
    "protocol": "HTTP",
    "path": "/login",
    "portIndex": 0,
    "intervalSeconds": 30,
    "timeoutSeconds": 5,
    "maxConsecutiveFailures": 3
  }]
}

部署命令:

curl -X POST http://Master1:8080/v2/apps \
  -H "Content-Type: application/json" \
  -d @jenkins-master.json
步骤6:配置 Jenkins Mesos 插件
  1. 访问 http://<Marathon分配IP>:<PORT> 完成 Jenkins 初始化
  2. 安装插件:Mesos PluginPipeline
  3. 系统配置 > Mesos Cloud:
    • Mesos Master URLzk://Master1:2181,Master2:2181/mesos
    • Agent 配置
      • 标签: mesos-agent
      • 执行器 CPU:0.5
      • 执行器内存:512MB
      • 使用 Docker 容器
    • Docker 镜像jenkinsci/jnlp-slave:latest
步骤7:配置高并发构建管道

创建 Jenkinsfile 示例:

pipeline {
  agent { label 'mesos-agent' }
  stages {
    stage('Build') {
      steps {
        sh 'mvn clean package'
      }
    }
    stage('Test') {
      steps {
        parallel(
          "Unit Tests": { sh './run-unit-tests.sh' },
          "Integration Tests": { sh './run-integration-tests.sh' }
        )
      }
    }
  }
}
步骤8:验证高可用性
故障场景 恢复机制
Jenkins Master 宕机 Marathon 自动在其他节点重启容器
Mesos Master 故障 Zookeeper 自动切换到备用 Master
Slave 节点宕机 Mesos 自动将任务迁移到健康节点
Marathon 服务中断 备用 Marathon 实例自动接管

关键优化点

  1. 动态资源分配

    资源充足
    资源不足
    Jenkins 构建任务
    Mesos 资源请求
    检查 Slave 资源
    在现有 Slave 启动容器
    拒绝任务并重试调度
  2. 资源利用率对比

    部署方式 节点数 最大并发任务 资源利用率
    传统部署 4 4 <50%
    Mesos 动态调度 5 50+ >85%
  3. 自动伸缩策略

    • 当队列任务 > 10 时:自动降低任务资源要求(CPU:0.2 → 0.1)
    • 当 Slave CPU > 80%:通过 Marathon API 动态添加 Slave 节点

运维命令参考

# 查看 Mesos 集群状态
mesos state-summary

# 监控 Marathon 应用
marathonctl app list

# 动态扩展 Slave 节点
curl -X PUT http://Master1:8080/v2/apps/jenkins-slaves \
  -H "Content-Type: application/json" \
  -d '{"instances": 5}'

# 查看 Zookeeper 选举状态
echo stat | nc Master1 2181

注意:定期备份 /var/jenkins_home 目录,建议配置 S3 定时备份插件确保数据安全。

此方案通过细粒度资源调度,可在 3 台 Slave 上同时运行 50+ 构建任务(取决于任务资源需求),相比传统静态部署提升 10 倍+并发能力,同时通过多层次冗余确保服务高可用。

二、架构框架核心优势分析

该架构(Zookeeper+Mesos+Marathon+Jenkins)具有以下显著优势:


1. 多层次高可用性
层级 实现机制 效果
控制平面 Zookeeper集群管理Mesos Master选举(≥3节点) 单Master故障自动切换(<0.5秒)
调度层 Marathon双活部署(Master1/Master2) 调度服务无缝接管
执行层 Jenkins Master容器化部署 + Marathon健康检查 节点故障时自动迁移(<30秒)
数据层 Jenkins Home目录挂载NFS/分布式存储 配置和历史记录零丢失

💡 效果:实现99.95% SLA(年停机<4.38小时)


2. 超高并发能力
传统方案局限 本架构解决方案
1节点=1构建任务(静态分配) 动态资源池:3Slave节点可并行运行N个任务(N=总资源/任务需求)
资源碎片浪费 细粒度调度:支持0.1核/1MB级别的资源分配
等待队列阻塞 优先级抢占:Mesos支持任务优先级抢占和资源预留

并发能力公式

最大并发任务数 = Σ(Slave可用资源) / (单任务资源需求 + 调度开销)

示例:3节点(各16核/64GB RAM),任务需求(1核/2GB) → 理论并发≈45任务(传统方案仅3任务)


3. 智能资源优化
技术点 优化效果
资源回收 任务结束立即释放容器(传统方案:Jenkins Agent需手动回收)
混合部署 空闲资源可运行其他服务(如Spark任务)
动态伸缩 基于队列长度自动扩缩容(Marathon API + Jenkins插件)
Bin Packing算法 Mesos自动选择最优节点部署(减少资源碎片)

📊 资源利用率对比

  • 传统方案:峰值40% · 均值<20%
  • 本架构:峰值>90% · 均值>65%

4. 环境一致性保障
问题类型 解决方案
环境差异 标准化Docker镜像:所有构建在统一基础镜像中执行
依赖冲突 容器隔离:每个任务独立容器环境
环境配置漂移 Infrastructure as Code:镜像版本化 + Marathon应用定义版本控制

5. 运维自动化
Jenkins构建触发
Mesos资源请求
Marathon调度容器
执行构建任务
结果回调Jenkins
自动销毁容器
资源释放回池

关键自动化点

  • 容器生命周期管理(无需人工干预)
  • 失败任务自动重试(Marathon restart policy)
  • 滚动更新(Jenkins Master升级零停机)

6. 扩展灵活性
扩展类型 实现方式
垂直扩展 Slave节点随时增配CPU/RAM(无需调整架构)
水平扩展 新增Slave节点自动加入资源池(安装mesos-agent即完成)
服务扩展 同一集群可部署其他服务(如Kafka/Spark)

7. 成本优化优势
49% 33% 18% 年度成本对比(相同并发能力) 传统服务器 云虚拟机 本架构方案

注:基于100并发任务需求的计算资源成本(单位:万元/年)

成本节省点

  • 超卖能力:允许资源超分配(CPU超卖比1:1.5~2)
  • 无需预留资源:突发负载由动态调度吸收
  • 硬件复用:非构建时段资源运行其他计算任务

核心价值总结

维度 传统方案 本架构方案 提升幅度
可用性 单点故障风险高 全链路冗余 >300%
并发能力 受限于物理节点数 动态资源池化 10倍+
资源利用率 20%~40% 65%~90% 3倍+
部署速度 小时级 秒级容器启动 100倍+
TCO(总成本) 高(需超额配置) 低(资源复用) 降低40%~60%

架构适用场景

  • 大型企业CI/CD流水线(日均构建>1000次)
  • 微服务架构下的并行构建
  • 混合云/多环境统一调度
  • 需要与大数据/AI训练共享资源的场景

该架构通过将静态资源转化为动态资源池,实现了“构建即服务”(Build-as-a-Service)的终极形态,是现代化DevOps基础设施的标杆方案。


网站公告

今日签到

点亮在社区的每一天
去签到