Prepara la infraestructura de GKE para las cargas de trabajo de DRA

En este documento, se explica cómo configurar tu infraestructura de Google Kubernetes Engine (GKE) para admitir la asignación dinámica de recursos (DRA). Los pasos de configuración incluyen la creación de grupos de nodos que usan GPU o TPU, y la instalación de controladores de DRA en tu clúster. Este documento está dirigido a los administradores de plataformas que desean reducir la complejidad y la sobrecarga de la configuración de la infraestructura con dispositivos de hardware especializados.

Limitaciones

  • No se admite el aprovisionamiento automático de nodos.
  • Los clústeres de Autopilot no admiten DRA.
  • La instalación automática del controlador de GPU no es compatible con DRA.
  • No puedes usar las siguientes funciones de uso compartido de GPU:
    • GPU de tiempo compartido
    • GPU de varias instancias
    • Servicio de varios procesos (MPS)
  • En el caso de las TPU, debes habilitar las versiones v1beta1 y v1beta2 de los tipos de API de DRA. Esta limitación no se aplica a las GPUs, que pueden usar versiones de la API de v1.

Requisitos

Para usar DRA, tu clúster de GKE debe ejecutar la versión 1.34 o una posterior.

También debes conocer los siguientes requisitos y limitaciones, según el tipo de hardware que quieras usar:

Antes de comenzar

Antes de comenzar, asegúrate de haber realizado las siguientes tareas:

  • Habilita la API de Google Kubernetes Engine.
  • Habilitar la API de Google Kubernetes Engine
  • Si deseas usar Google Cloud CLI para esta tarea, instala y, luego, inicializa gcloud CLI. Si ya instalaste gcloud CLI, ejecuta el comando gcloud components update para obtener la versión más reciente. Es posible que las versiones anteriores de gcloud CLI no admitan la ejecución de los comandos que se describen en este documento.
  • Tener un clúster de GKE Standard que ejecute la versión 1.34 o posterior También puedes crear un clúster regional.

  • Si no usas Cloud Shell, instala la CLI de Helm:

    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
    
  • Para usar la DRA en las TPU, habilita las versiones v1beta1 y v1beta2 de los tipos de API de la DRA:

    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"
    

Crea un grupo de nodos de GKE con GPUs o TPUs

En GKE, puedes usar DRA con GPU y TPU. La configuración del grupo de nodos, como el tipo de máquina, el tipo y la cantidad de aceleradores, el sistema operativo del nodo y las ubicaciones de los nodos, depende de tus requisitos. Para crear un grupo de nodos que admita la DRA, selecciona una de las siguientes opciones:

GPU

Para usar DRA para GPUs, debes hacer lo siguiente cuando crees el grupo de nodos:

  • Inhabilita la instalación automática de controladores de GPU especificando la opción gpu-driver-version=disabled en la marca --accelerator cuando configures las GPU para un grupo de nodos.
  • Inhabilita el complemento de dispositivo GPU agregando la etiqueta de nodo gke-no-default-nvidia-gpu-device-plugin=true.
  • Permite que el DaemonSet del controlador de DRA se ejecute en los nodos agregando la etiqueta de nodo nvidia.com/gpu.present=true.

Para crear un grupo de nodos de GPU para DRA, sigue estos pasos:

  1. Crea un grupo de nodos con el hardware requerido. En el siguiente ejemplo, se crea un grupo de nodos que tiene una instancia de g2-standard-24 en Container-Optimized OS con dos GPUs L4.

    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
    

    Reemplaza lo siguiente:

    • NODEPOOL_NAME: Es el nombre de tu grupo de nodos.
    • CLUSTER_NAME: El nombre de tu clúster.
    • CONTROL_PLANE_LOCATION: Es la región o zona del plano de control del clúster, como us-central1 o us-central1-a.
  2. Instala de forma manual los controladores en tus nodos de Container-Optimized OS o Ubuntu. Para obtener instrucciones detalladas, consulta Instala controladores de GPU de NVIDIA de forma manual.

TPU

Para usar DRA en las TPU, debes inhabilitar el complemento del dispositivo de TPU agregando la etiqueta del nodo gke-no-default-tpu-device-plugin=true. En el siguiente ejemplo, se crea un grupo de nodos de TPU Trillium con compatibilidad con DRA:

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

Reemplaza lo siguiente:

  • NODEPOOL_NAME: Es el nombre de tu grupo de nodos.
  • CLUSTER_NAME: El nombre de tu clúster.
  • CONTROL_PLANE_LOCATION: Es la región o zona del plano de control del clúster, como us-central1 o us-central1-a.

Instala los controladores de DRA

GPU

  1. Extrae y actualiza el gráfico de Helm que contiene el controlador DRA de NVIDIA:

    helm repo add nvidia https://helm.ngc.nvidia.com/nvidia \
        && helm repo update
    
  2. Instala el controlador DRA de NVIDIA con la versión 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'
    

    Para los nodos de Ubuntu, usa la ruta de acceso al directorio nvidiaDriverRoot="/opt/nvidia".

TPU

  1. Clona el repositorio ai-on-gke para acceder a los gráficos de Helm que contienen los controladores de DRA para GPU y TPU:

    git clone https://github.com/ai-on-gke/common-infra.git
    
  2. Navega al directorio que contiene los gráficos:

    cd common-infra/common/charts
    
  3. Instala el controlador de DRA de TPU:

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

Verifica que tu infraestructura esté lista para la DRA

  1. Para verificar que tus Pods de controladores de DRA se estén ejecutando, selecciona una de las siguientes opciones:

    GPU

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

    El resultado es similar a lo siguiente:

    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
    
    

    El resultado es similar a lo siguiente:

    NAME                                         READY   STATUS    RESTARTS   AGE
    tpu-dra-driver-kubeletplugin-h6m57           1/1     Running   0          30s
    
  2. Confirma que ResourceSlice muestre los dispositivos de hardware que agregaste:

    kubectl get resourceslices -o yaml
    

    Si usaste el ejemplo de la sección anterior, el resultado será similar al siguiente, según si configuraste GPUs o TPUs:

    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: ""
    

¿Qué sigue?