Halaman ini menjelaskan cara men-deploy workload alokasi resource dinamis (DRA)
di cluster Google Kubernetes Engine Anda. Di halaman ini, Anda akan membuat ResourceClaimTemplate
untuk meminta hardware dengan DRA, lalu men-deploy beban kerja dasar untuk menunjukkan
cara Kubernetes mengalokasikan hardware secara fleksibel di Pod Anda.
Halaman ini ditujukan untuk Operator aplikasi dan Data engineer yang menjalankan workload seperti AI/ML atau komputasi berperforma tinggi (HPC).
Tentang alokasi resource dinamis
DRA adalah fitur Kubernetes bawaan yang memungkinkan Anda secara fleksibel meminta, mengalokasikan, dan membagikan hardware di cluster Anda di antara Pod dan container. Untuk mengetahui informasi selengkapnya, lihat Tentang alokasi resource dinamis.
Tentang meminta perangkat dengan DRA
Saat Anda menyiapkan infrastruktur GKE untuk DRA, driver DRA
di node Anda akan membuat objek DeviceClass
di cluster.
DeviceClass menentukan kategori perangkat, seperti GPU, yang tersedia untuk diminta oleh
workload.
Administrator platform dapat secara opsional men-deploy DeviceClass tambahan yang membatasi perangkat yang dapat Anda minta dalam workload tertentu.
Untuk meminta perangkat dalam DeviceClass
, Anda membuat salah satu objek berikut:
ResourceClaim
: ResourceClaim memungkinkan Pod atau pengguna meminta resource hardware dengan memfilter parameter tertentu dalam DeviceClass.ResourceClaimTemplate
: ResourceClaimTemplate menentukan template yang dapat digunakan Pod untuk membuat ResourceClaim per-Pod baru secara otomatis.
Untuk mengetahui informasi selengkapnya tentang objek ResourceClaim
dan ResourceClaimTemplate
, lihat Kapan harus menggunakan ResourceClaims
dan ResourceClaimTemplates
.
Contoh di halaman ini menggunakan ResourceClaimTemplate
dasar untuk meminta
konfigurasi perangkat yang ditentukan. Untuk mengetahui informasi yang lebih mendetail, lihat
dokumentasi Kubernetes ResourceClaimTemplateSpec
.
Batasan
- Penyediaan otomatis node tidak didukung.
- Cluster Autopilot tidak mendukung DRA.
- Anda tidak dapat menggunakan fitur berbagi GPU berikut:
- GPU berbagi waktu
- GPU multi-instance
- Layanan Multi-proses (MPS)
Persyaratan
Untuk menggunakan DRA, versi GKE Anda harus versi 1.32.1-gke.1489001 atau yang lebih baru.
Anda juga harus memahami persyaratan dan batasan berikut:
Sebelum memulai
Sebelum memulai, pastikan Anda telah melakukan tugas berikut:
- Aktifkan Google Kubernetes Engine API. Aktifkan Google Kubernetes Engine API
- Jika ingin menggunakan Google Cloud CLI untuk tugas ini,
instal lalu
lakukan inisialisasi
gcloud CLI. Jika sebelumnya Anda telah menginstal gcloud CLI, dapatkan versi terbaru dengan menjalankan
gcloud components update
.
Menggunakan DRA untuk men-deploy workload
Untuk meminta alokasi perangkat per-Pod, Anda harus membuat ResourceClaimTemplate
terlebih dahulu
yang menghasilkan ResourceClaim
untuk menjelaskan permintaan Anda atas GPU atau TPU,
yang digunakan Kubernetes sebagai template untuk membuat objek ResourceClaim
baru untuk setiap Pod dalam workload.
Saat Anda menentukan ResourceClaimTemplate
dalam workload, Kubernetes
mengalokasikan resource yang diminta dan menjadwalkan Pod pada node
yang sesuai.
GPU
Simpan manifes berikut sebagai
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
Buat
ResourceClaimTemplate
:kubectl create -f claim-template.yaml
Untuk membuat workload yang mereferensikan
ResourceClaimTemplate
, simpan manifes berikut sebagaidra-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"
Men-deploy workload:
kubectl create -f dra-gpu-example.yaml
TPU
Simpan manifes berikut sebagai
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
ini meminta GKE mengalokasikan seluruh node pool TPU ke setiapResourceClaim
.Buat
ResourceClaimTemplate
:kubectl create -f claim-template.yaml
Untuk membuat workload yang mereferensikan
ResourceClaimTemplate
, simpan manifes berikut sebagaidra-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"
Men-deploy workload:
kubectl create -f dra-tpu-example.yaml
Memverifikasi alokasi hardware
Anda dapat memverifikasi bahwa workload Anda telah dialokasikan hardware dengan memeriksa ResourceClaim
atau dengan melihat log untuk Pod Anda.
GPU
Dapatkan
ResourceClaim
yang terkait dengan workload yang Anda deploy:kubectl get resourceclaims
Output akan terlihat seperti berikut:
NAME STATE AGE dra-gpu-example-64b75dc6b-x8bd6-single-gpu-jwwdh allocated,reserved 9s
Untuk mendapatkan detail selengkapnya tentang hardware yang ditetapkan ke Pod, jalankan perintah berikut:
kubectl describe resourceclaims RESOURCECLAIM
Ganti
RESOURCECLAIM
dengan nama lengkapResourceClaim
yang Anda dapatkan dari output langkah sebelumnya.Output akan terlihat seperti berikut:
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>
Untuk mendapatkan log workload yang Anda deploy, jalankan perintah berikut:
kubectl logs deployment/dra-gpu-example --all-pods=true | grep "GPU"
Output akan terlihat seperti berikut:
[pod/dra-gpu-example-64b75dc6b-x8bd6/ctr] GPU 0: Tesla T4 (UUID: GPU-2087ac7a-f781-8cd7-eb6b-b00943cc13ef)
Output langkah-langkah ini menunjukkan bahwa GKE mengalokasikan satu GPU ke Pod.
TPU
Dapatkan
ResourceClaim
yang terkait dengan workload yang Anda deploy:kubectl get resourceclaims | grep dra-tpu-example
Output akan terlihat seperti berikut:
NAME STATE AGE dra-tpu-example-64b75dc6b-x8bd6-all-tpus-jwwdh allocated,reserved 9s
Untuk mendapatkan detail selengkapnya tentang hardware yang ditetapkan ke Pod, jalankan perintah berikut:
kubectl describe resourceclaims RESOURCECLAIM -o yaml
Ganti
RESOURCECLAIM
dengan nama lengkapResourceClaim
yang Anda dapatkan dari output langkah sebelumnya.Output akan terlihat seperti berikut:
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
Untuk mendapatkan log workload yang Anda deploy, jalankan perintah berikut:
kubectl logs deployment/dra-tpu-example --all-pods=true | grep "TPU"
Output akan terlihat seperti berikut:
[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
Output dari langkah-langkah ini menunjukkan bahwa semua TPU dalam node pool dialokasikan ke Pod.