Geräte mit DRA dynamisch Arbeitslasten zuweisen


Auf dieser Seite wird erläutert, wie Sie Arbeitslasten mit dynamischer Ressourcenzuweisung (Dynamic Resource Allocation, DRA) in Ihren Google Kubernetes Engine-Clustern bereitstellen. Auf dieser Seite erstellen Sie eine ResourceClaimTemplate, um Hardware mit DRA anzufordern, und stellen dann eine einfache Arbeitslast bereit, um zu demonstrieren, wie Kubernetes Hardware flexibel für Ihre Pods zuweist.

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

Dynamische Ressourcenzuweisung

DRA ist eine integrierte Kubernetes-Funktion, mit der Sie Hardware in Ihrem Cluster flexibel für Pods und Container anfordern, zuweisen und freigeben können. Weitere Informationen finden Sie unter Dynamische Ressourcenzuweisung.

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 in einem 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 innerhalb einer DeviceClass nach bestimmten Parametern filtert.
  • ResourceClaimTemplate: Eine ResourceClaimTemplate definiert eine Vorlage, die Pods verwenden können, um automatisch neue ResourceClaims pro Pod zu erstellen.

Weitere Informationen zu ResourceClaim- und ResourceClaimTemplate-Objekten finden Sie unter Wann sollten ResourceClaims und ResourceClaimTemplates verwendet werden?.

In den Beispielen auf dieser Seite wird ein einfaches ResourceClaimTemplate verwendet, um die angegebene Gerätekonfiguration anzufordern. Weitere Informationen finden Sie in der ResourceClaimTemplateSpec-Dokumentation zu Kubernetes.

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.32.1-gke.1489001 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 diese Aufgabe 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 gcloud components update ab.

DRA zum Bereitstellen von Arbeitslasten verwenden

Wenn Sie die Gerätezuweisung pro Pod anfordern möchten, erstellen Sie zuerst ein ResourceClaimTemplate, das ein ResourceClaim erzeugt, um Ihre Anfrage für GPUs oder TPUs zu beschreiben. Kubernetes verwendet dieses als Vorlage, um für jeden Pod in einer Arbeitslast neue ResourceClaim-Objekte zu erstellen. Wenn Sie ResourceClaimTemplate in einer Arbeitslast angeben, weist Kubernetes die angeforderten Ressourcen zu und plant die Pods auf entsprechenden Knoten.

GPU

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

    kubectl create -f claim-template.yaml
    
  3. Speichern Sie zum Erstellen eines Workloads, der auf das 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: ["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. Arbeitslast bereitstellen:

    kubectl create -f dra-gpu-example.yaml
    

TPU

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

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

  2. Erstellen Sie ResourceClaimTemplate:

    kubectl create -f claim-template.yaml
    
  3. Speichern Sie zum Erstellen eines Workloads, der auf das 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 ResourceClaim aufrufen oder sich die Logs für Ihren Pod ansehen.

GPU

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

    kubectl get resourceclaims
    

    Die Ausgabe sollte in etwa so aussehen:

    NAME                                               STATE                AGE
    dra-gpu-example-64b75dc6b-x8bd6-single-gpu-jwwdh   allocated,reserved   9s
    
  2. Führen Sie den folgenden Befehl aus, um weitere Details zur Hardware abzurufen, die dem Pod zugewiesen ist:

    kubectl describe resourceclaims RESOURCECLAIM
    

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

    Die Ausgabe sollte in etwa so aussehen:

    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. Führen Sie den folgenden Befehl aus, um Logs für die bereitgestellte Arbeitslast abzurufen:

    kubectl logs deployment/dra-gpu-example --all-pods=true | grep "GPU"
    

    Die Ausgabe sollte in etwa so aussehen:

    [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 Pod eine GPU zugewiesen hat.

TPU

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

    kubectl get resourceclaims | grep dra-tpu-example
    

    Die Ausgabe sollte in etwa so aussehen:

    NAME                                               STATE                AGE
    dra-tpu-example-64b75dc6b-x8bd6-all-tpus-jwwdh     allocated,reserved   9s
    
  2. Führen Sie den folgenden Befehl aus, um weitere Details zur Hardware abzurufen, die dem Pod zugewiesen ist:

    kubectl describe resourceclaims RESOURCECLAIM -o yaml
    

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

    Die Ausgabe sollte in etwa so aussehen:

    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. Führen Sie den folgenden Befehl aus, um Logs für die bereitgestellte Arbeitslast abzurufen:

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

    Die Ausgabe sollte in etwa so aussehen:

    [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