date
related_level
slug
type
relate_date
summary
status
tags
category
last_updated
Jan 3, 2026 10:54 PM
是否已更新
orginal_page
是否推荐
Kubernetes 插件工作原理
Kubernetes 插件将 Jenkins Agent 分配到 Kubernetes pod 中
- pod 中通过在默认名称为
jnlp的容器运行 Jenkins 代理与 Controller 连接
- Kubernetes pod 中的其他容器可以运行任意进程,并且可以使用
container步骤在代理 pod 中的任何容器中动态运行命令
Kubernetes 插件 Pod 垃圾回收机制
- 在某些特殊情况下,代理 Pod 可能会被遗留在系统,控制器中没有声明任何 Jenkins 代理。它们会反复尝试重新连接,直到被系统删除为止
- 可以通过垃圾回收机制来清理这些孤立 Pod
- 在 PodTemplate 中定义
- 由于这可能会给 Kubernetes API 服务器带来额外的负载,因此默认情况下处于禁用状态
Kubernetes 插件 Jenkins 代理容器以及 Pod 多容器支持
必须有一个容器运行 Jenkins 代理
- 未指定会自动创建名为
jnlp的容器
默认 Jenkins 代理容器声明
containerTemplate 已弃用
yaml
可以通过 agentContainer 指定代理容器
- 如果容器已经有与当前 jenkins 版本匹配的 JRE 环境,可以避免创建额外的容器
- 注入 Jenkins 代理还需要将
agentInjection设置为true - 会将对应容器的 command 和 argument 字段留空
可以为代理 pod 定义多个容器,容器间可以共享资源
- 不同容器在执行命令时使用不同 UID 可能会出问题,尽量保持 UID 一致
- 如
sh步骤可能会挂起
要调试此问题,需要设置系统属性,然后重启流水线,可以看到以下日志
- 系统属性
-Dorg.jenkinsci.plugins.durabletask.BourneShellScript.LAUNCH_DIAGNOSTICS设置为 true
代理容器指定和 Pod 多容器样例
Kubernetes 插件 Pod 模板继承
根据字段的不同,继承行为也会有所不同
- 对于简单值(字符串),子模板会覆盖父模板
- 但对于复杂值(列表、映射),子模板会与父模板合并
一些字段的继承行为
yaml字段将根据子 pod 模板中指定的yamlMergeStrategy的值进行合并
container字段在父模板中存在同名容器模板,则该容器模板将继承配置
volume字段同container
imagePullSecrets字段会合并父模板的密钥
inheritFrom 字段引用单个 Pod 模板或者多个以空格分隔的 Pod 模板
- 多个模板按列表顺序处理
- 如果找不到引用的模板,则会忽略它
样例:继承 mypod 模板
inheritFrom ''可以移除所有模板继承
声明式流水线没有隐式继承,即默认不继承,需要通过 kubernetes.inheritFrom 字段显式声明继承关系
- 在阶段级别声明的代理可以覆盖全局代理,隐式继承容易造成混淆
样例:仅包括 maven 容器,golang 容器被覆盖
Kubernetes 插件 Pod 模板嵌套
- Pod 模板可以嵌套组成一个单独的模板
- 嵌套模板内的
POD_LABEL将是生成的最内层标签,用于获取节点上所有可用的外部 Pod
样例:创建同时具有 Maven 和 Docker 功能的 pod 模板
样例:将上述 pod 模板封装成函数
src/com/foo/utils/PodTemplates.groovy
创建同时具有 Maven 和 Docker 功能的 pod
Kubernetes 插件步骤参考
Kubernetes 插件脚本式步骤 podTemplate { } 临时 Pod 模板
- 在流水线执行到
podTemplate代码块期间创建 Pod,并在执行完毕后立即删除 - 此类 Pod 模板不应与 Jenkins 实例中的其他构建或项目共享
使用 readFile 或 readTrusted 步骤可以从文件中读取 yaml
- 在声明式管道中可以使用
yamlFile
pod.yaml
podTemplate 步骤字段参考
cloud 云的名称
- 默认值:kubernetes
- 需要在 Jenkins 设置中定义
namePod 的名称,仅用于继承
namespacePod 的命名空间
label 节点标签,用于通过 node 步骤请求代理时引用 Pod 模板
- 建议省略此字段,使用
podTemplate代码块生成的POD_LABEL变量来引用
annotations应用于 Pod 的注解
inheritFrom要继承的一个或多个 Pod 模板列表
yamlPod 的 YAML 表示,允许设置字段不支持的任何值
yamlMergeStrategy 控制 YAML 定义是覆盖还是与继承的 YAML 定义合并
- 可选项
merge()override()- 默认值
serviceAccountPod 的服务账户
nodeSelectorPod 的节点选择器
nodeUsageMode 控制是否只调度标签表达式匹配的作业
- 可选项
NORMAL:仅调度与标签表达式匹配的作业EXCLUSIVE:尽可能使用节点
containersPod 的容器模板部分- 详见后续 container 字段参考
runAsUser以指定用户 ID 运行 Pod 中的所有容器
runAsGroup以指定组 ID 运行 Pod 中的所有容器
envVars 应用于所有容器的环境变量
变量类型
envVar:值在内联定义的环境变量
secretEnvVar:值从 Secret 派生的环境变量
hostNetwork使用主机网络
volumes为 Pod 定义的卷,由所有容器挂载emptyDirVolume:(默认)主机上分配的空目录hostPathVolume():主机路径卷configMapVolume:从 ConfigMap 挂载的只读卷secretVolume:从 Secret 挂载的只读卷persistentVolumeClaim():按名称指定的现有持久卷声明dynamicPVC():动态管理的持久卷声明(随 Pod 删除)nfsVolume():NFS 卷
卷类型选项
workspaceVolume用于工作区的卷类型emptyDirWorkspaceVolume(默认)hostPathWorkspaceVolume()persistentVolumeClaimWorkspaceVolume()dynamicPVC()nfsWorkspaceVolume()
工作区卷类型选项
imagePullSecrets用于从私有 Docker 仓库拉取镜像
slaveConnectTimeout代理上线的超时时间(秒)
podRetention 定义 Pod 保留策略
- 默认在
activeDeadlineSeconds后删除 Pod
可选项
default():默认删除 Pod
never():从不保留
onFailure():失败时保留
always():总是保留
evicted():被驱逐时保留
activeDeadlineSeconds当podRetention设置为never()或onFailure()时,Pod 在此时间后删除
idleMinutesPod 保持活动状态以供重用的分钟数(自上次执行步骤后)
showRawYaml启用或禁用原始 Pod 清单的输出- 默认为 true
podTemplate.container 字段参考
name容器的名称
image容器的镜像
envVars 应用于该容器的环境变量,覆盖 Pod 模板设置
变量类型
envVar:值在内联定义的环境变量
secretEnvVar:值从 Secret 派生的环境变量
command容器将执行的命令,覆盖 Docker 的 entrypoint
args传递给命令的参数
ttyEnabled标记是否应启用 tty 的标志
livenessProbe添加到容器中 exec 存活性探针的参数(不支持 httpGet 存活性探针)
ports在容器上暴露的端口
alwaysPullImage容器将在启动时拉取镜像
runAsUser以指定用户 ID 运行容器
runAsGroup以指定组 ID 运行容器
podTemplate.container.livenessProbe 字段样例
使用 container 步骤可以在代理容器之外的容器中执行命令
- 命令默认在 Jenkins 代理运行所在的容器中执行
- 变量
POD_CONTAINER包含当前上下文中容器的名称 - 仅在
container代码块内定义
使用 retry 步骤会使用全新的 Pod 自动重新尝试整个构建阶段
Kubernetes 插件脚本式其他步骤 container, kubeconfig, containerLog
container:在选定容器中运行 step
name容器名称
shell 指定在容器内运行的 Shell,处理来自 Jenkins 的请求以运行可执行文件、设置环境变量等
- 此配置不影响用户代码运行的 Shell
更改用户代码运行的 Shell
使用解释器首行更改 shell
使用子进程运行外部脚本
- Windows 可以选择
bat或powershell步骤
- 默认值
- Linux Pod:默认为
sh(应在 $PATH 中) - Windows Pod:默认为
cmd(应在 %Path% 中)
kubeconfig:设置 Kubernetes CLI (kubectl)
- 在构建中用于运行 Kubernetes 命令
serverUrl Kubernetes API 端点的 UR
- 如未设置,连接选项将从服务账户或 kube 配置文件自动配置
credentialsId凭据 ID
caCertificate证书颁发机构 (CA) 的 base64 编码证书,用于验证服务器证书- 留空将跳过证书验证
containerLog:从 Kubernetes 获取容器日志
name容器名称,在 containerTemplate 字段中指定
limitBytes 设置从服务器读取的字节数限制,达到限制后终止日志输出
- 可能不会显示完整的最后一行日志
- 返回的字节数可能略多或略少于指定限制
returnLog 返回容器日志
- 为 False 日志将打印到构建日志
sinceSeconds 显示日志的相对时间(秒),从当前时间向前计算
- 如果此值早于 Pod 启动时间,只返回 Pod 启动后的日志
- 如果此值在未来,不返回日志
tailingLines 从日志末尾显示的行数
- 如未指定,从容器创建开始显示日志或受 "sinceSeconds" 限制
Kubernetes 插件声明式流水线 agent 类型 kubernetes {}
通过 kubernetes {} 定义全局 Pod 模板
- 可以使用
yaml,yamlFile,containerTemplate来定义 Pod 模板 containerTemplate已弃用
defaultContainer指定默认运行容器- 后续 steps 隐式嵌套在
container(name) {...}代码块中
customWorkspace自定义默认工作区
样例 yaml
样例 yamlFile
样例 defaultContainer
样例 customWorkspace
- Author:白鸟3
- URL:https://blog.kun2peng.top/operation/k8s_jenkins_k8splugin
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!
