k8s之kueue中的workload 和 kubeflow中的TFJob

Kueue中的Workload详解

1. Workload基本概念

Workload是Kueue系统中的核心API资源,代表了一个需要被调度和执行的工作单元。它的主要作用是:

  • 封装一个实际的Kubernetes工作负载(如Job、TFJob等)
  • 携带该工作负载的资源需求信息
  • 在Kueue的队列系统中进行排队和调度

2. Workload的关键特性

2.1 与原生工作负载的关系

Workload不是替代Kubernetes原生工作负载(如Job、Deployment),而是:

  • 包装这些工作负载
  • 为它们增加队列管理能力
  • 控制它们的执行时机
2.2 主要功能
  1. 资源需求声明:指定工作负载需要的CPU、GPU等资源
  2. 队列管理:将工作负载分配到特定队列
  3. 优先级控制:与PriorityClass结合实现优先级调度
  4. 状态跟踪:记录工作负载的排队、调度和执行状态

3. Workload的API结构

典型的Workload资源定义如下:

apiVersion: kueue.x-k8s.io/v1beta1
kind: Workload
metadata:
  name: example-workload
spec:
  queueName: "team-a-queue"
  priorityClassName: "high-priority"
  podSets:
  - name: "main"
    count: 3
    template:
      spec:
        containers:
        - name: job-container
          image: my-image:latest
          resources:
            requests:
              cpu: "1"
              memory: "1Gi"
主要字段说明:
  • queueName: 指定工作负载所属的队列
  • priorityClassName: 指定优先级类别
  • podSets: 定义工作负载的Pod模板和副本数
  • admission: (只读字段)记录工作负载何时被准入执行

4. Workload生命周期

Workload会经历以下状态:

  1. Pending: 刚创建,等待准入
  2. Admitted: 已被队列准入,但资源尚未满足
  3. Active: 资源已分配,相关工作负载正在运行
  4. Finished: 工作负载完成(成功或失败)

TFJob关键点解析

1. 为什么叫 Job?关键点解析

(1) 一次性执行(Run-to-Completion)
  • 核心共性
    TFJob 和原生 Job 一样,任务执行完成后会自动终止,不会无限运行。例如:

    • 原生 Job:一个数据处理任务完成后,Pod 会退出。
    • TFJob:一个分布式训练任务完成后(如达到指定 epoch 或收敛),所有角色(Worker/PS)的 Pod 也会退出。
  • 与长期服务(如 Deployment)的区别
    Deployment 这种工作负载是长期运行的(即使 Pod 崩溃也会重启),而 Job/TFJob临时性任务

(2) 继承原生 Job 的基础特性
  • 支持重试和容错
    如果某个 Pod 失败(如 Worker 崩溃),TFJob 会像原生 Job 一样尝试重启或重新调度(取决于 restartPolicy)。
  • 任务状态跟踪
    提供 succeeded/failed 状态标识,可通过 kubectl get tfjob 查看。
(3) 名称延续 Kubeflow 的命名习惯

Kubeflow 生态中,类似的任务型资源均以 Job 结尾,例如:

  • TFJob(TensorFlow)
  • PyTorchJob(PyTorch)
  • MPIJob(MPI 分布式任务)
    这种命名方式明确了它们的“一次性任务”属性。

2. TFJob 的特殊性(与原生 Job 的区别)

虽然 TFJob 属于广义的 Job 范畴,但它针对分布式训练场景做了扩展:

特性原生 JobTFJob
任务类型通用任务(如批处理)专为 TensorFlow 分布式训练优化
角色定义所有 Pod 相同(无角色区分)支持多角色(Chief/Worker/PS)
通信需求Pod 间通常无需通信Pod 间需高性能网络通信(如 gRPC)
资源需求CPU/内存为主通常需要 GPU/NPU 加速器
使用场景数据处理、脚本运行深度学习模型训练

WorkloadTFJob 的关系

(1) 典型交互流程

