在 Kubernetes 集群中动态调度 Jenkins Agent Pod,最推荐的方式是安装 Jenkins Kubernetes 插件,通过配置 Cloud Provider 和 Pod 模板实现按需创建。该方案适合构建任务波动大、需要环境隔离的 CI/CD 场景,主要风险在于 Jenkins Master 与 K8s API 的网络连通性及 RBAC 权限配置。
先说结论:使用 Jenkins Kubernetes 插件将 Agent 运行为临时 Pod 是解决资源闲置和环境不一致的标准方案。
- 适合:构建频率波动大、需要多环境支持且希望降低基础设施成本的团队
- 先准备:确认 Kubernetes 集群版本 1.14+、Jenkins 版本 2.303.1+ 及可用的 ServiceAccount 权限
- 验收:验证构建触发后 Pod 自动创建、任务完成后 Pod 自动销毁且日志可追溯
命令速用版
以下是检查环境和安装插件的关键命令与路径,用于快速确认前置条件:
# 检查 Kubernetes 集群状态
kubectl cluster-info
kubectl get nodes -o wide
# 检查 Jenkins 插件管理路径
Manage Jenkins > Manage Plugins > Available > 搜索"Kubernetes"
# 验证 Jenkins 与 K8s 连通性(配置云提供商后)
在 Jenkins 云配置页面点击"Test Connection"为什么会这样
动态调度的核心在于将 Jenkins Agent 从常驻虚拟机转变为临时容器。
传统静态 Agent 模式需要预先配置固定数量的执行节点,无论是否有构建任务,资源始终被占用,公开资料中有案例显示其平均 CPU 使用率可能仅为 15%-30%。而 Kubernetes 动态 Agent 模式由插件自动管理 Pod 生命周期,构建任务触发时创建 Pod,任务结束后立即回收,部分实践数据显示资源利用率可提升至 60%-85%。这种机制不仅解决了资源闲置问题,还通过容器镜像固化了构建环境,避免了不同项目间的依赖冲突。
分步处理
按照以下顺序配置 Jenkins 与 Kubernetes 的集成,确保每一步都有明确的检查点。
1. 环境准备与插件安装
确保 Kubernetes 集群版本在 1.14 以上,Jenkins 实例版本建议 2.303.1 或更高。登录 Jenkins 管理界面,进入插件管理中心安装最新版 Kubernetes 插件。
2. 配置 Cloud Provider
进入 Manage Jenkins > Manage Nodes and Clouds > 添加云 > Kubernetes。根据 Jenkins 部署位置选择认证方式:
- 集群内部部署:使用 ServiceAccount 自动挂载认证,Kubernetes 地址通常为 https://kubernetes.default.svc
- 集群外部部署:使用 kubeconfig 文件或 Token 认证,需确保网络可达 API Server
3. 定义 Pod 模板
在云配置中添加 Pod 模板,指定构建所需的容器镜像和资源限制。推荐采用 YAML 方式定义以获得最大灵活性,示例如下:
apiVersion: v1
kind: Pod
metadata:
labels:
component: jenkins-agent
spec:
containers:
- name: jnlp
image: jenkins/inbound-agent:4.11-1-jdk11
resources:
requests:
cpu: "500m"
memory: "512Mi"
limits:
cpu: "2000m"
memory: "2048Mi"4. 流水线调用
在 Jenkinsfile 中使用 kubernetes 块指定标签,确保构建任务调度到动态 Pod 上执行。
怎么验证是否生效
配置完成后,通过以下方法确认动态调度是否正常工作:
- 观察 Pod 状态:触发构建后,在 Kubernetes 集群执行
kubectl get pods -l jenkins=agent `--watch`,应看到 Pod 创建、运行直至 Completed 或被删除的过程 - 检查 Jenkins 节点:在 Jenkins 管理节点页面,动态 Agent 应在构建期间显示为在线,构建结束后消失
- 验证日志输出:构建日志中应包含 Pod 启动信息,且无连接超时或权限拒绝错误
常见坑
在实际操作中,以下问题容易导致配置失败,需提前排查:
- 网络连通性:Jenkins Master 必须能访问 Kubernetes API Server,且 Agent Pod 能回调 Jenkins Master 地址(JENKINS_URL 需配置正确)
- RBAC 权限不足:为 Jenkins 配置的 ServiceAccount 必须拥有创建、删除、获取 Pod 的权限,否则无法调度
- 镜像拉取失败:若使用私有镜像仓库,需在 Pod 模板中配置 ImagePullSecrets,避免 Pod 处于 ImagePullBackOff 状态
- 资源限制过严: Pod 的 CPU/内存 limits 设置过小可能导致构建过程中 OOMKilled 或被驱逐
常见问题
Jenkins Master 必须运行在 Kubernetes 内部吗?
不需要。Jenkins Master 可以运行在集群外部,只要网络可达 Kubernetes API Server 并配置正确的 kubeconfig 或 Token 认证即可。
动态 Agent 构建完成后 Pod 不删除怎么办?
检查云配置中的"Pod 保留策略",生产环境建议设为 Never 以避免资源堆积,同时确认 Jenkins 是否有权限删除 Pod。
如何为不同项目指定不同的构建环境?
在 Pod 模板中定义不同的标签(Label),并在 Jenkinsfile 的 agent 部分指定对应标签,Kubernetes 插件会根据标签匹配模板创建 Pod。
参考来源
- 别再手动管理 Jenkins 节点了!用 Kubernetes 插件实现 Pod 动态 Agent 保姆级教程
- 别再手动管理 Jenkins 节点了!用 K8s 插件实现 Pod 动态 Agent 保姆级配置
- Jenkins 与 Kubernetes 集成:动态 Agent 配置与云原生 CI/CD 实践
- 在 Kubernetes 集群中运行动态代理的 Jenkins 插件_jenkins agent kubernetes inheritfrom-CSDN 博客
- 保姆级教程:手把手教你用 Jenkins Kubernetes 插件配置 Pod 作为构建 Agent(含常见坑点排查)-CSDN 博客