在集群中设置 DRA
Kubernetes v1.34 [稳定]
(默认启用:true)本页面介绍如何在 Kubernetes 集群中配置**动态资源分配 (DRA)**,方法是启用 API 组并配置设备类别。这些说明适用于集群管理员。
关于 DRA
一项 Kubernetes 功能,允许你在 Pod 之间请求和共享资源。这些资源通常是连接的设备,例如硬件加速器。
通过 DRA,设备驱动程序和集群管理员定义可用于工作负载中**声明**的设备**类别**。Kubernetes 将匹配的设备分配给特定的声明,并将相应的 Pod 放置在可以访问所分配设备的节点上。
请确保你熟悉 DRA 的工作原理以及 DRA 术语,例如 DeviceClasses、ResourceClaims 和 ResourceClaimTemplates。有关详细信息,请参阅动态资源分配 (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"
尝试以下故障排除步骤
重新配置并重新启动 `kube-apiserver` 组件。
如果完整的 `.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
尝试以下故障排除步骤
- 检查 DRA 驱动程序的健康状况,并在其日志输出中查找有关发布 ResourceSlices 的错误消息。驱动程序的供应商可能提供进一步的安装和故障排除说明。
创建 DeviceClasses
你可以通过创建DeviceClasses来定义应用程序操作员可以在工作负载中声明的设备类别。一些设备驱动程序提供商可能还会在驱动程序安装期间指示你创建 DeviceClasses。
驱动程序发布的 ResourceSlices 包含有关驱动程序管理的设备的信息,例如容量、元数据和属性。你可以使用Common Expression Language筛选 DeviceClasses 中的属性,这可以使工作负载操作员更容易找到设备。
要查找可以使用 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
你还可以查阅驱动程序提供商的文档,了解可用的属性和值。
查看以下 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"
在集群中创建 DeviceClass
kubectl apply -f https://k8s.io/examples/dra/deviceclass.yaml
清理
要删除在此任务中创建的 DeviceClass,请运行以下命令
kubectl delete -f https://k8s.io/examples/dra/deviceclass.yaml