本页面介绍了如何设置 Google Kubernetes Engine (GKE) 基础架构以支持动态资源分配 (DRA)。在此页面上,您将创建可部署 GPU 或 TPU 工作负载的集群,并手动安装启用 DRA 所需的驱动程序。
本页面适用于希望降低使用专用硬件设备设置基础设施的复杂性和开销的平台管理员。
DRA 简介
DRA 是一项内置的 Kubernetes 功能,可让您在集群中的 Pod 和容器之间灵活地请求、分配和共享硬件。如需了解详情,请参阅动态资源分配简介。
限制
- 不支持节点自动预配。
- Autopilot 集群不支持 DRA。
- DRA 不支持自动 GPU 驱动程序安装。
- 您无法使用以下 GPU 共享功能:
- 分时 GPU
- 多实例 GPU
- 多进程服务 (MPS)
要求
如需使用 DRA,您的 GKE 版本必须为 1.32.1-gke.1489001 或更高版本。
您还应熟悉以下要求和限制,具体取决于您要使用的硬件类型:
准备工作
在开始之前,请确保您已执行以下任务:
- 启用 Google Kubernetes Engine API。 启用 Google Kubernetes Engine API
- 如果您要使用 Google Cloud CLI 执行此任务,请安装并初始化 gcloud CLI。 如果您之前安装了 gcloud CLI,请运行
gcloud components update
以获取最新版本。
如果您未使用 Cloud Shell,请安装 Helm CLI:
curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 chmod 700 get_helm.sh ./get_helm.sh
创建 GKE Standard 集群
创建启用了 DRA 的 Kubernetes Beta 版 API 的 Standard 模式集群:
gcloud container clusters create CLUSTER_NAME \
--enable-kubernetes-unstable-apis="resource.k8s.io/v1beta1/deviceclasses,resource.k8s.io/v1beta1/resourceclaims,resource.k8s.io/v1beta1/resourceclaimtemplates,resource.k8s.io/v1beta1/resourceslices" \
--cluster-version=GKE_VERSION
替换以下内容:
CLUSTER_NAME
:集群的名称。GKE_VERSION
:要用于集群和节点的 GKE 版本。必须为 1.32.1-gke.1489001 或更高版本。
创建具有 GPU 或 TPU 的 GKE 节点池
在 GKE 上,您可以将 DRA 与 GPU 和 TPU 搭配使用。节点池配置设置(例如机器类型、加速器类型、数量、节点操作系统和节点位置)取决于您的需求。
GPU
如需将 DRA 用于 GPU,您必须在创建节点池时执行以下操作:
- 使用
gpu-driver-version=disabled
停用 GPU 驱动程序自动安装。 - 通过添加
gke-no-default-nvidia-gpu-device-plugin=true
节点标签来停用 GPU 设备插件。 - 通过添加
nvidia.com/gpu.present=true
节点标签,让 DRA 驱动程序 DaemonSet 在节点上运行。
如需为 DRA 创建 GPU 节点池,请按以下步骤操作:
创建具有所需硬件的节点池。以下示例创建了一个节点池,该节点池在 Container-Optimized OS 上具有 g2-standard-24 实例和两个 L4 GPU。
gcloud container node-pools create NODEPOOL_NAME \ --cluster=CLUSTER_NAME \ --machine-type "g2-standard-24" \ --accelerator "type=nvidia-l4,count=2,gpu-driver-version=disabled" \ --num-nodes "1" \ --node-labels=gke-no-default-nvidia-gpu-device-plugin=true,nvidia.com/gpu.present=true
替换以下内容:
NODEPOOL_NAME
:您的节点池的名称。CLUSTER_NAME
:您的集群的名称。
在 Container-Optimized OS 或 Ubuntu 节点上手动安装驱动程序。如需了解详细说明,请参阅手动安装 NVIDIA GPU 驱动程序。
TPU
如需为 TPU 使用 DRA,您必须通过添加 gke-no-default-tpu-device-plugin=true
节点标签来停用 TPU 设备插件。
创建使用 TPU 的节点池。以下示例会创建一个 TPU Trillium 节点池:
gcloud container node-pools create NODEPOOL_NAME \
--cluster CLUSTER_NAME --num-nodes 1 \
--node-labels "gke-no-default-tpu-device-plugin=true,gke-no-default-tpu-dra-plugin=true" \
--machine-type=ct6e-standard-8t
替换以下内容:
NODEPOOL_NAME
:您的节点池的名称。CLUSTER_NAME
:您的集群的名称。
安装 DRA 驱动程序
GPU
拉取并更新包含 NVIDIA DRA 驱动程序的 Helm 图表:
helm repo add nvidia https://helm.ngc.nvidia.com/nvidia \ && helm repo update
安装版本为 25.3.0-rc.4 的 NVIDIA DRA 驱动程序:
helm install nvidia-dra-driver-gpu nvidia/nvidia-dra-driver-gpu --version="25.3.0-rc.4" --create-namespace --namespace nvidia-dra-driver-gpu \ --set nvidiaDriverRoot="/home/kubernetes/bin/nvidia/" \ --set gpuResourcesEnabledOverride=true \ --set resources.computeDomains.enabled=false \ --set kubeletPlugin.priorityClassName="" \ --set kubeletPlugin.tolerations[0].key=nvidia.com/gpu \ --set kubeletPlugin.tolerations[0].operator=Exists \ --set kubeletPlugin.tolerations[0].effect=NoSchedule
对于 Ubuntu 节点,请使用
nvidiaDriverRoot="/opt/nvidia"
目录路径。
TPU
您可以使用提供的 Helm 图表为 TPU 安装 DRA 驱动程序。如需获取 Helm 图表的访问权限,请完成以下步骤:
克隆
ai-on-gke
代码库,以访问包含 GPU 和 TPU 的 DRA 驱动程序的 Helm 图表:git clone https://github.com/ai-on-gke/common-infra.git
导航到包含图表的目录:
cd common-infra/common/charts
安装 TPU DRA 驱动程序:
./tpu-dra-driver/install-tpu-dra-driver.sh
验证您的基础架构是否已为 DRA 做好准备
验证 DRA 驱动程序 Pod 是否正在运行。
GPU
kubectl get pods -n nvidia-dra-driver-gpu
NAME READY STATUS RESTARTS AGE
nvidia-dra-driver-gpu-kubelet-plugin-52cdm 1/1 Running 0 46s
TPU
kubectl get pods -n tpu-dra-driver
NAME READY STATUS RESTARTS AGE
tpu-dra-driver-kubeletplugin-h6m57 1/1 Running 0 30s
确认 ResourceSlice
列出了您添加的硬件设备:
kubectl get resourceslices -o yaml
如果您使用了上一部分中的示例,则 ResourceSlice
类似于以下内容,具体取决于您使用的硬件类型:
GPU
以下示例创建了一台配备两个 L4 GPU 的 g2-standard-24 机器。
apiVersion: v1
items:
- apiVersion: resource.k8s.io/v1beta1
kind: ResourceSlice
metadata:
# lines omitted for clarity
spec:
devices:
- basic:
attributes:
architecture:
string: Ada Lovelace
brand:
string: Nvidia
cudaComputeCapability:
version: 8.9.0
cudaDriverVersion:
version: 12.9.0
driverVersion:
version: 575.57.8
index:
int: 0
minor:
int: 0
productName:
string: NVIDIA L4
type:
string: gpu
uuid:
string: GPU-4d403095-4294-6ddd-66fd-cfe5778ef56e
capacity:
memory:
value: 23034Mi
name: gpu-0
- basic:
attributes:
architecture:
string: Ada Lovelace
brand:
string: Nvidia
cudaComputeCapability:
version: 8.9.0
cudaDriverVersion:
version: 12.9.0
driverVersion:
version: 575.57.8
index:
int: 1
minor:
int: 1
productName:
string: NVIDIA L4
type:
string: gpu
uuid:
string: GPU-cc326645-f91d-d013-1c2f-486827c58e50
capacity:
memory:
value: 23034Mi
name: gpu-1
driver: gpu.nvidia.com
nodeName: gke-cluster-gpu-pool-9b10ff37-mf70
pool:
generation: 1
name: gke-cluster-gpu-pool-9b10ff37-mf70
resourceSliceCount: 1
kind: List
metadata:
resourceVersion: ""
TPU
apiVersion: v1
items:
- apiVersion: resource.k8s.io/v1beta1
kind: ResourceSlice
metadata:
# lines omitted for clarity
spec:
devices:
- basic:
attributes:
index:
int: 0
tpuGen:
string: v6e
uuid:
string: tpu-54de4859-dd8d-f67e-6f91-cf904d965454
name: "0"
- basic:
attributes:
index:
int: 1
tpuGen:
string: v6e
uuid:
string: tpu-54de4859-dd8d-f67e-6f91-cf904d965454
name: "1"
- basic:
attributes:
index:
int: 2
tpuGen:
string: v6e
uuid:
string: tpu-54de4859-dd8d-f67e-6f91-cf904d965454
name: "2"
- basic:
attributes:
index:
int: 3
tpuGen:
string: v6e
uuid:
string: tpu-54de4859-dd8d-f67e-6f91-cf904d965454
name: "3"
driver: tpu.google.com
nodeName: gke-tpu-b4d4b61b-fwbg
pool:
generation: 1
name: gke-tpu-b4d4b61b-fwbg
resourceSliceCount: 1
kind: List
metadata:
resourceVersion: ""