当用户提交一个 TFJob 并希望由 Kueue 管理时,流程如下:

  1. 用户提交 TFJob(或通过某个控制器提交)。
  2. Kueue 的准入控制器拦截
    • 检测到该 TFJob 需要排队(例如,通过 queue-name 注解标记)。
  3. Kueue 创建 Workload
    • Kueue 将 TFJob 的信息(如 Pod 模板、资源需求)封装成一个 Workload 对象,放入指定队列。
  4. Workload 等待调度
    • Kueue 根据 PriorityClass、资源可用性等决定何时允许 Workload 继续。
  5. Workload 被批准后,TFJob 真正创建 Pod
    • 一旦资源足够,Kueue 会解除 TFJob 的阻塞状态,使其正常创建 Pod 执行训练。

(2) 关键关系总结

组件作用与对方的关系
TFJob运行 TensorFlow 分布式训练Workload 封装,受 Kueue 调度
Workload管理作业的排队和资源分配持有 TFJob 的元数据,控制其何时执行

实际用例

场景:使用 Kueue 管理 TFJob

假设一个集群资源有限,多个团队提交 TFJob,需要通过 Kueue 公平调度:

  1. 提交 TFJob 时标记队列
    apiVersion: kubeflow.org/v1
    kind: TFJob
    metadata:
      name: my-tfjob
      annotations:
        kueue.x-k8s.io/queue-name: "gpu-team-a"  # 指定队列
    spec:
      tfReplicaSpecs:
        Worker:
          replicas: 4
          template:
            spec:
              containers:
              - name: tensorflow
                resources:
                  requests:
                    nvidia.com/gpu: 2
    
  2. Kueue 自动创建 Workload
    • Kueue 会生成一个对应的 Workload,记录该 TFJob 需要的资源(如 8 GPU)。
  3. Workload 进入队列
    • 如果当前集群 GPU 不足,Workload 状态为 PendingTFJob 不会真正创建 Pod。
  4. 资源释放后,Workload 被激活
    • Kueue 批准 WorkloadTFJob 开始运行。

技术实现细节

(1) 如何关联 WorkloadTFJob
  • Kueue 通过 Owner Reference标签/注解 关联两者。
  • 例如,Workloadspec.podSets 会记录 TFJob 的 Pod 模板。
(2) TFJob 会被修改吗?
  • Kueue 不会修改原始 TFJob,而是通过 Kubernetes 的 准入控制(Admission Webhook) 暂停其创建,直到 Workload 被调度。
(3) 其他类似工作负载
  • 除了 TFJob,Kueue 同样支持管理:
    • Kubernetes 原生 JobCronJob
    • Kubeflow 的 PyTorchJobMPIJob
    • 其他自定义 CRD(需适配)。
Kubernetesk8s)是用于容器集群的自动化部署、扩容以及运维的开源平台,为容器编排管理提供了完整的开源方案,能有效响应用户需求、部署扩展应用等[^1]。Workload(工作负载)是k8s中一个重要概念,下面从介绍、使用相关知识方面说明: ### 介绍 Workload指运行在k8s集群中的应用程序,在k8s里,通过不同的资源对象来定义管理这些工作负载。2017年12月发布的1.9版本引入了Workload API等新特性,这表明k8s对工作负载管理能力的进一步增强与完善,通过Workload API能更好地定义控制应用的工作负载状态与行为[^2]。 ### 使用 使用Workload资源对象,可根据应用的特性需求选择合适的资源类型。例如,若要运行无状态的应用副本,可使用Deployment;对于有状态的应用,如数据库,可使用StatefulSet。使用时需编写对应的YAML文件来定义资源对象的配置,以Deployment为例,简单的YAML文件示例如下: ```yaml apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment spec: selector: matchLabels: app: nginx replicas: 3 template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.14.2 ports: - containerPort: 80 ``` 此YAML文件定义了一个名为`nginx-deployment`的Deployment,创建3个运行Nginx 1.14.2镜像的Pod副本。通过`kubectl apply -f <文件名>.yaml`命令可将此配置部署到k8s集群。 ### 相关知识 - **资源对象类型**:除DeploymentStatefulSet外,还有DaemonSet,它确保每个节点上都运行一个特定的Pod副本,常用于系统层面的守护进程;JobCronJob用于运行一次性或定时任务。 - **生命周期管理**:k8s会依据定义的规则对Workload进行生命周期管理,如自动重启失败的Pod、根据资源需求可用性进行调度等。 - **水平扩展**:借助Horizontal Pod Autoscaler(HPA),可根据CPU利用率、内存使用量等指标自动调整Pod的副本数量,以应对不同的工作负载压力。
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值