本頁說明如何在 Google Kubernetes Engine 叢集上部署動態資源分配 (DRA) 工作負載。在本頁面中,您將建立 ResourceClaimTemplate
,透過 DRA 要求硬體,然後部署基本工作負載,示範 Kubernetes 如何在 Pod 上彈性分配硬體。
本頁內容適用於執行 AI/機器學習或高效能運算 (HPC) 等工作負載的應用程式運算子和資料工程師。
關於動態資源分配
DRA 是 Kubernetes 內建功能,可讓您在叢集中,彈性地要求、分配及共用 Pod 和容器之間的硬體。詳情請參閱「關於動態資源分配」。
關於使用 DRA 要求裝置
為 DRA 設定 GKE 基礎架構時,節點上的 DRA 驅動程式會在叢集中建立 DeviceClass
物件。DeviceClass 定義可供工作負載要求的裝置類別,例如 GPU。平台管理員可以視需要部署其他 DeviceClass,限制您在特定工作負載中可要求的裝置。
如要在 DeviceClass
中要求裝置,請建立下列其中一個物件:
ResourceClaim
: Pod 或使用者可透過 ResourceClaim,在 DeviceClass 中篩選特定參數,要求硬體資源。ResourceClaimTemplate
: ResourceClaimTemplate 定義 Pod 可用來自動建立每個 Pod 的新 ResourceClaim 的範本。
如要進一步瞭解 ResourceClaim
和 ResourceClaimTemplate
物件,請參閱「何時使用 ResourceClaims
和 ResourceClaimTemplates
」。
本頁面的範例會使用基本 ResourceClaimTemplate
要求指定的裝置設定。如需詳細資訊,請參閱 ResourceClaimTemplateSpec
Kubernetes 說明文件。
限制
- 不支援節點自動佈建。
- Autopilot 叢集不支援 DRA。
- 您無法使用下列 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
,取得最新版本。
使用 DRA 部署工作負載
如要要求每個 Pod 的裝置分配,請先建立 ResourceClaimTemplate
,產生 ResourceClaim
來描述 GPU 或 TPU 的要求,Kubernetes 會將其做為範本,為工作負載中的每個 Pod 建立新的 ResourceClaim
物件。在工作負載中指定 ResourceClaimTemplate
時,Kubernetes 會分配要求的資源,並在對應節點上排程 Pod。
GPU
將下列資訊清單儲存為
claim-template.yaml
:apiVersion: resource.k8s.io/v1beta1 kind: ResourceClaimTemplate metadata: name: gpu-claim-template spec: spec: devices: requests: - name: single-gpu 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: ["while [ 1 ]; do date; echo $(nvidia-smi -L || echo Waiting...); sleep 60; done"] 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/v1beta1 kind: ResourceClaimTemplate metadata: name: tpu-claim-template spec: spec: devices: requests: - name: all-tpus deviceClassName: tpu.google.com allocationMode: All
這項
ResourceClaimTemplate
要求 GKE 將整個 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
取得與您部署的工作負載相關聯的
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-64b75dc6b-x8bd6-single-gpu-jwwdh Namespace: default Labels: <none> Annotations: resource.kubernetes.io/pod-claim-name: single-gpu API Version: resource.k8s.io/v1beta1 Kind: ResourceClaim Metadata: Creation Timestamp: 2025-03-31T17:11:37Z Finalizers: resource.kubernetes.io/delete-protection Generate Name: dra-gpu-example-64b75dc6b-x8bd6-single-gpu- Owner References: API Version: v1 Block Owner Deletion: true Controller: true Kind: Pod Name: dra-gpu-example-64b75dc6b-x8bd6 UID: cb3cb1db-e62a-4961-9967-cdc7d599105b Resource Version: 12953269 UID: 3e0c3925-e15a-40e9-b552-d03610fff040 Spec: Devices: Requests: Allocation Mode: ExactCount Count: 1 Device Class Name: gpu.nvidia.com Name: single-gpu Status: Allocation: Devices: Results: Admin Access: <nil> Device: gpu-0 Driver: gpu.nvidia.com Pool: gke-cluster-gpu-pool-11026a2e-zgt1 Request: single-gpu Node Selector: # lines omitted for clarity Reserved For: Name: dra-gpu-example-64b75dc6b-x8bd6 Resource: pods UID: cb3cb1db-e62a-4961-9967-cdc7d599105b Events: <none>
如要取得已部署工作負載的記錄,請執行下列指令:
kubectl logs deployment/dra-gpu-example --all-pods=true | grep "GPU"
輸出應會如下所示:
[pod/dra-gpu-example-64b75dc6b-x8bd6/ctr] GPU 0: Tesla T4 (UUID: GPU-2087ac7a-f781-8cd7-eb6b-b00943cc13ef)
這些步驟的輸出內容會顯示 GKE 將一個 GPU 分配給 Pod。
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。