Geräte mit DRA dynamisch Arbeitslasten zuweisen

Mit der dynamischen Ressourcenzuweisung (Dynamic Resource Allocation, DRA) können Sie Geräte flexibel für Ihre Google Kubernetes Engine-Arbeitslasten (GKE) anfordern. In diesem Dokument wird beschrieben, wie Sie ein ResourceClaimTemplate erstellen, um Geräte anzufordern, und dann eine Arbeitslast erstellen, um zu beobachten, wie Kubernetes die Geräte flexibel Ihren Pods zuweist.

Dieses Dokument richtet sich an Anwendungsoperatoren und Data Engineers, die Arbeitslasten wie KI/ML oder Hochleistungs-Computing (HPC) ausführen.

Geräte mit DRA anfordern

Wenn Sie Ihre GKE-Infrastruktur für DRA einrichten, erstellen die DRA-Treiber auf Ihren Knoten DeviceClass-Objekte im Cluster. Eine DeviceClass definiert eine Kategorie von Geräten, z. B. GPUs, die für Arbeitslasten angefordert werden können. Ein Plattformadministrator kann optional zusätzliche DeviceClasses bereitstellen, die einschränken, welche Geräte Sie in bestimmten Arbeitslasten anfordern können.

Wenn Sie Geräte innerhalb einer DeviceClass anfordern möchten, erstellen Sie eines der folgenden Objekte:

  • ResourceClaim: Mit einem ResourceClaim kann ein Pod oder ein Nutzer Hardware-Ressourcen anfordern, indem er nach bestimmten Parametern innerhalb einer DeviceClass filtert.
  • ResourceClaimTemplate: Eine ResourceClaimTemplate definiert eine Vorlage, die Pods verwenden können, um automatisch neue ResourceClaims pro Pod zu erstellen.

Weitere Informationen zu ResourceClaims und ResourceClaimTemplates finden Sie unter Wann sollten ResourceClaims und ResourceClaimTemplates verwendet werden?.

In den Beispielen auf dieser Seite wird eine einfache ResourceClaimTemplate verwendet, um die angegebene Gerätekonfiguration anzufordern. Weitere Informationen zu allen Feldern, die Sie angeben können, finden Sie in der API-Referenz für ResourceClaimTemplate.

Beschränkungen

  • Die automatische Knotenbereitstellung wird nicht unterstützt.
  • Autopilot-Cluster unterstützen DRA nicht.
  • Die folgenden GPU-Freigabefunktionen können nicht verwendet werden:
    • GPUs mit Zeitfreigabe
    • GPUs mit mehreren Instanzen
    • Multi-Process Service (MPS)

Voraussetzungen

Wenn Sie DRA verwenden möchten, muss Ihre GKE-Version mindestens Version 1.34 sein.

Außerdem sollten Sie mit den folgenden Anforderungen und Einschränkungen vertraut sein:

Hinweise

Führen Sie die folgenden Aufgaben aus, bevor Sie beginnen:

  • Aktivieren Sie die Google Kubernetes Engine API.
  • Google Kubernetes Engine API aktivieren
  • Wenn Sie die Google Cloud CLI für diesen Task verwenden möchten, müssen Sie die gcloud CLI installieren und dann initialisieren. Wenn Sie die gcloud CLI bereits installiert haben, rufen Sie die neueste Version mit dem Befehl gcloud components update ab. In früheren gcloud CLI-Versionen werden die Befehle in diesem Dokument möglicherweise nicht unterstützt.

DRA zum Bereitstellen von Arbeitslasten verwenden

Wenn Sie die Zuweisung von Geräten pro Pod anfordern möchten, erstellen Sie ein ResourceClaimTemplate mit der gewünschten Gerätekonfiguration, z. B. GPUs eines bestimmten Typs. Wenn Sie eine Arbeitslast bereitstellen, die auf das ResourceClaimTemplate verweist, erstellt Kubernetes ResourceClaims für jeden Pod in der Arbeitslast basierend auf dem ResourceClaimTemplate. Kubernetes weist die angeforderten Ressourcen zu und plant die Pods auf entsprechenden Knoten.

