Lazy loaded image
Jenkins Kubernetes 插件原理与 Pod 模板 steps 字段参考
Words 2931Read Time 8 min
2026-1-3
2026-1-3
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 设置中定义
  • name Pod 的名称,仅用于继承
  • namespace Pod 的命名空间
label 节点标签,用于通过 node 步骤请求代理时引用 Pod 模板
  • 建议省略此字段,使用 podTemplate 代码块生成的 POD_LABEL 变量来引用
  • annotations 应用于 Pod 的注解
  • inheritFrom 要继承的一个或多个 Pod 模板列表
  • yaml Pod 的 YAML 表示,允许设置字段不支持的任何值
yamlMergeStrategy 控制 YAML 定义是覆盖还是与继承的 YAML 定义合并
  • 可选项
    • merge()
    • override()
      • 默认值
  • serviceAccount Pod 的服务账户
  • nodeSelector Pod 的节点选择器
nodeUsageMode 控制是否只调度标签表达式匹配的作业
  • 可选项
    • NORMAL:仅调度与标签表达式匹配的作业
    • EXCLUSIVE:尽可能使用节点
  • containers Pod 的容器模板部分
    • 详见后续 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 在此时间后删除
  • idleMinutes Pod 保持活动状态以供重用的分钟数(自上次执行步骤后)
  • 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 可以选择 batpowershell 步骤
  • 默认值
    • 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
上一篇
Kubernetes 部署 CI/CD 工具 Jenkins
下一篇
DevStack 快速搭建 OpenStack 单节点测试环境

Comments
Loading...