jenkins动态节点申请本质是任务驱动的自动pod创建与回收,由kubernetes插件作为调度开关实现:任务触发即拉起pod,结束即释放资源;前提为插件(≥1.37)已安装且jenkins能稳定访问集群,连接方式依部署位置分为内部serviceaccount最小权限授权或外部kubeconfig配置;pod模板需按需定制镜像、资源限制、多容器组合及挂载配置;整个流程由任务生命周期自动驱动,无需人工干预或hpa。

Jenkins 本身不自带动态扩容能力,必须借助外部编排系统实现。目前最成熟、生产广泛采用的方式是通过 Kubernetes 插件,让每个构建任务按需拉起一个 Pod 作为临时构建节点(Agent),任务结束即销毁,全程自动触发、无需人工干预。
核心机制:任务驱动的 Pod 生命周期管理
动态扩容不是靠定时检查或手动操作,而是由 Jenkins 的任务调度直接触发:
- 当 Pipeline 或 Freestyle 任务被分配到标记为
kubernetes的云配置时,Kubernetes 插件立即读取预设的 Pod 模板 - 插件调用 Kubernetes API 创建 Pod,其中至少包含一个运行 JNLP 客户端的容器
- 该容器主动连接 Jenkins Master,注册为临时 Agent,并开始执行构建步骤
- 构建成功或失败后,Pod 默认在 5 分钟空闲后自动终止;异常中断时插件也会主动清理
关键前提:插件与集群连通可靠
插件版本需 ≥ 1.37,且 Jenkins 必须能稳定访问 Kubernetes API Server:
- 若 Jenkins 运行在集群内,使用 ServiceAccount 绑定最小权限 Role(仅需
pods的 create/list/delete/get) - 若 Jenkins 在集群外,需提供有效 kubeconfig 或 token,并确保 API Server 地址可访问(如通过 LoadBalancer 暴露)
- 务必验证连通性:
kubectl get pods -n <namespace></namespace>能从 Jenkins 控制器正常返回结果
Pod 模板要聚焦实际构建需求
模板不是越复杂越好,重点是让构建快、稳、安全:
- 镜像选型:优先使用预装好 Maven/Node.js/Go 等工具链的基础镜像,避免构建中下载安装拖慢速度
-
资源限制:设置 CPU 和内存的
requests/limits,防止单个构建吃光节点资源;建议从 2C4G 起步,再按任务负载调整 - 多容器协同:可在同一 Pod 中并行运行 jnlp + maven + selenium 等容器,减少 Pod 创建频次,提升复用率
- 敏感信息挂载:用 volumeMount 挂载 Secret(如 Docker Hub 凭据)、ConfigMap(如 settings.xml)或 PVC(如 Maven 本地仓库缓存)
高可用与弹性可进一步叠加
动态节点解决的是 Agent 层的弹性,Jenkins Master 本身也可通过 K8s 做高可用增强:
- Master 以 Deployment 方式部署,设置多个副本,配合 PV/PVC 持久化
/var/jenkins_home - 可配置 Horizontal Pod Autoscaler(HPA),基于 CPU 或自定义指标(如待处理任务数)自动扩缩 Agent Pod 数量
- 搭配 Prometheus + Grafana 监控 Pod 状态、构建耗时、失败率等,便于快速定位扩容失效原因