Wenn Sie Geräte in einem Arbeitslast mit DRA anfordern möchten, wählen Sie eine der folgenden Optionen aus:

GPU

  1. Speichern Sie das folgende Manifest als 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
    
  2. Erstellen Sie das ResourceClaimTemplate:

    kubectl create -f claim-template.yaml
    
  3. Speichern Sie zum Erstellen einer Arbeitslast, die auf die ResourceClaimTemplate verweist, das folgende Manifest als 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"
    
  4. Arbeitslast bereitstellen:

    kubectl create -f dra-gpu-example.yaml
    

TPU

  1. Speichern Sie das folgende Manifest als 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
    

    Mit dieser ResourceClaimTemplate wird angefordert, dass GKE jedem ResourceClaim einen gesamten TPU-Knotenpool zuweist.

  2. Erstellen Sie das ResourceClaimTemplate:

    kubectl create -f claim-template.yaml
    
  3. Speichern Sie zum Erstellen einer Arbeitslast, die auf die ResourceClaimTemplate verweist, das folgende Manifest als 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. Arbeitslast bereitstellen:

    kubectl create -f dra-tpu-example.yaml
    

Hardwarezuweisung prüfen

Sie können prüfen, ob Ihren Arbeitslasten Hardware zugewiesen wurde, indem Sie den ResourceClaim oder die Logs für Ihren Pod ansehen. Wählen Sie eine der folgenden Optionen aus, um die Zuweisung für GPUs oder TPUs zu prüfen:

GPU

  1. Rufen Sie den ResourceClaim ab, der mit der bereitgestellten Arbeitslast verknüpft ist:

    kubectl get resourceclaims
    

    Die Ausgabe sieht etwa so aus:

    NAME                                               STATE                AGE
    dra-gpu-example-64b75dc6b-x8bd6-single-gpu-jwwdh   allocated,reserved   9s
    
  2. Weitere Informationen zur dem Pod zugewiesenen Hardware abrufen:

    kubectl describe resourceclaims RESOURCECLAIM
    

    Ersetzen Sie RESOURCECLAIM durch den vollständigen Namen des ResourceClaim, den Sie aus der Ausgabe des vorherigen Schritts erhalten haben.

    Die Ausgabe sieht etwa so aus:

       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>
       ```
    
  3. Rufen Sie die Logs für die bereitgestellte Arbeitslast ab:

    kubectl logs deployment/dra-gpu-example --all-pods=true
    

    Die Ausgabe sieht etwa so aus:

    [pod/dra-gpu-example-64b75dc6b-x8bd6/ctr] GPU 0: Tesla T4 (UUID: GPU-2087ac7a-f781-8cd7-eb6b-b00943cc13ef)
    

    Die Ausgabe dieser Schritte zeigt, dass GKE dem Container eine GPU zugewiesen hat.

TPU

  1. Rufen Sie den ResourceClaim ab, der mit der bereitgestellten Arbeitslast verknüpft ist:

    kubectl get resourceclaims | grep dra-tpu-example
    

    Die Ausgabe sieht etwa so aus:

    NAME                                               STATE                AGE
    dra-tpu-example-64b75dc6b-x8bd6-all-tpus-jwwdh     allocated,reserved   9s
    
  2. Weitere Informationen zur dem Pod zugewiesenen Hardware abrufen:

    kubectl describe resourceclaims RESOURCECLAIM -o yaml
    

    Ersetzen Sie RESOURCECLAIM durch den vollständigen Namen des ResourceClaim, den Sie aus der Ausgabe des vorherigen Schritts erhalten haben.

    Die Ausgabe sieht etwa so aus:

    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. Rufen Sie die Logs für die bereitgestellte Arbeitslast ab:

    kubectl logs deployment/dra-tpu-example --all-pods=true | grep "TPU"
    

    Die Ausgabe sieht etwa so aus:

    [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
    

    Die Ausgabe dieser Schritte zeigt, dass alle TPUs in einem Knotenpool dem Pod zugewiesen wurden.

Nächste Schritte