您可以使用动态资源分配 (DRA) 为 Google Kubernetes Engine (GKE) 工作负载灵活请求设备。本文档将向您展示如何创建 ResourceClaimTemplate 以请求集群中节点池中的现有设备,然后创建工作负载以观察 Kubernetes 如何灵活地将设备分配给 Pod。
本文档内容面向需要运行 AI/机器学习或高性能计算 (HPC) 等工作负载的 应用运维人员 和 数据工程师 。
使用 DRA 请求设备简介
为 DRA 设置 GKE 基础设施时,节点上的 DRA 驱动程序会在集群中创建 DeviceClass 对象。 DeviceClass 定义了可供工作负载请求的设备类别,例如 GPU。 平台管理员可以选择性地部署其他 DeviceClass,以限制您可以在特定工作负载中请求哪些设备。
如需请求 DeviceClass 中的设备,请创建以下对象之一:
- ResourceClaim:ResourceClaim 可让 Pod 或用户通过在 DeviceClass 中过滤特定参数来请求硬件资源。
- ResourceClaimTemplate: ResourceClaimTemplate 定义了一个模板,Pod 可使用该模板自动为每个 Pod 创建新的 ResourceClaim。
如需详细了解 ResourceClaim 和 ResourceClaimTemplate, 请参阅 何时使用 ResourceClaim 和 ResourceClaimTemplate。
本文档中的示例使用基本的 ResourceClaimTemplate 来请求指定的设备配置。如需详细了解您可以指定的所有字段 ,请参阅 ResourceClaimTemplate API 参考文档。
限制
存在以下限制:
- GKE 中 DRA 的限制
- 设备专用限制,无论您是否使用 DRA: Standard 集群上的 GPU 工作负载
准备工作
在开始之前,请确保您已执行以下任务:
- 启用 Google Kubernetes Engine API。 启用 Google Kubernetes Engine API
- 如果您要使用 Google Cloud CLI 执行此任务,请安装并初始化 gcloud CLI。 如果您之前安装了 gcloud CLI,请通过运行
gcloud components update命令来获取最新版本。较早版本的 gcloud CLI 可能不支持运行本文档中的命令。
- 确保您的 GKE 集群已针对 DRA 工作负载进行配置。
声明设备和部署工作负载
如要请求每个 Pod 的设备分配,您需要创建一个 ResourceClaimTemplate,其中包含您请求的设备配置,例如特定类型的 GPU。当您部署引用 ResourceClaimTemplate 的工作负载时,Kubernetes 会根据 ResourceClaimTemplate 为工作负载中的每个 Pod 创建 ResourceClaim。Kubernetes 会分配所请求的资源,并将 Pod 调度到相应的节点上。
如需在具有 DRA 的工作负载中请求 GPU,请按以下步骤操作:
将以下清单保存为
gpu-claim-template.yaml:apiVersion: resource.k8s.io/v1 kind: ResourceClaimTemplate metadata: name: gpu-claim-template spec: spec: devices: requests: - name: single-gpu exactly: deviceClassName: gpu.nvidia.com allocationMode: ExactCount count: 1创建 ResourceClaimTemplate:
kubectl create -f gpu-claim-template.yaml如需创建引用 ResourceClaimTemplate 的工作负载,请将以下清单保存为
dra-gpu-example.yaml:apiVersion: apps/v1 kind: Deployment metadata: name: dra-gpu-example spec: replicas: 1 selector: matchLabels: app: dra-gpu-example template: metadata: labels: app: dra-gpu-example spec: containers: - name: ctr image: ubuntu:22.04 command: ["bash", "-c"] args: ["echo $(nvidia-smi -L || echo Waiting...); sleep infinity"] resources: claims: - name: single-gpu resourceClaims: - name: single-gpu resourceClaimTemplateName: gpu-claim-template tolerations: - key: "nvidia.com/gpu" operator: "Exists" effect: "NoSchedule"部署工作负载:
kubectl create -f dra-gpu-example.yaml
验证硬件分配
您可以通过检查 ResourceClaim 或查看 Pod 的日志来验证您的工作负载是否已分配了相应硬件。如需验证分配,请按以下步骤操作:
获取与您部署的工作负载相关联的 ResourceClaim:
kubectl get resourceclaims输出类似于以下内容:
NAME STATE AGE dra-gpu-example-64b75dc6b-x8bd6-single-gpu-jwwdh allocated,reserved 9s详细了解分配给 Pod 的硬件:
kubectl describe resourceclaims RESOURCECLAIM将
RESOURCECLAIM替换为从上一步的输出中获得的 ResourceClaim 的全名。输出类似于以下内容:
Name: dra-gpu-example-68f595d7dc-prv27-single-gpu-qgjq5 Namespace: default Labels: <none> Annotations: resource.kubernetes.io/pod-claim-name: single-gpu API Version: resource.k8s.io/v1 Kind: ResourceClaim Metadata: # Multiple lines are omitted here. Spec: Devices: Requests: Exactly: Allocation Mode: ExactCount Count: 1 Device Class Name: gpu.nvidia.com Name: single-gpu Status: Allocation: Devices: Results: Device: gpu-0 Driver: gpu.nvidia.com Pool: gke-cluster-1-dra-gpu-pool-b56c4961-7vnm Request: single-gpu Node Selector: Node Selector Terms: Match Fields: Key: metadata.name Operator: In Values: gke-cluster-1-dra-gpu-pool-b56c4961-7vnm Reserved For: Name: dra-gpu-example-68f595d7dc-prv27 Resource: pods UID: e16c2813-08ef-411b-8d92-a72f27ebf5ef Events: <none>获取您部署的工作负载的日志:
kubectl logs deployment/dra-gpu-example --all-pods=true输出类似于以下内容:
[pod/dra-gpu-example-64b75dc6b-x8bd6/ctr] GPU 0: Tesla T4 (UUID: GPU-2087ac7a-f781-8cd7-eb6b-b00943cc13ef)此输出表明 GKE 为容器分配了一个 GPU。