工作负载

一个将运行至完成的应用程序。它是 Kueue 中的准入单元。有时称为作业。

工作负载是一个将运行至完成的应用程序。它可以由一个或多个 Pod 组成,这些 Pod 松散或紧密耦合,作为一个整体完成一项任务。工作负载是 Kueue 中的准入单元。

原型工作负载可以用 Kubernetes batch/v1.Job 表示。因此,我们有时使用术语作业来指代任何工作负载,而当我们具体指代 Kubernetes API 时,则使用作业。

但是,Kueue 不会直接操作作业对象。相反,Kueue 管理表示任意工作负载的资源需求的工作负载对象。Kueue 会自动为每个作业对象创建一个工作负载并同步决策和状态。

工作负载清单如下所示

apiVersion: kueue.x-k8s.io/v1beta1
kind: Workload
metadata:
  name: sample-job
  namespace: team-a
spec:
  active: true
  queueName: team-a-queue
  podSets:
  - count: 3
    name: main
    template:
      spec:
        containers:
        - image: gcr.io/k8s-staging-perf-tests/sleep:latest
          imagePullPolicy: Always
          name: container
          resources:
            requests:
              cpu: "1"
              memory: 200Mi
        restartPolicy: Never

活动

你可以通过设置 Active 字段来停止或恢复正在运行的工作负载。active 字段决定了工作负载是否可以被准入队列或继续运行(如果已经准入)。将 .spec.Active 从 true 更改为 false 将导致正在运行的工作负载被驱逐,并且不会重新排队。

队列名称

要指示你希望你的工作负载在哪个 LocalQueue 中排队,请在 .spec.queueName 字段中设置 LocalQueue 的名称。

Pod 集

工作负载可能由具有不同 Pod 规范的多个 Pod 组成。

.spec.podSets 列表的每个项目都表示一组同质 Pod,并具有以下字段

  • spec 使用 v1/core.PodSpec 描述 Pod。
  • count 是使用相同 spec 的 Pod 数。
  • name 是 Pod 集的人类可读标识符。你可以使用 Pod 在工作负载中的角色,例如 driverworkerparameter-server 等。

资源请求

Kueue 使用 podSets 资源请求来计算工作负载使用的配额,并决定是否以及何时允许工作负载。

Kueue 将工作负载的总资源使用量计算为每个 podSet 的资源请求的总和。podSet 的资源使用量等于 pod 规范的资源请求乘以 count

请求值调整

根据集群设置,Kueue 将根据以下内容调整工作负载的资源使用量

  • 集群在 限制范围中定义默认值,如果在 spec 中未提供,将使用默认值。
  • 创建的 pod 受 运行时类开销 的约束。
  • 规范仅定义资源限制,在这种情况下,限制值将被视为请求。

请求值验证

在集群定义限制范围的情况下,上述调整产生的值将针对范围进行验证。如果范围验证失败,Kueue 将把工作负载标记为 Inadmissible

保留的资源名称

除了常规的资源命名限制之外,你不能在 Pod 规范中使用 pods 资源名称,因为它已预留给 Kueue 内部使用。你可以在 ClusterQueue 中使用 pods 资源名称来设置 Pod 的最大数量配额。

优先级

工作负载具有优先级,该优先级影响 ClusterQueue 允许它们加入的顺序。有两种方法可以设置工作负载优先级

  • Pod 优先级:你可以在 .spec.priority 字段中看到工作负载的优先级。对于 batch/v1.Job,Kueue 根据 Job 的 Pod 模板的 Pod 优先级 设置工作负载的优先级。

  • WorkloadPriority:有时,开发人员希望控制工作负载的优先级,而不影响 Pod 的优先级。通过使用 WorkloadPriority,你可以独立管理工作负载的优先级,以便排队和抢占,而无需考虑 Pod 的优先级。

自定义工作负载

如前所述,Kueue 内置了对使用 Job API 创建的工作负载的支持。但是,任何自定义工作负载 API 都可以通过为其创建相应的 Workload 对象来与 Kueue 集成。

动态回收

它是一种机制,允许当前已允许的工作负载释放其不再需要的配额预留的一部分。

Job 集成通过设置 reclaimablePods 状态字段来传达此信息,枚举不再需要配额预留的每个 Pod 集的 Pod 数量。


status:
  reclaimablePods:
  - name: podset1
    count: 2
  - name: podset2
    count: 2

在工作负载持有配额预留期间,count 只能增加。

作业资源分配的全有或全无语义

此机制允许在作业未准备就绪时将其驱逐并重新排队。有关更多详细信息,请参阅准备就绪的 Pod 的全有或全无

指数退避重新排队

一旦出现带有PodsReadyTimeout原因的驱逐,工作负载将重新排队并进行退避。工作负载状态允许您了解以下内容

  • .status.requeueState.count表示工作负载由于PodsReadyTimeout原因而被退避重新排队的次数
  • .status.requeueState.requeueAt表示工作负载下次重新排队的时间
status:
  requeueState:
    count: 5
    requeueAt: 2024-02-11T04:51:03Z

当准备就绪的 Pod 的全有或全无停用的工作负载重新激活时,重新排队状态(.status.requeueState)将重置为 null。

将标签从作业复制到工作负载

您可以在创建工作负载时配置 Kueue,将标签从基础作业或 Pod 对象复制到新工作负载中。这对于工作负载识别和调试非常有用。您可以通过在配置 API(在integrations下)中设置labelKeysToCopy字段来指定应复制哪些标签。默认情况下,Kueue 不会将任何作业或 Pod 标签复制到工作负载中。

下一步



上次修改时间为 2024 年 7 月 15 日:修复:修复损坏的链接 (#2617) (22e2e0f8)