Mengalokasikan perangkat secara dinamis ke workload dengan DRA


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

  1. 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
    
  2. Buat ResourceClaimTemplate:

    kubectl create -f claim-template.yaml
    
  3. Untuk 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: ["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"
    
  4. Men-deploy workload:

    kubectl create -f dra-gpu-example.yaml
    

TPU

  1. 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 setiap ResourceClaim.

  2. Buat ResourceClaimTemplate:

    kubectl create -f claim-template.yaml
    
  3. Untuk 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"
    
  4. 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

  1. 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
    
  2. Untuk mendapatkan detail selengkapnya tentang hardware yang ditetapkan ke Pod, jalankan perintah berikut:

    kubectl describe resourceclaims RESOURCECLAIM
    

    Ganti RESOURCECLAIM dengan nama lengkap ResourceClaim 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>
    
  3. 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

  1. 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
    
  2. Untuk mendapatkan detail selengkapnya tentang hardware yang ditetapkan ke Pod, jalankan perintah berikut:

    kubectl describe resourceclaims RESOURCECLAIM -o yaml
    

    Ganti RESOURCECLAIM dengan nama lengkap ResourceClaim 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
    
  3. 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.

Langkah berikutnya