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
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
Erstellen Sie
ResourceClaimTemplate
:kubectl create -f claim-template.yaml
Speichern Sie zum Erstellen eines Workloads, der auf das
ResourceClaimTemplate
verweist, das folgende Manifest alsdra-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"
Arbeitslast bereitstellen:
kubectl create -f dra-gpu-example.yaml
TPU
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 jedemResourceClaim
einen gesamten TPU-Knotenpool zuweist.Erstellen Sie
ResourceClaimTemplate
:kubectl create -f claim-template.yaml
Speichern Sie zum Erstellen eines Workloads, der auf das
ResourceClaimTemplate
verweist, das folgende Manifest alsdra-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"
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
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
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 derResourceClaim
, 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>
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
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
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 derResourceClaim
, 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
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.