您可以使用動態資源分配 (DRA),彈性要求 Google Kubernetes Engine (GKE) 工作負載的裝置。本文說明如何建立 ResourceClaimTemplate 來要求裝置,然後建立工作負載,觀察 Kubernetes 如何彈性地將裝置分配給 Pod。
本文件適用於執行 AI/機器學習或高效能運算 (HPC) 等工作負載的應用程式運算子和資料工程師。
關於使用 DRA 要求裝置
為 DRA 設定 GKE 基礎架構時,節點上的 DRA 驅動程式會在叢集中建立 DeviceClass 物件。DeviceClass 定義可供工作負載要求的裝置類別,例如 GPU。平台管理員可以視需要部署其他 DeviceClass,限制您在特定工作負載中可要求的裝置。
如要在 DeviceClass 中要求裝置,請建立下列其中一個物件:
- ResourceClaim: Pod 或使用者可透過 ResourceClaim,在 DeviceClass 中依特定參數篩選硬體資源。
- ResourceClaimTemplate: ResourceClaimTemplate 定義 Pod 可用來自動建立每個 Pod 的新 ResourceClaim 的範本。
如要進一步瞭解 ResourceClaim 和 ResourceClaimTemplate,請參閱「何時使用 ResourceClaim 和 ResourceClaimTemplate」。
本頁的範例使用基本 ResourceClaimTemplate 要求指定的裝置設定。如要進一步瞭解可指定的所有欄位,請參閱 ResourceClaimTemplate API 參考資料。
限制
- 不支援節點自動佈建功能。
- Autopilot 叢集不支援 DRA。
- 您無法使用下列 GPU 共用功能:
- GPU 分時功能
- 多執行個體 GPU
- 多重處理程序服務 (MPS)
需求條件
如要使用 DRA,GKE 版本必須為 1.34 以上。
此外,您也應熟悉下列規定和限制:
事前準備
開始之前,請確認你已完成下列工作:
- 啟用 Google Kubernetes Engine API。 啟用 Google Kubernetes Engine API
- 如要使用 Google Cloud CLI 執行這項工作,請安裝並初始化 gcloud CLI。如果您先前已安裝 gcloud CLI,請執行
gcloud components update指令,取得最新版本。較舊的 gcloud CLI 版本可能不支援執行本文件中的指令。
使用 DRA 部署工作負載
如要要求為每個 Pod 分配裝置,請建立 ResourceClaimTemplate,其中包含您要求的裝置設定,例如特定類型的 GPU。部署參照 ResourceClaimTemplate 的工作負載時,Kubernetes 會根據 ResourceClaimTemplate,為工作負載中的每個 Pod 建立 ResourceClaim。Kubernetes 會分配要求的資源,並在對應節點上排程 Pod。
如要在使用 DRA 的工作負載中要求裝置,請選取下列其中一個選項:
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 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...)"] 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
TPU
將下列資訊清單儲存為
claim-template.yaml:apiVersion: resource.k8s.io/v1 kind: ResourceClaimTemplate metadata: name: tpu-claim-template spec: spec: devices: requests: - name: all-tpus exactly: deviceClassName: tpu.google.com allocationMode: All這個 ResourceClaimTemplate 會要求所有 TPU,因此節點上的所有 TPU 都會分配給每個產生的 ResourceClaim。
建立 ResourceClaimTemplate:
kubectl create -f claim-template.yaml如要建立參照 ResourceClaimTemplate 的工作負載,請將下列資訊清單儲存為
dra-tpu-example.yaml:apiVersion: apps/v1 kind: Deployment metadata: name: dra-tpu-example spec: replicas: 1 selector: matchLabels: app: dra-tpu-example template: metadata: labels: app: dra-tpu-example spec: containers: - name: ctr image: ubuntu:22.04 command: - /bin/sh - -c - | echo "Environment Variables:" env echo "Sleeping indefinitely..." sleep infinity resources: claims: - name: all-tpus resourceClaims: - name: all-tpus resourceClaimTemplateName: tpu-claim-template tolerations: - key: "google.com/tpu" operator: "Exists" effect: "NoSchedule"部署工作負載:
kubectl create -f dra-tpu-example.yaml
驗證硬體分配
您可以檢查 ResourceClaim 或查看 Pod 的記錄,確認工作負載是否已分配到硬體。如要驗證 GPU 或 TPU 的分配情形,請選取下列其中一個選項:
GPU
取得與您部署的工作負載相關聯的 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。
TPU
取得與您部署的工作負載相關聯的 ResourceClaim:
kubectl get resourceclaims | grep dra-tpu-example輸出結果會與下列內容相似:
NAME STATE AGE dra-tpu-example-64b75dc6b-x8bd6-all-tpus-jwwdh allocated,reserved 9s進一步瞭解指派給 Pod 的硬體:
kubectl describe resourceclaims RESOURCECLAIM -o yaml將
RESOURCECLAIM替換為上一步輸出內容中的 ResourceClaim 全名。輸出結果會與下列內容相似:
apiVersion: resource.k8s.io/v1beta1 kind: ResourceClaim metadata: annotations: resource.kubernetes.io/pod-claim-name: all-tpus creationTimestamp: "2025-03-04T21:00:54Z" finalizers: - resource.kubernetes.io/delete-protection generateName: dra-tpu-example-59b8785697-k9kzd-all-gpus- name: dra-tpu-example-59b8785697-k9kzd-all-gpus-gnr7z namespace: default ownerReferences: - apiVersion: v1 blockOwnerDeletion: true controller: true kind: Pod name: dra-tpu-example-59b8785697-k9kzd uid: c2f4fe66-9a73-4bd3-a574-4c3eea5fda3f resourceVersion: "12189603" uid: 279b5014-340b-4ef6-9dda-9fbf183fbb71 spec: devices: requests: - allocationMode: All deviceClassName: tpu.google.com name: all-tpus status: allocation: devices: results: - adminAccess: null device: "0" driver: tpu.google.com pool: gke-tpu-2ec29193-bcc0 request: all-tpus - adminAccess: null device: "1" driver: tpu.google.com pool: gke-tpu-2ec29193-bcc0 request: all-tpus - adminAccess: null device: "2" driver: tpu.google.com pool: gke-tpu-2ec29193-bcc0 request: all-tpus - adminAccess: null device: "3" driver: tpu.google.com pool: gke-tpu-2ec29193-bcc0 request: all-tpus - adminAccess: null device: "4" driver: tpu.google.com pool: gke-tpu-2ec29193-bcc0 request: all-tpus - adminAccess: null device: "5" driver: tpu.google.com pool: gke-tpu-2ec29193-bcc0 request: all-tpus - adminAccess: null device: "6" driver: tpu.google.com pool: gke-tpu-2ec29193-bcc0 request: all-tpus - adminAccess: null device: "7" driver: tpu.google.com pool: gke-tpu-2ec29193-bcc0 request: all-tpus nodeSelector: nodeSelectorTerms: - matchFields: - key: metadata.name operator: In values: - gke-tpu-2ec29193-bcc0 reservedFor: - name: dra-tpu-example-59b8785697-k9kzd resource: pods uid: c2f4fe66-9a73-4bd3-a574-4c3eea5fda3f取得已部署工作負載的記錄:
kubectl logs deployment/dra-tpu-example --all-pods=true | grep "TPU"輸出結果會與下列內容相似:
[pod/dra-tpu-example-59b8785697-tm2lc/ctr] TPU_CHIPS_PER_HOST_BOUNDS=2,4,1 [pod/dra-tpu-example-59b8785697-tm2lc/ctr] TPU_TOPOLOGY_WRAP=false,false,false [pod/dra-tpu-example-59b8785697-tm2lc/ctr] TPU_SKIP_MDS_QUERY=true [pod/dra-tpu-example-59b8785697-tm2lc/ctr] TPU_RUNTIME_METRICS_PORTS=8431,8432,8433,8434,8435,8436,8437,8438 [pod/dra-tpu-example-59b8785697-tm2lc/ctr] TPU_WORKER_ID=0 [pod/dra-tpu-example-59b8785697-tm2lc/ctr] TPU_WORKER_HOSTNAMES=localhost [pod/dra-tpu-example-59b8785697-tm2lc/ctr] TPU_TOPOLOGY=2x4 [pod/dra-tpu-example-59b8785697-tm2lc/ctr] TPU_ACCELERATOR_TYPE=v6e-8 [pod/dra-tpu-example-59b8785697-tm2lc/ctr] TPU_HOST_BOUNDS=1,1,1 [pod/dra-tpu-example-59b8785697-tm2lc/ctr] TPU_TOPOLOGY_ALT=false [pod/dra-tpu-example-59b8785697-tm2lc/ctr] TPU_DEVICE_0_RESOURCE_CLAIM=77e68f15-fa2f-4109-9a14-6c91da1a38d3這些步驟的輸出內容表示節點集區中的所有 TPU 都已分配給 Pod。