Preparar la infraestructura de GKE para 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). Entre los pasos de configuración se incluye la creación de grupos de nodos que usen GPUs o TPUs, así como la instalación de controladores de DRA en el clúster. Este documento está dirigido a administradores de plataformas que quieran reducir la complejidad y los costes de 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 de controladores de GPU no es compatible con DRA.
  • No puedes usar las siguientes funciones para compartir la GPU:
    • GPUs de tiempo compartido
    • GPUs con varias instancias
    • Servicio multiproceso (MPS)
  • En el caso de las TPUs, debes habilitar las versiones v1beta1 y v1beta2 de los tipos de la API DRA. Esta limitación no se aplica a las GPUs, que pueden usar versiones de la API 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, en función del tipo de hardware que quieras usar:

Antes de empezar

Antes de empezar, asegúrate de que has realizado las siguientes tareas:

  • Habilita la API de Google Kubernetes Engine.
  • Habilitar la API de Google Kubernetes Engine
  • Si quieres usar Google Cloud CLI para esta tarea, instálala y, a continuación, inicialízala. Si ya has instalado la CLI de gcloud, obtén la versión más reciente ejecutando el comando gcloud components update. Es posible que las versiones anteriores de la interfaz de línea de comandos de gcloud no admitan la ejecución de los comandos de este documento.
  • Tener un clúster estándar de GKE que ejecute la versión 1.34 o una 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 TPUs, habilita las versiones v1beta1 y v1beta2 de los tipos de API de 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"
    

Crear un grupo de nodos de GKE con GPUs o TPUs

En GKE, puedes usar DRA con GPUs y TPUs. Los ajustes de configuración del grupo de nodos, como el tipo de máquina, el tipo de acelerador, el recuento, el sistema operativo del nodo y las ubicaciones de los nodos, dependen de tus requisitos. Para crear un grupo de nodos que admita DRA, selecciona una de las siguientes opciones:

GPU

Para usar DRA en GPUs, debes hacer lo siguiente al crear el grupo de nodos:

  • Para inhabilitar la instalación automática de controladores de GPU, especifica la opción gpu-driver-version=disabled en la marca --accelerator al configurar las GPUs de un grupo de nodos.
  • Inhabilita el complemento de dispositivo de GPU añadiendo 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 añadiendo 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 necesario. En el siguiente ejemplo se crea un grupo de nodos que tiene una instancia 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
    

    Haz los cambios siguientes:

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

TPU

Para usar la asignación dinámica de recursos en las TPUs, debes inhabilitar el complemento del dispositivo TPU añadiendo la etiqueta de 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

Haz los cambios siguientes:

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

Instalar controladores de DRA

GPU

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

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

    En los nodos de Ubuntu, usa la ruta de 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 GPUs y TPUs:

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

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

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

Verificar que tu infraestructura está preparada para la DRA

  1. Para verificar que los pods de tu controlador de réplica de datos se están ejecutando, selecciona una de las siguientes opciones:

    GPU

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

    El resultado debería ser similar al 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 debería ser similar al siguiente:

    NAME                                         READY   STATUS    RESTARTS   AGE
    tpu-dra-driver-kubeletplugin-h6m57           1/1     Running   0          30s
    
  2. Confirma que en ResourceSlice se muestran los dispositivos de hardware que has añadido:

    kubectl get resourceslices -o yaml
    

    Si has usado el ejemplo de la sección anterior, el resultado será similar al siguiente, en función de si has configurado 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: ""
    

Siguientes pasos