真正可靠、可维护的jenkins集群部署核心是用docker swarm做编排底座,配合swarm plugin实现agent动态注册与弹性伸缩,主节点仅调度、agent按需拉起并空闲自动回收。

不需要写“一键脚本”,真正可靠、可维护的Jenkins集群部署,核心是用 Docker Swarm 做编排底座,配合 Jenkins Agent 动态注册机制(如 Swarm Plugin 或 JNLP),实现工作节点按需拉起、空闲自动回收。所谓“一键”只是封装了标准化命令,底层逻辑必须清晰。
用 Docker Swarm 初始化高可用集群底座
Swarm 是 Docker 原生支持的轻量级编排工具,无需额外组件,适合中小规模 CI/CD 场景:
- 在主节点执行
docker swarm init --advertise-addr,生成管理节点 - 将返回的
docker swarm join --token ...命令,在各 Worker 节点运行,完成纳管 - 验证:运行
docker node ls,看到所有节点状态为Ready且角色明确(manager或worker) - 确保所有节点已安装 Docker Engine(≥20.10),并开放 2377(Swarm)、7946(gossip)、4789(overlay)端口
部署主节点并启用动态 Agent 注册
主节点不直接构建,只负责调度与 UI。关键在于让它能自动发现和接纳新 Agent:
- 使用官方 LTS 镜像启动 Jenkins Master:
docker service create --name jenkins-master --publish 8080:8080 --publish 50000:50000 --mount type=bind,source=/opt/jenkins/data,target=/var/jenkins_home --mount type=bind,source=/var/run/docker.sock,target=/var/run/docker.sock jenkins/jenkins:lts - 登录 Web 界面(
http://<master-ip>:8080</master-ip>),安装必要插件:Swarm Plugin(推荐)或 Docker Plugin(需配合 Docker-in-Docker) - 进入 系统管理 → 全局安全配置,启用 代理端口(50000) 并勾选 允许匿名用户读取权限(仅内网可信环境)
- 进入 系统管理 → 节点管理 → 新建节点,选择 Swarm Cloud 类型,填入 Swarm 集群地址(如
http://swarm-manager:2377)及凭据
配置 Agent 模板并触发弹性伸缩
Agent 不是固定容器,而是根据构建任务需求实时创建、用完即毁:
- 在 Swarm Cloud 配置页中,添加一个 Agent 模板:
— 标签名(如docker-build)用于任务绑定
— Docker 镜像(如jenkins/inbound-agent:4.11-1或自定义含 Maven/Node.js 的镜像)
— 容器内存限制(如--memory=2g)、CPU 配额、挂载卷(如/var/run/docker.sock:/var/run/docker.sock) - 设置伸缩策略:
— 最小实例数 = 0(空闲时不占资源)
— 最大实例数 = 合理上限(如 10)
— 空闲超时 = 300 秒(任务结束 5 分钟后自动销毁) - 新建 Pipeline 任务时,在
agent块中指定标签:agent { label 'docker-build' },Jenkins 会自动拉起匹配模板的容器执行
验证与日常运维要点
伸缩是否生效,不能只看界面,要结合底层确认:
- 提交一个带
sleep 600的测试 Pipeline,观察:
— Jenkins 节点列表中出现新 Agent(名称含swarm-前缀)
— 运行docker ps在任意 Worker 节点上看到对应容器
— 任务结束后 5 分钟,容器自动退出,节点从 Jenkins 列表消失 - 持久化必须到位:
—/var/jenkins_home必须挂载到宿主机目录(如/opt/jenkins/data),否则重启后所有配置丢失
— 插件、凭证、Job 配置全存在该目录下,不要依赖容器内临时存储 - 避免常见陷阱:
— 不要将 Jenkins Master 也作为 Worker 运行构建(易导致调度死锁)
— 不要在 Agent 容器里再跑 Docker(DinD),优先用host.docker.sock直通宿主机 Docker 引擎
— 所有节点时间需同步(chrony或ntpd),否则日志和证书校验异常











