使用 DRA 设备运行工作负载
本页面向你展示如何在启用了 Kueue 的 Kubernetes 集群中运行请求由 动态资源分配 (DRA) 管理的硬件设备(比如 GPU)的工作负载。示例使用了 batch Job,但同样的方法适用于 Kueue 支持的任何类型的工作负载。
本页面的目标受众是 batch users。
有关 Kueue 如何处理 DRA 资源的概念性细节,请参考 动态资源分配的概念.
开始之前
请确保满足以下条件:
- 一个正在运行的 Kubernetes 集群。
- kubectl 命令行工具可以与集群通信。
- 已安装 Kueue。
- 集群 已配置配额,并在
ClusterQueue包含了 DRA 资源。 - 你的管理员已经 在 Kueue 中设置了 DRA 的支持。
0. 确定命名空间中可用的队列
运行下面这个命令,列出你的 namespace 中可用的 LocalQueues。
kubectl -n default get localqueues
输出类似于下面这样:
NAME CLUSTERQUEUE PENDING WORKLOADS
user-queue cluster-queue 0
ClusterQueue 定义了队列的配额。
1. 定义工作负载
使用 DRA 设备运行工作负载与运行一个常规 Job 类似。
你必须设置 kueue.x-k8s.io/queue-name 标签以便选择要将工作负载提交到哪个 LocalQueue。
根据管理员配置集群方式的不同,有两种请求 DRA 设备的方法。请选择与你的设置相匹配的方法。
使用 ResourceClaimTemplate
当你需要显式描述所需的设备时,请使用此方法。
创建一个 ResourceClaimTemplate 并在工作负载中引用它:
apiVersion: resource.k8s.io/v1
kind: ResourceClaimTemplate
metadata:
namespace: default
name: single-gpu
spec:
spec:
devices:
requests:
- name: gpu
exactly:
deviceClassName: gpu.example.com
---
apiVersion: batch/v1
kind: Job
metadata:
generateName: sample-dra-rct-job-
namespace: default
labels:
kueue.x-k8s.io/queue-name: user-queue
spec:
template:
spec:
containers:
- name: dummy-job
image: registry.k8s.io/e2e-test-images/agnhost:2.53
args: ["pause"]
resources:
claims:
- name: gpu
requests:
cpu: "1"
memory: "200Mi"
resourceClaims:
- name: gpu
resourceClaimTemplateName: single-gpu
restartPolicy: Never
使用扩展资源
当集群中存在带有 spec.extendedResourceName 的 DeviceClass 时,请使用此方法。
你可以像请求 CPU 或内存一样,使用标准的 resources.requests 语法来请求设备,
无需 ResourceClaimTemplate:
apiVersion: batch/v1
kind: Job
metadata:
generateName: sample-dra-extended-job-
namespace: default
labels:
kueue.x-k8s.io/queue-name: user-queue
spec:
template:
spec:
containers:
- name: dummy-job
image: registry.k8s.io/e2e-test-images/agnhost:2.53
args: ["pause"]
resources:
requests:
cpu: "1"
memory: "200Mi"
example.com/gpu: "1"
limits:
example.com/gpu: "1"
restartPolicy: Never
使用可分区设备
如果你的管理员已配置 基于计数器的配额, 则你的工作负载将按设备的计数器值(例如 GPU 内存)而非设备数量计费。 你提交工作负载的方式与上面的 ResourceClaimTemplate 相同。
apiVersion: resource.k8s.io/v1
kind: ResourceClaimTemplate
metadata:
namespace: default
name: gpu-partition
spec:
spec:
devices:
requests:
- name: gpu
exactly:
deviceClassName: gpu.example.com
count: 1
---
apiVersion: batch/v1
kind: Job
metadata:
generateName: sample-dra-counter-job-
namespace: default
labels:
kueue.x-k8s.io/queue-name: user-queue
spec:
template:
spec:
containers:
- name: dummy-job
image: registry.k8s.io/e2e-test-images/agnhost:2.53
args: ["pause"]
resources:
claims:
- name: gpu
requests:
cpu: "1"
memory: "200Mi"
resourceClaims:
- name: gpu
resourceClaimTemplateName: gpu-partition
restartPolicy: Never
使用可消耗容量(共享设备)
Note
这个功能需要打开KueueDRAIntegrationConsumableCapacity 开关,在 v0.19 中该功能默认处于禁用状态。如果你的管理员已配置
基于容量的配额,
则你的工作负载将按设备的容量消耗(例如 GPU 内存)而非设备数量计费。
你可以提交一个工作负载并在 ResourceClaimTemplate 的 capacity.requests 中指定所需的容量:
apiVersion: resource.k8s.io/v1
kind: ResourceClaimTemplate
metadata:
namespace: default
name: gpu-share
spec:
spec:
devices:
requests:
- name: gpu
exactly:
deviceClassName: gpu.example.com
count: 1
capacity:
requests:
gpu.example.com/memory: "4Gi"
---
apiVersion: batch/v1
kind: Job
metadata:
generateName: sample-dra-capacity-job-
namespace: default
labels:
kueue.x-k8s.io/queue-name: user-queue
spec:
template:
spec:
containers:
- name: dummy-job
image: registry.k8s.io/e2e-test-images/agnhost:2.53
args: ["pause"]
resources:
claims:
- name: gpu
requests:
cpu: "1"
memory: "200Mi"
resourceClaims:
- name: gpu
resourceClaimTemplateName: gpu-share
restartPolicy: Never
如果您省略 capacity.requests,Kueue 将按设备的 RequestPolicy.Default 或设备的完整容量计费。
如果你不确定使用哪种方法,请咨询你的管理员。
2. 运行工作负载
你可以使用以下命令运行工作负载。
对于基于 ResourceClaimTemplate 的工作负载:
kubectl create -f https://kueue.sigs.k8s.io/examples/dra/sample-dra-rct-job.yaml
对于基于扩展资源的工作负载:
kubectl create -f https://kueue.sigs.k8s.io/examples/dra/sample-dra-extended-resource-job.yaml
Kueue 将在内部为这个 Job 创建一个对应的 Workload。
3.(可选)监控工作负载的状态
你可以使用以下命令查看 Workload 状态:
kubectl -n default get workloads.kueue.x-k8s.io
要检查工作负载是否被准入并查看 DRA 资源核算情况:
kubectl -n default describe workload <workload-name>
查看 Conditions 部分了解准入状态,查看 Events 部分了解详细信息。
如果工作负载已被准入,您可以在
status.admission.podSetAssignments[].resourceUsage 字段中验证为配额计费的资源:
kubectl -n default get workloads.kueue.x-k8s.io <workload-name> -o yaml
故障排除
工作负载不被准入
如果 Workload 一直处于 Pending 状态:
- 检查
ClusterQueue是否有 DRA 资源的配额,且未被其他工作负载完全消耗。 - 运行
kubectl -n default describe workload <workload-name>然后查看 Events 部分了解准入被拒绝的原因。
重复计数(扩展资源路径)
如果配额的使用量显示为预期值的两倍(例如,单个 GPU 显示为 2 而非 1),
请验证 KueueDRAIntegrationExtendedResource 是否未被显式禁用。
这个 gate 从 v0.19 起默认启用,可确保 Kueue 对由 DRA 支持的扩展资源仅计算一次,
而不是将其同时计为标准资源请求和 DRA 设备。
缺少 DeviceClass
对于扩展资源路径,DeviceClass 必须在你提交工作负载之前就存在。
如果它是在你的工作负载被拒绝之后才创建的,那么在另一个集群事件触发重新入队之前,该工作负载可能不会被重新评估。
请删除并重新创建工作负载以强制重新评估。
对于其他常见的故障排除,请参见 故障排除指南.
反馈
这个页面有帮助吗?
Glad to hear it! Please tell us how we can improve.
Sorry to hear that. Please tell us how we can improve.