Jenkins集成容器动态Agent构建

Jenkins集成容器动态Agent构建

在传统 CI/CD 架构中,Jenkins 采用静态虚拟机作为构建节点(Agent),存在资源浪费、多项目依赖冲突、环境难以维护等痛点。本文介绍基于 Kubernetes / 阿里云 ACK 集群 实现 Jenkins 容器化动态 Agent 构建方案:任务触发时自动拉起 Pod,运行完毕立即销毁释放资源。


一、集成 ACK 集群配置

1.1 添加 Kubernetes 云

  1. 登录 Jenkins,进入 系统管理 -> 节点和云管理 -> Clouds;
  2. 点击「新建一个 cloud」,类型选择 Kubernetes。

进入Clouds管理

新建Kubernetes Cloud

1.2 配置 Kubernetes 连接参数

进入 Cloud 配置详情页,核心参数如下: * Kubernetes 地址 (API Server):https://kubernetes.default.svc * Kubernetes 命名空间:devops-tools(建议与 Jenkins Deployment 在同一个 Namespace) * Jenkins 地址:http://jenkins-service:8080(集群内部 Service 访问地址) * Jenkins 通道地址 (Tunnel):jenkins-service:50000(集群内部 JNLP 节点通信端口) * 点击「测试连接」,确认连接成功(Connected to Kubernetes)。

配置Kubernetes Cloud连接


二、Pod 模板配置 (Pod Template)

2.1 新增 Pod 模板

在 Cloud 设置下,新增一个名为 aliworker 的 Pod 模板,用于定义执行流水线任务的容器环境。

新增Pod模板

2.2 基础设置与标签匹配

  • 名称:aliworker
  • 命名空间:devops-tools
  • 标签列表 (Labels): text aliworker nodejs master common worker maven

    提示:为兼容旧版流水线任务的 node(label: '...') 声明,可以在标签列表中添加多个以空格分隔的别名,使得指定的脚本均可调度到该容器模板执行。

Pipeline标签声明示例

Pod模板基础配置


三、双容器协同架构 (Main + Sidecar Dind)

为了在无特权隔离的容器环境下安全、高效地进行业务编译与 Docker 镜像构建,推荐采用 主构建容器 + Sidecar Dind (Docker-in-Docker) 双容器架构:

3.1 主构建容器 (jnlp)

  • 容器名称:jnlp
  • 镜像地址:jtp-test-acr-registry-vpc.cn-shenzhen.cr.aliyuncs.com/tools/inbound-agent:slave(基于官方 jenkins/inbound-agent:jdk21 定制打入企业依赖)
  • 工作目录:/home/jenkins/agent
  • 职责说明:负责执行 Pipeline 脚本逻辑,运行 Maven / Gradle 编译 Java,或者运行 Node.js 编译前端代码。

    镜像构建建议:需参考原有虚拟机 Agent 节点的构建工具版本,将一致版本的 nodejs、maven、gradle、docker cli、git、python 等统一固化到 Dockerfile 中构建制品镜像。

主构建容器jnlp配置

3.2 Sidecar 容器 (dind)

  • 容器名称:dind
  • 镜像地址:jtp-test-acr-registry-vpc.cn-shenzhen.cr.aliyuncs.com/tools/inbound-agent:dind(基于官方 docker:stable-dind 搬运至私网 ACR)
  • 职责说明:作为 Sidecar 与主容器协同工作。当主容器执行 docker build 或 docker push 时,通过宿主通信调用 dind 容器提供的 Docker Daemon 服务。

Sidecardind容器配置

3.3 存储卷共享 (Volume Mount)

因为 Agent 构建完成后会随 Pod 自行销毁,具备临时性生命周期,故采用 EmptyDir 卷共享通信套接字: * 挂载路径 1:/var/run * 挂载路径 2:/var/lib/docker

通过该卷共享,主容器内的 Docker CLI 可直接与 dind 容器的 docker socket 交互。

EmptyDir存储卷挂载

3.4 节点亲和性调度 (Node Affinity)

为防止突发高并发构建消耗集群业务节点的 CPU / 内存资源,建议在 Jenkins Pod Template 中配置软亲和(PreferredDuringSchedulingIgnoredDuringExecution),将动态构建 Pod 优先调度到打有特定标签的 CI Worker 节点。


四、常见问题排查与避坑指南

4.1 缺失构建工具

  • 现象:Pipeline 构建报错提示找不到命令(如 mvn: not found 或 npm: not found);
  • 原因与方案:inbound-agent:slave 基础镜像中缺少相应工具,需在 Dockerfile 中补充安装对应版本并重新推送到 ACR。

4.2 SSH 免密配置缺失

  • 现象:Pipeline 部署阶段提示 SSH 报错(Connection refused 或 Permission denied);
  • 原因与方案:inbound-agent:slave 镜像中未打包部署所需的 SSH 私钥,或 ~/.ssh/config 缺少 StrictHostKeyChecking no 配置。

4.3 网络不通目的部署机器

  • 现象:容器内 SSH 或 Curl 目标机器 IP 超时;
  • 原因与方案:Kubernetes Worker 节点所属网段未在目标主机所在的安全组中放通入站 22 / 对应业务端口。

4.4 Docker 镜像推送 / 拉取失败

  • 现象:执行 docker push 提示凭据错误或认证失败;
  • 原因与方案:
  • inbound-agent:slave 镜像中未预置正确的 ACR 认证凭据(/root/.docker/config.json);
  • Sidecar dind 容器未能正常启动,检查特权模式(Privileged)或安全策略是否受限。
评论