GKE-Infrastruktur für DRA-Arbeitslasten vorbereiten

In diesem Dokument wird beschrieben, wie Sie Ihre Google Kubernetes Engine-Infrastruktur (GKE) für die Unterstützung der dynamischen Ressourcenzuweisung (Dynamic Resource Allocation, DRA) einrichten. Die Einrichtungsschritte umfassen das Erstellen von Knotenpools, die GPUs oder TPUs verwenden, und das Installieren von DRA-Treibern in Ihrem Cluster. Dieses Dokument richtet sich an Plattformadministratoren, die die Komplexität und den Aufwand für die Einrichtung von Infrastruktur mit spezialisierten Hardwaregeräten reduzieren möchten.

Beschränkungen

  • Die automatische Knotenbereitstellung wird nicht unterstützt.
  • Autopilot-Cluster unterstützen DRA nicht.
  • Die automatische Installation von GPU-Treibern wird mit DRA nicht unterstützt.
  • Die folgenden GPU-Freigabefunktionen können nicht verwendet werden:
    • GPUs mit Zeitfreigabe
    • GPUs mit mehreren Instanzen
    • Multi-Process Service (MPS)
  • Für TPUs müssen Sie die v1beta1- und v1beta2-Versionen der DRA API-Arten aktivieren. Diese Einschränkung gilt nicht für GPUs, die v1-API-Versionen verwenden können.

Voraussetzungen

Damit Sie DRA verwenden können, muss auf Ihrem GKE-Cluster die Version 1.34 oder höher ausgeführt werden.

Außerdem sollten Sie sich mit den folgenden Anforderungen und Einschränkungen vertraut machen, je nachdem, welche Hardware Sie verwenden möchten:

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.
  • Sie benötigen einen GKE-Standardcluster mit Version 1.34 oder höher. Sie können auch einen regionalen Cluster erstellen.

  • Wenn Sie Cloud Shell nicht verwenden, installieren Sie die Helm-Befehlszeile:

    curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
    chmod 700 get_helm.sh
    ./get_helm.sh
    
  • Wenn Sie DRA für TPUs verwenden möchten, aktivieren Sie die v1beta1- und v1beta2-Versionen der DRA-API-Arten:

    gcloud container clusters update CLUSTER_NAME \
        --location=CONTROL_PLANE_LOCATION \
        --enable-kubernetes-unstable-apis="resource.k8s.io/v1beta1/deviceclasses,resource.k8s.io/v1beta1/resourceclaims,resource.k8s.io/v1beta1/resourceclaimtemplates,resource.k8s.io/v1beta1/resourceslices,resource.k8s.io/v1beta2/deviceclasses,resource.k8s.io/v1beta2/resourceclaims,resource.k8s.io/v1beta2/resourceclaimtemplates,resource.k8s.io/v1beta2/resourceslices"
    

GKE-Knotenpool mit GPUs oder TPUs erstellen

In GKE können Sie DRA sowohl mit GPUs als auch mit TPUs verwenden. Die Konfigurationseinstellungen für den Knotenpool, z. B. Maschinentyp, Beschleunigertyp, Anzahl, Knotenbetriebssystem und Knotenstandorte, hängen von Ihren Anforderungen ab. Wählen Sie eine der folgenden Optionen aus, um einen Knotenpool zu erstellen, der DRA unterstützt:

GPU

Wenn Sie DRA für GPUs verwenden möchten, müssen Sie beim Erstellen des Knotenpools Folgendes tun:

  • Deaktivieren Sie die automatische Installation von GPU-Treibern, indem Sie die Option gpu-driver-version=disabled im Flag --accelerator angeben, wenn Sie GPUs für einen Knotenpool konfigurieren.
  • Deaktivieren Sie das GPU-Geräte-Plug-in, indem Sie das Knotenlabel gke-no-default-nvidia-gpu-device-plugin=true hinzufügen.
  • Lassen Sie das DRA-Treiber-DaemonSet auf den Knoten ausführen, indem Sie das Knotenlabel nvidia.com/gpu.present=true hinzufügen.

