在集群中设置 DRA

特性状态: Kubernetes v1.32 [beta] (enabled by default: false)

本文介绍如何在 Kubernetes 集群中通过启用 API 组并配置设备类别来设置动态资源分配(DRA)。 这些指示说明适用于集群管理员。

关于 DRA

Kubernetes 提供的一项特性,允许你在多个 Pod 之间请求和共享资源。
这些资源通常是挂接的设备,例如硬件加速器。

借助 DRA,设备驱动和集群管理员可以定义设备的类别,这些类别可供工作负载中的 Pod 申领。 Kubernetes 会将匹配的设备分配给特定的申领,并将相应的 Pod 调度到能够访问这些已分配设备的节点上。

确保你已了解 DRA 的工作机制及其术语,例如 DeviceClassesResourceClaims以及 ResourceClaimTemplates。 更多信息请参见动态资源分配(DRA)

准备开始

你必须拥有一个 Kubernetes 的集群,且必须配置 kubectl 命令行工具让其与你的集群通信。 建议运行本教程的集群至少有两个节点,且这两个节点不能作为控制平面主机。 如果你还没有集群,你可以通过 Minikube 构建一个你自己的集群,或者你可以使用下面的 Kubernetes 练习环境之一:

你的 Kubernetes 服务器版本必须不低于版本 v1.32.

要获知版本信息,请输入 kubectl version.

  • 将设备直接或间接挂接到你的集群中。为避免驱动相关的问题,请在安装驱动之前先完成 DRA 特性的配置。

启用 DRA API 组

若要让 Kubernetes 能够使用 DRA 为你的 Pod 分配资源,需完成以下配置步骤:

  1. 在所有以下组件中启用 DynamicResourceAllocation 特性门控

    • kube-apiserver
    • kube-controller-manager
    • kube-scheduler
    • kubelet
  1. 启用以下 API 组

    • resource.k8s.io/v1beta1:DRA 所必需。
    • resource.k8s.io/v1beta2:可选,推荐启用以提升用户体验。

    更多信息请参阅启用或禁用 API 组

验证是否启用了 DRA

若要验证集群是否配置正确,可尝试列出 DeviceClass:

kubectl get deviceclasses

如果组件配置正确,输出类似如下:

No resources found

如果 DRA 未正确配置,则上述命令的输出可能如下:

error: the server doesn't have a resource type "deviceclasses"

你可以尝试以下排查步骤:

  1. 确保 kube-scheduler 组件已启用 DynamicResourceAllocation 特性门控,并且使用的是 v1 配置 API。 如果你使用自定义配置,你可能还需额外启用 DynamicResource 插件。

  2. 重启 kube-apiserverkube-controller-manager 组件,以传播 API 组变更。

安装设备驱动

你启用集群的 DRA 特性后,你可以安装所挂接设备的驱动。 安装方式请参见设备所有者或驱动维护方提供的文档。你安装的驱动必须与 DRA 兼容。

若要验证驱动是否正常工作,可列出集群中的 ResourceSlice:

kubectl get resourceslices

输出示例如下:

NAME                                                  NODE                DRIVER               POOL                             AGE
cluster-1-device-pool-1-driver.example.com-lqx8x      cluster-1-node-1    driver.example.com   cluster-1-device-pool-1-r1gc     7s
cluster-1-device-pool-2-driver.example.com-29t7b      cluster-1-node-2    driver.example.com   cluster-1-device-pool-2-446z     8s

创建 DeviceClass

你可以通过创建 DeviceClasses 定义设备的分类,供应用运维人员在工作负载中申领这些设备。 某些设备驱动提供方也可能在驱动安装过程中要求你创建 DeviceClass。

你的驱动所发布的 ResourceSlice 中包含了设备的相关信息,例如容量、元数据和属性。你可以使用 通用表达式语言(CEL) 表达式按 DeviceClass 中的属性进行筛选, 从而帮助工作负载运维人员更轻松地找到合适的设备。

  1. 若要查看可通过 CEL 表达式在 DeviceClass 中选择的设备属性,你可以查看某个 ResourceSlice 的规约:

    kubectl get resourceslice <resourceslice-name> -o yaml
    

    输出类似如下:

    apiVersion: resource.k8s.io/v1beta1
    kind: ResourceSlice
    # 为简洁省略部分内容
    spec:
      devices:
      - basic:
          attributes:
            type:
              string: gpu
          capacity:
            memory:
              value: 64Gi
          name: gpu-0
      - basic:
          attributes:
            type:
              string: gpu
          capacity:
            memory:
              value: 64Gi
          name: gpu-1
      driver: driver.example.com
      nodeName: cluster-1-node-1
    # 为简洁省略部分内容
    

    你也可以查阅驱动提供商的文档,了解可用的属性和对应值。

  1. 查看以下 DeviceClass 示例清单,它选择所有由 driver.example.com 设备驱动管理的设备:

    apiVersion: resource.k8s.io/v1beta2
    kind: DeviceClass
    metadata:
      name: example-device-class
    spec:
      selectors:
      - cel:
          expression: |-
            device.driver == "driver.example.com"        
    
  1. 在集群中创建 DeviceClass:

    kubectl apply -f http://k8s.io/examples/dra/deviceclass.yaml
    

清理

要删除本任务中创建的 DeviceClass,运行以下命令:

kubectl delete -f http://k8s.io/examples/dra/deviceclass.yaml

接下来

最后修改 July 15, 2025 at 10:02 AM PST: [zh] Add set-up-dra-clustere.md (8c3579ed0a)