工作负载
工作负载是一个将运行至完成的应用程序。它可以由一个或多个 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 在工作负载中的角色,例如driver
、worker
、parameter-server
等。
资源请求
Kueue 使用 podSets
资源请求来计算工作负载使用的配额,并决定是否以及何时允许工作负载。
Kueue 将工作负载的总资源使用量计算为每个 podSet
的资源请求的总和。podSet
的资源使用量等于 pod 规范的资源请求乘以 count
。
请求值调整
根据集群设置,Kueue 将根据以下内容调整工作负载的资源使用量
请求值验证
在集群定义限制范围的情况下,上述调整产生的值将针对范围进行验证。如果范围验证失败,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 标签复制到工作负载中。