如何在 Kubernetes 集群中动态调度 Jenkins Agent Pod

文章导读
在 Kubernetes 集群中动态调度 Jenkins Agent Pod,最推荐的方式是安装 Jenkins Kubernetes 插件,通过配置 Cloud Provider 和 Pod 模板实现按需创建。该方案适合构建任务波动大、需要环境隔离的 CI/CD 场景,主要风险在于 Jenkins Master 与 K8s API 的网络连通性及 RBAC 权限配置。
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 常见问题
  7. 参考来源
A A

在 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 部署位置选择认证方式:

如何在 Kubernetes 集群中动态调度 Jenkins Agent Pod
  • 集群内部部署:使用 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 博客