Kubernetes v1.35 [稳定版](默认启用)本页向你介绍如何使用动态资源分配(DRA)将设备分配给 Pod。这些说明面向工作负载操作员。在阅读本页之前,请熟悉 DRA 的工作原理以及 DRA 相关术语,例如 ResourceClaims 和 ResourceClaimTemplates。有关更多信息,请参阅 动态资源分配 (DRA)。
作为工作负载操作员,你可以通过创建 ResourceClaim 或 ResourceClaimTemplate 来为你的工作负载申请设备。当你部署工作负载时,Kubernetes 和设备驱动程序会找到可用设备,将其分配给你的 Pod,并将这些 Pod 放置在能够访问这些设备的节点上。
你需要有一个 Kubernetes 集群,并且必须配置 kubectl 命令行工具以与你的集群通信。建议在至少有两个节点的集群上运行本教程,且这些节点不能作为控制平面主机。如果你还没有集群,可以通过 minikube 创建一个,或者使用以下 Kubernetes 演练场之一。
您的 Kubernetes 服务器版本必须为 v1.34 或更高版本。要检查版本,请输入 kubectl version。
你的集群管理员或设备驱动程序会创建DeviceClasses,用于定义设备的类别。你可以使用 通用表达式语言 (CEL) 来筛选特定设备属性,从而申请设备。
获取集群中的 DeviceClasses 列表
kubectl get deviceclasses
输出类似于以下内容
NAME AGE
driver.example.com 16m
如果你收到权限错误,可能表示你没有获取 DeviceClasses 的访问权限。请咨询你的集群管理员或驱动程序提供商,了解可用的设备属性。
你可以使用 ResourceClaims 从 DeviceClass 请求资源。要创建 ResourceClaim,请执行以下任一操作:
如果你在 Pod 中直接引用特定的 ResourceClaim,则该 ResourceClaim 必须已在集群中存在。如果引用的 ResourceClaim 不存在,Pod 将保持 Pending(挂起)状态,直到 ResourceClaim 被创建。虽然你可以在 Pod 中引用自动生成的 ResourceClaim,但通常不建议这样做,因为自动生成的 ResourceClaim 绑定在触发生成的 Pod 的生命周期内。
要创建申请资源的工作负载,请选择以下选项之一:
查看以下示例清单
apiVersion: resource.k8s.io/v1
kind: ResourceClaimTemplate
metadata:
name: example-resource-claim-template
spec:
spec:
devices:
requests:
- name: gpu-claim
exactly:
deviceClassName: example-device-class
selectors:
- cel:
expression: |-
device.attributes["driver.example.com"].type == "gpu" &&
device.capacity["driver.example.com"].memory == quantity("64Gi")
此清单创建了一个 ResourceClaimTemplate,它在 example-device-class DeviceClass 中请求符合以下两个参数的设备:
driver.example.com/type 属性且值为 gpu。64Gi 的容量。要创建该 ResourceClaimTemplate,请运行以下命令
kubectl apply -f https://k8s.io/examples/dra/resourceclaimtemplate.yaml
查看以下示例清单
apiVersion: resource.k8s.io/v1
kind: ResourceClaim
metadata:
name: example-resource-claim
spec:
devices:
requests:
- name: single-gpu-claim
exactly:
deviceClassName: example-device-class
allocationMode: All
selectors:
- cel:
expression: |-
device.attributes["driver.example.com"].type == "gpu" &&
device.capacity["driver.example.com"].memory == quantity("64Gi")
此清单创建了一个 ResourceClaim,它在 example-device-class DeviceClass 中请求符合以下两个参数的设备:
driver.example.com/type 属性且值为 gpu。64Gi 的容量。要创建该 ResourceClaim,请运行以下命令
kubectl apply -f https://k8s.io/examples/dra/resourceclaim.yaml
要请求设备分配,请在 Pod 规约的 resourceClaims 字段中指定 ResourceClaim 或 ResourceClaimTemplate。然后,在该 Pod 的某个容器的 resources.claims 字段中按名称请求特定的申请。你可以在 resourceClaims 字段中指定多个条目,并在不同的容器中使用特定的申请。
查看以下示例 Job
apiVersion: batch/v1
kind: Job
metadata:
name: example-dra-job
spec:
completions: 10
parallelism: 2
template:
spec:
restartPolicy: Never
containers:
- name: container0
image: ubuntu:24.04
command: ["sleep", "9999"]
resources:
claims:
- name: separate-gpu-claim
- name: container1
image: ubuntu:24.04
command: ["sleep", "9999"]
resources:
claims:
- name: shared-gpu-claim
- name: container2
image: ubuntu:24.04
command: ["sleep", "9999"]
resources:
claims:
- name: shared-gpu-claim
resourceClaims:
- name: separate-gpu-claim
resourceClaimTemplateName: example-resource-claim-template
- name: shared-gpu-claim
resourceClaimName: example-resource-claim
此 Job 中的每个 Pod 具有以下属性:
separate-gpu-claim 的 ResourceClaimTemplate 和名为 shared-gpu-claim 的 ResourceClaim 可供容器使用。container0 请求来自 separate-gpu-claim ResourceClaimTemplate 的设备。container1 和 container2 共享对来自 shared-gpu-claim ResourceClaim 的设备的访问权限。创建 Job
kubectl apply -f https://k8s.io/examples/dra/dra-example-job.yaml
尝试以下故障排查步骤:
kubectl describe 查看各层对象,查看是否有状态字段或事件可以解释工作负载为何未启动。must specify one of: resourceClaimName, resourceClaimTemplateName 时,请检查 pod.spec.resourceClaims 中的所有条目是否恰好设置了其中一个字段。如果已经设置,则可能是集群安装了一个针对 Kubernetes < 1.32 的 API 构建的突变 Pod Webhook。请与你的集群管理员协作检查此问题。要删除你在此任务中创建的 Kubernetes 对象,请按照以下步骤操作:
删除示例 Job
kubectl delete -f https://k8s.io/examples/dra/dra-example-job.yaml
要删除你的资源申请,请运行以下命令之一:
删除 ResourceClaimTemplate
kubectl delete -f https://k8s.io/examples/dra/resourceclaimtemplate.yaml
删除 ResourceClaim
kubectl delete -f https://k8s.io/examples/dra/resourceclaim.yaml