在集群中设置 DRA

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

本页面介绍如何在 Kubernetes 集群中配置**动态资源分配 (DRA)**,方法是启用 API 组并配置设备类别。这些说明适用于集群管理员。

关于 DRA

一项 Kubernetes 功能,允许你在 Pod 之间请求和共享资源。这些资源通常是连接的设备,例如硬件加速器。

通过 DRA,设备驱动程序和集群管理员定义可用于工作负载中**声明**的设备**类别**。Kubernetes 将匹配的设备分配给特定的声明,并将相应的 Pod 放置在可以访问所分配设备的节点上。

请确保你熟悉 DRA 的工作原理以及 DRA 术语,例如 DeviceClassesResourceClaimsResourceClaimTemplates。有关详细信息,请参阅动态资源分配 (DRA)

准备工作

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

你的 Kubernetes 服务器版本必须是 v1.34。

要检查版本,请输入 kubectl version

  • 直接或间接将设备连接到你的集群。为避免驱动程序出现潜在问题,请在为集群设置 DRA 功能后再安装驱动程序。

可选:启用旧版 DRA API 组

DRA 在 Kubernetes 1.34 中已升级到稳定版,并默认启用。一些较旧的 DRA 驱动程序或工作负载可能仍需要 Kubernetes 1.30 中的 v1beta1 API 或 Kubernetes 1.32 中的 v1beta2。如果且仅当需要支持这些版本时,才启用以下API 组

* `resource.k8s.io/v1beta1`
* `resource.k8s.io/v1beta2`

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

验证 DRA 是否已启用

要验证集群配置是否正确,请尝试列出 DeviceClasses

kubectl get deviceclasses

如果组件配置正确,则输出类似于以下内容

No resources found

如果 DRA 未正确配置,则上述命令的输出类似于以下内容

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

尝试以下故障排除步骤

  1. 重新配置并重新启动 `kube-apiserver` 组件。

  2. 如果完整的 `.spec.resourceClaims` 字段从 Pod 中移除,或者 Pod 在不考虑 ResourceClaims 的情况下进行调度,请验证 `DynamicResourceAllocation` 功能门控没有在 kube-apiserver、kube-controller-manager、kube-scheduler 或 kubelet 中关闭。

安装设备驱动程序

为集群启用 DRA 后,你可以为连接的设备安装驱动程序。有关说明,请查阅设备所有者或维护设备驱动程序的项目的文档。你安装的驱动程序必须与 DRA 兼容。

要验证你安装的驱动程序是否按预期工作,请列出集群中的 ResourceSlices

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

尝试以下故障排除步骤

  1. 检查 DRA 驱动程序的健康状况,并在其日志输出中查找有关发布 ResourceSlices 的错误消息。驱动程序的供应商可能提供进一步的安装和故障排除说明。

创建 DeviceClasses

你可以通过创建DeviceClasses来定义应用程序操作员可以在工作负载中声明的设备类别。一些设备驱动程序提供商可能还会在驱动程序安装期间指示你创建 DeviceClasses。

驱动程序发布的 ResourceSlices 包含有关驱动程序管理的设备的信息,例如容量、元数据和属性。你可以使用Common Expression Language筛选 DeviceClasses 中的属性,这可以使工作负载操作员更容易找到设备。

  1. 要查找可以使用 CEL 表达式在 DeviceClasses 中选择的设备属性,请获取 ResourceSlice 的规范

    kubectl get resourceslice <resourceslice-name> -o yaml
    

    输出类似于以下内容

    apiVersion: resource.k8s.io/v1
    kind: ResourceSlice
    # lines omitted for clarity
    spec:
      devices:
      - attributes:
          type:
            string: gpu
        capacity:
          memory:
            value: 64Gi
        name: gpu-0
      - attributes:
          type:
            string: gpu
        capacity:
          memory:
            value: 64Gi
        name: gpu-1
      driver: driver.example.com
      nodeName: cluster-1-node-1
    # lines omitted for clarity
    

    你还可以查阅驱动程序提供商的文档,了解可用的属性和值。

  2. 查看以下 DeviceClass 示例清单,它选择由 `driver.example.com` 设备驱动程序管理的任何设备

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

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

清理

要删除在此任务中创建的 DeviceClass,请运行以下命令

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

下一步

上次修改时间:2025 年 7 月 2 日下午 6:43(太平洋标准时间):DRA:核心更新,适用于 1.34 (36162b1107)