使用 DRA 将设备分配给工作负载

特性状态: Kubernetes v1.35 [稳定版](默认启用)

本页向你介绍如何使用动态资源分配(DRA)将设备分配给 Pod。这些说明面向工作负载操作员。在阅读本页之前,请熟悉 DRA 的工作原理以及 DRA 相关术语,例如 ResourceClaimsResourceClaimTemplates。有关更多信息,请参阅 动态资源分配 (DRA)

关于使用 DRA 进行设备分配

作为工作负载操作员,你可以通过创建 ResourceClaim 或 ResourceClaimTemplate 来为你的工作负载申请设备。当你部署工作负载时,Kubernetes 和设备驱动程序会找到可用设备,将其分配给你的 Pod,并将这些 Pod 放置在能够访问这些设备的节点上。

开始之前

你需要有一个 Kubernetes 集群,并且必须配置 kubectl 命令行工具以与你的集群通信。建议在至少有两个节点的集群上运行本教程,且这些节点不能作为控制平面主机。如果你还没有集群,可以通过 minikube 创建一个,或者使用以下 Kubernetes 演练场之一。

您的 Kubernetes 服务器版本必须为 v1.34 或更高版本。

要检查版本,请输入 kubectl version

  • 请确保你的集群管理员已设置好 DRA、挂载了设备并安装了驱动程序。有关更多信息,请参阅 在集群中设置 DRA

确定要申请的设备

你的集群管理员或设备驱动程序会创建DeviceClasses,用于定义设备的类别。你可以使用 通用表达式语言 (CEL) 来筛选特定设备属性,从而申请设备。

获取集群中的 DeviceClasses 列表

kubectl get deviceclasses

输出类似于以下内容

NAME                 AGE
driver.example.com   16m

如果你收到权限错误,可能表示你没有获取 DeviceClasses 的访问权限。请咨询你的集群管理员或驱动程序提供商,了解可用的设备属性。

申请资源

你可以使用 ResourceClaims 从 DeviceClass 请求资源。要创建 ResourceClaim,请执行以下任一操作:

  • 如果你希望多个 Pod 共享对同一设备的访问权限,或者希望申请在 Pod 生命周期结束后仍然存在,请手动创建 ResourceClaim。
  • 使用 ResourceClaimTemplate 让 Kubernetes 生成并管理每个 Pod 的 ResourceClaim。如果你希望每个 Pod 都能访问具有类似配置的独立设备,请创建一个 ResourceClaimTemplate。例如,你可能希望在使用并行执行的 Job 中的 Pod 同时访问设备。

如果你在 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

在工作负载中使用 DRA 请求设备

要请求设备分配,请在 Pod 规约的 resourceClaims 字段中指定 ResourceClaim 或 ResourceClaimTemplate。然后,在该 Pod 的某个容器的 resources.claims 字段中按名称请求特定的申请。你可以在 resourceClaims 字段中指定多个条目,并在不同的容器中使用特定的申请。

  1. 查看以下示例 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 的设备。
      • container1container2 共享对来自 shared-gpu-claim ResourceClaim 的设备的访问权限。
  2. 创建 Job

    kubectl apply -f https://k8s.io/examples/dra/dra-example-job.yaml
    

尝试以下故障排查步骤:

  1. 当工作负载未按预期启动时,从 Job 到 Pod 再到 ResourceClaim 进行逐层检查,使用 kubectl describe 查看各层对象,查看是否有状态字段或事件可以解释工作负载为何未启动。
  2. 当创建 Pod 失败并提示 must specify one of: resourceClaimName, resourceClaimTemplateName 时,请检查 pod.spec.resourceClaims 中的所有条目是否恰好设置了其中一个字段。如果已经设置,则可能是集群安装了一个针对 Kubernetes < 1.32 的 API 构建的突变 Pod Webhook。请与你的集群管理员协作检查此问题。

清理

要删除你在此任务中创建的 Kubernetes 对象,请按照以下步骤操作:

  1. 删除示例 Job

    kubectl delete -f https://k8s.io/examples/dra/dra-example-job.yaml
    
  2. 要删除你的资源申请,请运行以下命令之一:

    • 删除 ResourceClaimTemplate

      kubectl delete -f https://k8s.io/examples/dra/resourceclaimtemplate.yaml
      
    • 删除 ResourceClaim

      kubectl delete -f https://k8s.io/examples/dra/resourceclaim.yaml
      

接下来


最后修改于 2025 年 7 月 2 日下午 6:43 (PST): DRA: core update for 1.34 (36162b1107)