Anda dapat secara fleksibel meminta perangkat untuk workload Google Kubernetes Engine (GKE) dengan menggunakan alokasi resource dinamis (DRA). Dokumen ini menunjukkan cara membuat ResourceClaimTemplate untuk meminta perangkat, lalu membuat workload untuk mengamati cara Kubernetes mengalokasikan perangkat secara fleksibel ke Pod Anda.
Dokumen ini ditujukan untuk Operator aplikasi dan Data engineer yang menjalankan workload seperti AI/ML atau komputasi berperforma tinggi (HPC).
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 ResourceClaim dan ResourceClaimTemplate, lihat Kapan harus menggunakan ResourceClaim dan ResourceClaimTemplate.
Contoh di halaman ini menggunakan ResourceClaimTemplate dasar untuk meminta konfigurasi perangkat yang ditentukan. Untuk mengetahui informasi selengkapnya tentang semua kolom yang dapat Anda tentukan, lihat Referensi API ResourceClaimTemplate.
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.34 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 perintah
gcloud components update. gcloud CLI versi sebelumnya mungkin tidak mendukung menjalankan perintah dalam dokumen ini.
Menggunakan DRA untuk men-deploy workload
Untuk meminta alokasi perangkat per-Pod, Anda membuat ResourceClaimTemplate yang memiliki konfigurasi perangkat yang diminta, seperti GPU dari jenis tertentu. Saat Anda men-deploy workload yang mereferensikan ResourceClaimTemplate, Kubernetes membuat ResourceClaim untuk setiap Pod dalam workload berdasarkan ResourceClaimTemplate. Kubernetes mengalokasikan resource yang diminta dan menjadwalkan Pod di node yang sesuai.
Untuk meminta perangkat dalam beban kerja dengan DRA, pilih salah satu opsi berikut:
GPU
Simpan manifes berikut sebagai
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: 1Buat ResourceClaimTemplate:
kubectl create -f claim-template.yamlUntuk membuat workload yang mereferensikan ResourceClaimTemplate, simpan manifes berikut sebagai
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"Men-deploy workload:
kubectl create -f dra-gpu-example.yaml
TPU
Simpan manifes berikut sebagai
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: AllResourceClaimTemplate ini meminta semua TPU, sehingga semua TPU pada node dialokasikan ke setiap ResourceClaim yang dihasilkan.
Buat ResourceClaimTemplate:
kubectl create -f claim-template.yamlUntuk membuat workload yang mereferensikan ResourceClaimTemplate, simpan manifes berikut sebagai
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"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. Untuk memverifikasi alokasi GPU atau TPU, pilih salah satu opsi berikut:
GPU
Dapatkan ResourceClaim yang terkait dengan workload yang Anda deploy:
kubectl get resourceclaimsOutputnya mirip dengan hal berikut ini:
NAME STATE AGE dra-gpu-example-64b75dc6b-x8bd6-single-gpu-jwwdh allocated,reserved 9sDapatkan detail selengkapnya tentang hardware yang ditetapkan ke Pod:
kubectl describe resourceclaims RESOURCECLAIMGanti
RESOURCECLAIMdengan nama lengkap ResourceClaim yang Anda dapatkan dari output langkah sebelumnya.Outputnya mirip dengan hal berikut ini:
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> ```Dapatkan log untuk workload yang Anda deploy:
kubectl logs deployment/dra-gpu-example --all-pods=trueOutputnya mirip dengan hal berikut ini:
[pod/dra-gpu-example-64b75dc6b-x8bd6/ctr] GPU 0: Tesla T4 (UUID: GPU-2087ac7a-f781-8cd7-eb6b-b00943cc13ef)Output dari langkah-langkah ini menunjukkan bahwa GKE mengalokasikan satu GPU ke container.
TPU
Dapatkan ResourceClaim yang terkait dengan workload yang Anda deploy:
kubectl get resourceclaims | grep dra-tpu-exampleOutputnya mirip dengan hal berikut ini:
NAME STATE AGE dra-tpu-example-64b75dc6b-x8bd6-all-tpus-jwwdh allocated,reserved 9sDapatkan detail selengkapnya tentang hardware yang ditetapkan ke Pod:
kubectl describe resourceclaims RESOURCECLAIM -o yamlGanti
RESOURCECLAIMdengan nama lengkap ResourceClaim yang Anda dapatkan dari output langkah sebelumnya.Outputnya mirip dengan hal berikut ini:
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-4c3eea5fda3fDapatkan log untuk workload yang Anda deploy:
kubectl logs deployment/dra-tpu-example --all-pods=true | grep "TPU"Outputnya mirip dengan hal berikut ini:
[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-6c91da1a38d3Output langkah-langkah ini menunjukkan bahwa semua TPU dalam node pool dialokasikan ke Pod.