Jenkins 集成 Kubernetes 实现动态 Agent 与自动化部署 一、前言在云原生持续交付场景中传统的 Jenkins 静态 Agent 存在资源利用率低、环境一致性差的问题。通过 Jenkins 的Kubernetes插件可以实现动态创建 Kubernetes Pod 作为 Jenkins Agent任务执行完成后自动销毁 Pod实现资源按需分配、环境隔离同时直接在 Agent 中执行kubectl命令完成 Kubernetes 集群的应用部署构建完整的 CI/CD 流程。本文将从插件安装、集群对接、Pod 模板配置到 Pipeline 编写手把手带你完成 Jenkins 与 Kubernetes 的全流程集成。二、环境准备Jenkins 服务集群外独立节点IP172.16.213.70:8080Kubernetes 集群Master 节点 IP172.16.213.221API Server 端口6443权限准备Kubernetes 集群的admin权限证书用于 Jenkins 远程访问集群三、步骤 1安装 Kubernetes 插件登录 Jenkins 后台进入「系统管理」→「插件管理」在「可选插件」中搜索kubernetes勾选Kubernetes插件版本 1.30.5点击「安装」安装完成后重启 Jenkins 服务。四、步骤 2获取 Kubernetes 集群证书生成 PKCS#12 凭证Jenkins 集群外节点需要通过证书认证访问 Kubernetes API Server步骤如下1. 从 Kubernetes Master 节点提取证书登录 Kubernetes Master 节点执行以下命令# 查看集群配置文件 cat /root/.kube/config从配置文件中提取certificate-authority-data、client-certificate-data、client-key-data三个字段的内容分别解码为证书文件# 1. 创建证书目录 mkdir -p /opt/crt cd /opt/crt # 2. 解码 CA 证书将配置中 certificate-authority-data 的内容替换到双引号中 echo 配置中 certificate-authority-data 内容 | base64 -d /opt/crt/ca.crt # 3. 解码客户端证书将配置中 client-certificate-data 的内容替换到双引号中 echo 配置中 client-certificate-data 内容 | base64 -d /opt/crt/client.crt # 4. 解码客户端私钥将配置中 client-key-data 的内容替换到双引号中 echo 配置中 client-key-data 内容 | base64 -d /opt/crt/client.key2. 生成 PKCS#12 格式证书文件执行以下命令生成cert.pfx文件过程中需要自定义一个密码并牢记openssl pkcs12 -export -out /opt/crt/cert.pfx \ -inkey /opt/crt/client.key \ -in /opt/crt/client.crt \ -certfile /opt/crt/ca.crt将生成的/opt/crt/cert.pfx文件下载到本地可使用sz /opt/crt/cert.pfx命令。3. Jenkins 中添加证书凭据进入 Jenkins「凭据」→「系统」→「全局凭据 (unrestricted)」点击「添加凭据」类型选择「Certificate」配置如下选择「Upload PKCS#12 certificate」上传本地的cert.pfx文件「Password」填写生成证书时设置的密码「ID」建议设置为k8s-admin-cert方便后续引用点击「保存」完成凭据创建。五、步骤 3配置 Jenkins 与 Kubernetes 集群对接进入 Jenkins「系统管理」→「Manage Nodes and Clouds」→「Configure Clouds」点击「添加一个新云」选择「Kubernetes」配置核心参数配置项说明示例值Kubernetes 地址Kubernetes API Server 地址https://172.16.213.221:6443Kubernetes 服务证书 key粘贴ca.crt文件的完整内容从/opt/crt/ca.crt复制Kubernetes 命名空间Agent Pod 运行的命名空间default确保该命名空间存在凭据选择上一步创建的k8s-admin-cert凭据CNkubernetes-admin, Osystem:mastersJenkins 地址Jenkins Master 服务地址http://172.16.213.70:8080/勾选「WebSocket」点击「连接测试」显示「Connection successful」即表示集群对接成功点击「保存」。六、步骤 4配置 Kubernetes Pod 模板Pod 模板定义了 Jenkins Agent Pod 的配置包括容器、标签、挂载卷等核心是配置支持kubectl命令的 Agent 环境。1. 配置 Pod 基础信息在 Kubernetes 云配置页面找到「Pod Templates」点击「添加 Pod Template」配置如下「名称」jenkins-slave模板标识非 Pod 实际名称「命名空间」default与集群配置的命名空间一致「标签列表」jenkins-slave关键后续 Pipeline 脚本中node标签需与此一致「用法」选择Only build jobs with label expressions matching this node仅匹配标签的任务使用该模板2. 构建支持 kubectl 命令的容器镜像Agent 容器需要包含kubectl工具编写Dockerfile制作镜像FROM centos:7 LABEL \ org.label-schema.schema-version1.0 \ org.label-schema.nameCentOS Base Image \ org.label-schema.vendorCentOS \ org.label-schema.licenseGPLv2 USER root # 配置 Kubernetes YUM 源 COPY kubernetes.repo /etc/yum.repos.d/kubernetes.repo # 安装 kubectl 工具 RUN yum install -y kubectl yum clean all CMD [/bin/bash]kubernetes.repo文件内容配置阿里云 Kubernetes 源[kubernetes] nameKubernetes baseurlhttps://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64 enabled1 gpgcheck1 repo_gpgcheck1 gpgkeyhttps://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg构建镜像并推送到镜像仓库docker build -t centos-7-kubectl:v1.0 . docker tag centos-7-kubectl:v1.0 i.iivey.com/library/centos-7-kubectl:v1.0 docker push i.iivey.com/library/centos-7-kubectl:v1.0也可直接使用公开镜像swr.cn-north-1.myhuaweicloud.com/iivey/centos-7-kubectl:v1.03. 配置容器模板在 Pod 模板中找到「容器列表」点击「添加 Container Template」配置如下「名称」jnlp-kubectlPipeline 中container关键字引用「Docker 镜像」i.iivey.com/library/centos-7-kubectl:v1.0或公开镜像地址「工作目录」/home/jenkins/agent默认 Jenkins Agent 工作目录「运行的命令」/bin/sh -c「命令参数」cat保持容器持续运行等待 Jenkins 任务勾选「分配伪终端」说明Pod 中会自动包含一个jnlp容器Jenkins 内置 Agent 容器加上我们配置的jnlp-kubectl容器Pod 内共有 2 个容器。4. 配置主机路径挂载卷为了让 Agent 拥有访问 Kubernetes 集群的权限需要将 Master 节点的kubeconfig和证书目录挂载到 Pod 中。在 Pod 模板中找到「卷」添加 2 个 Host Path 卷卷类型主机路径挂载路径说明Host Path Volume/root/.kube/root/.kube挂载 kubeconfig 配置文件Host Path Volume/etc/kubernetes/pki/etc/kubernetes/pki挂载 Kubernetes CA 证书注意Kubernetes 集群的所有 Worker 节点都需要提前创建这两个目录否则 Pod 调度到未创建目录的节点时会启动失败。配置完成后点击「保存」完成 Pod 模板配置。七、步骤 5创建 Pipeline 流水线任务我们创建一个带参数的 Pipeline 任务实现kubectl apply部署和kubectl delete删除的一键操作。1. 创建参数化构建任务新建「流水线」项目勾选「This project is parameterized」添加「Choice Parameter」参数配置如下「名称」Method「选项」apply、delete分行填写「描述」apply 部署delete 删除2. 编写 Pipeline 脚本在「流水线」→「定义」中选择「Pipeline script」输入以下脚本node(jenkins-slave) { container(jnlp-kubectl) { stage(Clone YAML 配置文件) { echo 拉取 Kubernetes 部署 YAML 文件 // 拉取存放部署 YAML 的 Git 仓库替换为你的仓库地址 git url: http://172.16.213.170/root/k8symlfile.git } stage(执行 Kubernetes 操作) { echo 执行 kubectl \$Method 操作 // 执行 apply/delete 操作替换为你的 YAML 文件名 sh kubectl \$Method -f ./httpd.yml // 验证操作结果 sh kubectl get pods -o wide } } }脚本说明node(jenkins-slave)指定使用标签为jenkins-slave的 Pod 模板创建 Agentcontainer(jnlp-kubectl)在jnlp-kubectl容器中执行后续命令确保能使用kubectl工具\$Method引用构建时选择的参数实现部署 / 删除的动态操作八、步骤 6执行 Pipeline 任务并验证进入 Jenkins 任务页面点击「Build with Parameters」选择Method为apply点击「开始构建」构建过程中可在 Kubernetes 集群中查看动态创建的 Agent Podkubectl get pods -w -n default构建完成后查看 Jenkins 控制台输出验证kubectl apply命令执行成功Pod 正常启动。如需删除应用再次构建任务并选择Method为delete即可。九、常见问题与避坑指南Agent Pod 启动失败提示卷挂载失败检查所有 Kubernetes Worker 节点是否都创建了/root/.kube和/etc/kubernetes/pki目录检查目录权限确保 Jenkins Agent 容器有读取权限kubectl命令执行报错connection refused检查 Jenkins 集群配置中的 API Server 地址和端口是否正确检查ca.crt文件内容是否正确是否与集群的 CA 证书一致检查证书凭据是否正确上传密码是否匹配Pipeline 脚本提示No agent found for label jenkins-slave检查 Pod 模板的「标签列表」是否为jenkins-slave检查 Jenkins 与 Kubernetes 集群连接是否正常「连接测试」是否成功构建完成后 Pod 未自动销毁检查 Jenkins 集群配置中是否勾选了「WebSocket」检查 Pod 模板的「运行的命令」和「命令参数」是否配置为/bin/sh -c和cat确保容器持续运行等待任务结束十、总结通过 Jenkins 与 Kubernetes 的集成我们实现了以下能力动态 Agent 调度根据任务需求自动创建 / 销毁 Pod 作为 Agent资源按需分配降低运维成本环境隔离每个任务都在独立的 Pod 中执行避免环境冲突保证构建一致性一键部署 / 删除通过参数化 Pipeline实现 Kubernetes 应用的一键部署和回滚提升交付效率后续可以在此基础上扩展更多能力比如集成 Docker 镜像构建Docker In Docker、配置 Harbor 镜像仓库、添加构建通知等构建完整的云原生 CI/CD 流程。