Kubernetes v1.35 API 文档中工作负载边界有哪些变化
来源:17golang原创
时间:2026-11-03 08:26:34 161浏览 收藏
Kubernetes v1.35 的工作负载 API 变化,重点不是把 Job、Deployment 或 StatefulSet 换成另一个控制器,而是在控制器对象之外增加一层面向多 Pod 调度的描述。控制器继续负责“要运行什么、如何维持副本和生命周期”,Workload 则负责“这些 Pod 属于哪些组、是否需要成组调度”。
官方地址:https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.35/
这层 API 在 v1.35 文档中仍是 alpha,默认关闭,属于试验性调度能力。阅读它时最重要的判断是:它是调度约束和关联信息,不是 Job 或 Deployment 的替代品。
先把“运行什么”与“如何调度”分开
传统 Kubernetes 工作负载通常从控制器开始。Job 描述一次性任务,Deployment 描述无状态副本,StatefulSet 描述有序且带身份的副本;它们创建或维护 Pod,并负责重试、滚动更新或副本数量等运行态行为。
v1.35 的 Workload API 引入了另一种职责边界:一个 Workload 对象可以描述多 Pod 应用的结构和调度要求。它不直接创建 Pod,也不接管控制器的生命周期。一个简单的心智模型是:
- 控制器回答“应该有哪些 Pod,以及它们如何被维持”;
- Workload 回答“这些 Pod 组成哪些 pod group,以及调度器如何看待这一组”;
- Pod 通过
spec.workloadRef指向 Workload 中的具体 pod group。

这不是把调度器变成新的控制器,而是给调度器一个比“逐个 Pod 看待”更完整的工作负载视角。对于需要多个 Pod 同时具备资源条件的批处理、训练或分布式任务,这个区分尤其重要。
v1.35 的 API 表面变化:新增一层调度对象
在 v1.35 文档中,Workload 位于 scheduling.k8s.io/v1alpha1 API 组,并且需要启用 GenericWorkload feature gate。文档把它标记为 Kubernetes v1.35 alpha,默认关闭,所以“API 文档里能看到”不等于“普通集群可以直接提交并获得调度语义”。
Workload 的最小结构可以抽象成下面这个示例。示例只用于解释字段关系,不表示已经在某个集群执行过。
apiVersion: scheduling.k8s.io/v1alpha1
kind: Workload
metadata:
name: training-job-workload
namespace: batch-demo
spec:
# 关联真正负责创建 Pod 的高层对象,主要服务于观测和工具链
controllerRef:
apiGroup: batch
kind: Job
name: training-job
# 一个 Workload 可以按角色拆成多个 Pod 组
podGroups:
- name: workers
# basic 只做分组;需要成组准入时改用 gang
policy:
gang:
# 至少有 4 个 Pod 可同时调度时才允许这一组进入
minCount: 4
这个对象有两个值得注意的边界。第一,controllerRef 是“链接回高层对象”的引用,文档明确说明它用于可观测性和工具,不参与 Workload 的调度或管理。第二,真正影响调度行为的是 podGroups 及其 policy,而不是 controllerRef 写得是否完整。
读懂 Workload 的三个关键结构
podGroups 是调度视角的组成单元
podGroups 用来表示一个多 Pod 应用中的不同组件,例如 driver、worker 或 coordinator。每个组需要有稳定的名称,Pod 后续通过这个名称建立归属。它解决的是“哪些 Pod 应该被一起理解”的问题,而不是“哪些 Pod 由哪个控制器创建”的问题。
因此,一个 Job 可以关联一个包含 workers 的 Workload,也可以在更复杂的场景中把同一应用拆成多个组。拆分的价值在于让调度约束落到组件组,而不是把所有 Pod 粗暴地视为一个集合。
basic 与 gang 是两种不同的取舍
basic policy 主要提供分组、观测和后续扩展的语义;组内 Pod 仍按普通 Kubernetes 行为独立调度。它适合“逻辑上属于同一个应用,但不要求同时启动”的情况。
gang policy 则表达成组准入:需要给出 minCount,调度器会在满足组条件后尝试让足够数量的 Pod 一起获得放置机会。紧耦合批任务如果只使用普通独立调度,可能先启动少量 worker,却因为资源不足迟迟无法形成可工作的整体;gang 的价值就是把这种部分启动风险显式化。
controllerRef 不是调度开关
很多人看到 Workload 示例中的 controllerRef,会误以为填写 Job 后 Workload 就接管了 Job。这个理解不准确。它的作用是把 Workload 与具体的 Job 或自定义资源关联起来,方便观测、索引和工具展示;调度器不会根据它替你创建控制器,也不会因为它存在就改变控制器的重试和更新逻辑。
因此,设计时应把两条链路分开:控制器负责产生 Pod,Workload 负责描述 Pod 组和调度政策。两者可以相互引用,但职责不能混写。
Pod 接入后,调度语义才真正发生变化
仅创建 Workload 对象不会自动吸收集群里所有 Pod。Pod 需要通过 spec.workloadRef 指向同一命名空间里的 Workload 和具体 pod group。一个概念示例如下:
apiVersion: v1
kind: Pod
metadata:
name: worker-0
namespace: batch-demo
spec:
workloadRef:
# 引用同命名空间中的 Workload
name: training-job-workload
# 指向 Workload 内的具体组
podGroup: workers
# 将同一组拆成互相独立的调度单元
podGroupReplicaKey: "0"
containers:
- name: worker
image: example/trainer:1.0
这里有三个实用判断:
- Workload 和 Pod 必须位于同一命名空间,引用的 pod group 名称也必须真实存在;
- 引用缺失或 pod group 不存在时,Pod 会保持 Pending,调度器不会把它当成普通 Pod 直接放置;
- 同一个 pod group 可以用
podGroupReplicaKey划分成多个独立调度单元,适合需要多组相同 worker 的场景。