So erstellen Sie einen GPU-Knotenpool für DRA:

  1. Erstellen Sie einen Knotenpool mit der erforderlichen Hardware. Im folgenden Beispiel wird ein Knotenpool mit einer g2-standard-24-Instanz unter Container-Optimized OS mit zwei L4-GPUs erstellt.

    gcloud container node-pools create NODEPOOL_NAME \
        --cluster=CLUSTER_NAME \
        --location=CONTROL_PLANE_LOCATION \
        --machine-type "g2-standard-24" \
        --accelerator "type=nvidia-l4,count=2,gpu-driver-version=disabled" \
        --num-nodes "1" \
        --node-labels=gke-no-default-nvidia-gpu-device-plugin=true,nvidia.com/gpu.present=true
    

    Ersetzen Sie Folgendes:

    • NODEPOOL_NAME: Der Name des Knotenpools.
    • CLUSTER_NAME: Der Name Ihres Clusters.
    • CONTROL_PLANE_LOCATION: Die Region oder Zone der Clustersteuerungsebene, z. B. us-central1 oder us-central1-a.
  2. Installieren Sie die Treiber manuell auf Ihren Container-Optimized OS- oder Ubuntu-Knoten. Eine ausführliche Anleitung finden Sie unter NVIDIA-GPU-Treiber manuell installieren.

TPU

Wenn Sie DRA für TPUs verwenden möchten, müssen Sie das TPU-Geräte-Plug-in deaktivieren, indem Sie das Knotenlabel gke-no-default-tpu-device-plugin=true hinzufügen. Im folgenden Beispiel wird ein TPU Trillium-Knotenpool mit DRA-Unterstützung erstellt:

gcloud container node-pools create NODEPOOL_NAME \
    --cluster CLUSTER_NAME --num-nodes 1 \
    --location=CONTROL_PLANE_LOCATION \
    --node-labels "gke-no-default-tpu-device-plugin=true,gke-no-default-tpu-dra-plugin=true" \
    --machine-type=ct6e-standard-8t

Ersetzen Sie Folgendes:

  • NODEPOOL_NAME: Der Name des Knotenpools.
  • CLUSTER_NAME: Der Name Ihres Clusters.
  • CONTROL_PLANE_LOCATION: Die Region oder Zone der Clustersteuerungsebene, z. B. us-central1 oder us-central1-a.

DRA-Treiber installieren

GPU

  1. Rufen Sie das Helm-Diagramm mit dem NVIDIA DRA-Treiber ab und aktualisieren Sie es:

    helm repo add nvidia https://helm.ngc.nvidia.com/nvidia \
        && helm repo update
    
  2. Installieren Sie den NVIDIA DRA-Treiber mit der Version 25.3.2:

    helm install nvidia-dra-driver-gpu nvidia/nvidia-dra-driver-gpu \
        --version="25.3.2" --create-namespace --namespace=nvidia-dra-driver-gpu \
        --set nvidiaDriverRoot="/home/kubernetes/bin/nvidia/" \
        --set gpuResourcesEnabledOverride=true \
        --set resources.computeDomains.enabled=false \
        --set kubeletPlugin.priorityClassName="" \
        --set 'kubeletPlugin.tolerations[0].key=nvidia.com/gpu' \
        --set 'kubeletPlugin.tolerations[0].operator=Exists' \
        --set 'kubeletPlugin.tolerations[0].effect=NoSchedule'
    

    Verwenden Sie für Ubuntu-Knoten den Verzeichnispfad nvidiaDriverRoot="/opt/nvidia".

TPU

  1. Klonen Sie das Repository ai-on-gke, um auf die Helm-Diagramme zuzugreifen, die die DRA-Treiber für GPUs und TPUs enthalten:

    git clone https://github.com/ai-on-gke/common-infra.git
    
  2. Wechseln Sie in das Verzeichnis, das die Diagramme enthält:

    cd common-infra/common/charts
    
  3. Installieren Sie den TPU DRA-Treiber:

    ./tpu-dra-driver/install-tpu-dra-driver.sh
    