如果 pod group 使用 basic,workloadRef 更像是带有调度上下文的分组标签;如果使用 gang,还需要对应的 gang scheduling 能力,Pod 才会进入成组等待和准入语义。
哪些场景适合试用,哪些场景不要贸然迁移
| 场景 | 建议 | 原因 |
|---|---|---|
| 紧耦合批处理、分布式训练 | 可在隔离测试集群试用 gang | 部分 Pod 先启动可能没有价值,成组准入更贴近任务约束 |
| 只想给 Pod 增加应用分组标签 | 优先评估 basic | 不会把普通独立调度误解成全有或全无调度 |
| 普通 Web Deployment | 继续使用 Deployment | Workload 不替代副本维持、滚动更新和回滚职责 |
| 依赖稳定 API 的生产平台 | 谨慎等待稳定化或保留回退 | v1.35 文档标记为 alpha,feature gate 默认关闭,API 仍可能演进 |
尤其不要因为看到 Workload 这个名字就把所有 Job 和 Deployment 都迁过去。若问题只是副本数量、滚动发布或失败重试,现有控制器已经覆盖;只有当“多 Pod 的调度关系本身”成为问题时,Workload 才有明确的试用价值。
采用前的兼容判断清单
- 先确认控制面与调度器版本确实对应 v1.35 文档,并把 Workload 当作 alpha 能力管理;
- 确认集群启用了
GenericWorkload,需要 gang 时再确认GangScheduling和对应插件配置; - 先画清控制器、Workload、Pod 和 scheduler 的责任边界,避免让 controllerRef 承担调度语义;
- 为每个 Pod group 选择 basic 或 gang,并解释 minCount、资源峰值和 Pending 行为;
- 为 workloadRef 缺失、组名错误、资源不足和 feature gate 未启用保留清晰的回退或观测路径。
总结来看,Kubernetes v1.35 API 文档的工作负载边界变化,是从“控制器就是工作负载的全部描述”扩展为“控制器管理运行态,Workload 补充多 Pod 调度结构”。这是一种架构分层,不是一次资源替换。把这一点理解清楚,才不会因为 API 资源名称相近而误配生产集群。
相关问题
- Kubernetes 的 basic policy 会不会自动让多个 Pod 同时启动?不会,它主要提供分组语义,组内 Pod 仍可独立调度。
- controllerRef 能不能代替 workloadRef?不能,controllerRef 负责关联高层对象,Pod 仍需 workloadRef 指向具体 pod group。
- Workload API 能不能直接替代 Deployment?不能,它不负责副本维持、滚动更新或回滚。
- workloadRef 指向不存在的组会怎样?Pod 会保持 Pending,直到 Workload 和对应 pod group 可被调度器识别。
参考资料
https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.35/https://v1-35.docs.kubernetes.io/docs/concepts/workloads/workload-api/https://v1-35.docs.kubernetes.io/docs/concepts/workloads/pods/workload-reference/https://v1-35.docs.kubernetes.io/docs/concepts/scheduling-eviction/gang-scheduling/
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
346 收藏
-
483 收藏
-
395 收藏
-
412 收藏
-
147 收藏
-
217 收藏
-
180 收藏
-
科技周边 · 业界新闻 | 1小时前 | CI/CD · gitHub actions · 业界新闻 · 供应链安全 · GitHub Actions Dependabot actions.lock workflow lockfiles gh-actions-lock203 收藏
-
158 收藏
-
447 收藏
-
341 收藏
-
452 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 485次学习