Prüfen, ob Ihre Infrastruktur für DRA bereit ist

  1. Wählen Sie eine der folgenden Optionen aus, um zu prüfen, ob Ihre DRA-Treiber-Pods ausgeführt werden:

    GPU

    kubectl get pods -n nvidia-dra-driver-gpu
    

    Die Ausgabe sieht etwa so aus:

    NAME                                         READY   STATUS    RESTARTS   AGE
    nvidia-dra-driver-gpu-kubelet-plugin-52cdm   1/1     Running   0          46s
    

    TPU

    kubectl get pods -n tpu-dra-driver
    
    

    Die Ausgabe sieht etwa so aus:

    NAME                                         READY   STATUS    RESTARTS   AGE
    tpu-dra-driver-kubeletplugin-h6m57           1/1     Running   0          30s
    
  2. Prüfen Sie, ob in ResourceSlice die Hardwaregeräte aufgeführt sind, die Sie hinzugefügt haben:

    kubectl get resourceslices -o yaml
    

    Wenn Sie das Beispiel im vorherigen Abschnitt verwendet haben, sieht die Ausgabe je nach Konfiguration von GPUs oder TPUs in etwa so aus:

    GPU

    apiVersion: v1
    items:
    - apiVersion: resource.k8s.io/v1
      kind: ResourceSlice
      metadata:
      # Multiple lines are omitted here.
      spec:
        devices:
        - attributes:
            architecture:
              string: Ada Lovelace
            brand:
              string: Nvidia
            cudaComputeCapability:
              version: 8.9.0
            cudaDriverVersion:
              version: 13.0.0
            driverVersion:
              version: 580.65.6
            index:
              int: 0
            minor:
              int: 0
            pcieBusID:
              string: "0000:00:03.0"
            productName:
              string: NVIDIA L4
            resource.kubernetes.io/pcieRoot:
              string: pci0000:00
            type:
              string: gpu
            uuid:
              string: GPU-ccc19e5e-e3cd-f911-65c8-89bcef084e3f
          capacity:
            memory:
              value: 23034Mi
          name: gpu-0
        - attributes:
            architecture:
              string: Ada Lovelace
            brand:
              string: Nvidia
            cudaComputeCapability:
              version: 8.9.0
            cudaDriverVersion:
              version: 13.0.0
            driverVersion:
              version: 580.65.6
            index:
              int: 1
            minor:
              int: 1
            pcieBusID:
              string: "0000:00:04.0"
            productName:
              string: NVIDIA L4
            resource.kubernetes.io/pcieRoot:
              string: pci0000:00
            type:
              string: gpu
            uuid:
              string: GPU-f783198d-42f9-7cef-9ea1-bb10578df978
          capacity:
            memory:
              value: 23034Mi
          name: gpu-1
        driver: gpu.nvidia.com
        nodeName: gke-cluster-1-dra-gpu-pool-b56c4961-7vnm
        pool:
          generation: 1
          name: gke-cluster-1-dra-gpu-pool-b56c4961-7vnm
          resourceSliceCount: 1
    kind: List
    metadata:
      resourceVersion: ""
    

    TPU

    apiVersion: v1
    items:
    - apiVersion: resource.k8s.io/v1beta1
      kind: ResourceSlice
      metadata:
        # lines omitted for clarity
      spec:
        devices:
        - basic:
            attributes:
              index:
                int: 0
              tpuGen:
                string: v6e
              uuid:
                string: tpu-54de4859-dd8d-f67e-6f91-cf904d965454
          name: "0"
        - basic:
            attributes:
              index:
                int: 1
              tpuGen:
                string: v6e
              uuid:
                string: tpu-54de4859-dd8d-f67e-6f91-cf904d965454
          name: "1"
        - basic:
            attributes:
              index:
                int: 2
              tpuGen:
                string: v6e
              uuid:
                string: tpu-54de4859-dd8d-f67e-6f91-cf904d965454
          name: "2"
        - basic:
            attributes:
              index:
                int: 3
              tpuGen:
                string: v6e
              uuid:
                string: tpu-54de4859-dd8d-f67e-6f91-cf904d965454
          name: "3"
        driver: tpu.google.com
        nodeName: gke-tpu-b4d4b61b-fwbg
        pool:
          generation: 1
          name: gke-tpu-b4d4b61b-fwbg
          resourceSliceCount: 1
    kind: List
    metadata:
      resourceVersion: ""
    

Nächste Schritte