Preparar la infraestructura de GKE para cargas de trabajo de DRA


En esta página se explica cómo configurar tu infraestructura de Google Kubernetes Engine (GKE) para admitir la asignación dinámica de recursos (DRA). En esta página, crearás clústeres que puedan desplegar cargas de trabajo de GPU o TPU e instalarás manualmente los controladores que necesites para habilitar DRA.

Esta página está dirigida a administradores de plataformas que quieran reducir la complejidad y los costes de configuración de la infraestructura con dispositivos de hardware especializados.

Acerca de DRA

DRA es una función integrada de Kubernetes que te permite solicitar, asignar y compartir hardware de forma flexible en tu clúster entre pods y contenedores. Para obtener más información, consulta el artículo Acerca de la asignación dinámica de recursos.

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:
    • Compartir GPUs por tiempo
    • GPUs con varias instancias
    • Servicio multiproceso (MPS)

Requisitos

Para usar DRA, tu versión de GKE debe ser la 1.32.1-gke.1489001 o una posterior.

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

Antes de empezar

Antes de empezar, asegúrate de haber 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 gcloud CLI, obtén la versión más reciente ejecutando gcloud components update.
  • 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
    

Crear un clúster estándar de GKE

Crea un clúster en modo Estándar que habilite las APIs beta de Kubernetes para DRA:

   gcloud container clusters create CLUSTER_NAME \
       --enable-kubernetes-unstable-apis="resource.k8s.io/v1beta1/deviceclasses,resource.k8s.io/v1beta1/resourceclaims,resource.k8s.io/v1beta1/resourceclaimtemplates,resource.k8s.io/v1beta1/resourceslices" \
       --cluster-version=GKE_VERSION

Haz los cambios siguientes:

  • CLUSTER_NAME: el nombre del clúster.
  • GKE_VERSION: la versión de GKE que se va a usar en el clúster y los nodos. Debe ser 1.32.1-gke.1489001 o una versión posterior.

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 número, el sistema operativo del nodo y las ubicaciones de los nodos) dependen de tus requisitos.

GPU

Para usar la asignación dinámica de recursos para GPUs, debes hacer lo siguiente al crear el grupo de nodos:

  • Inhabilita la instalación automática de controladores de GPU con gpu-driver-version=disabled.
  • 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 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 instancias g2-standard-24 en Container-Optimized OS con dos GPUs de nivel 4.

    gcloud container node-pools create NODEPOOL_NAME \
        --cluster=CLUSTER_NAME \
        --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.
  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 DRA en las TPUs, debes inhabilitar el complemento de dispositivo de TPU añadiendo la etiqueta de nodo gke-no-default-tpu-device-plugin=true.

Crea un grupo de nodos que use TPUs. En el siguiente ejemplo se crea un grupo de nodos de TPU Trillium:

gcloud container node-pools create NODEPOOL_NAME \
    --cluster CLUSTER_NAME --num-nodes 1 \
    --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.

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.0-rc.4:

    helm install nvidia-dra-driver-gpu nvidia/nvidia-dra-driver-gpu --version="25.3.0-rc.4" --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

Puedes instalar controladores de DRA para TPUs con el gráfico de Helm proporcionado. Para acceder a los gráficos de Helm, sigue estos pasos:

  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

Verifica que el pod del controlador de DRA se esté ejecutando.

GPU

kubectl get pods -n nvidia-dra-driver-gpu
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
NAME                                         READY   STATUS    RESTARTS   AGE
tpu-dra-driver-kubeletplugin-h6m57           1/1     Running   0          30s

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 ResourceSlice será similar al siguiente, en función del tipo de hardware que hayas usado:

GPU

En el siguiente ejemplo se crea una máquina g2-standard-24 con dos GPUs L4.

apiVersion: v1
items:
- apiVersion: resource.k8s.io/v1beta1
  kind: ResourceSlice
  metadata:
    # lines omitted for clarity
  spec:
    devices:
    - basic:
        attributes:
          architecture:
            string: Ada Lovelace
          brand:
            string: Nvidia
          cudaComputeCapability:
            version: 8.9.0
          cudaDriverVersion:
            version: 12.9.0
          driverVersion:
            version: 575.57.8
          index:
            int: 0
          minor:
            int: 0
          productName:
            string: NVIDIA L4
          type:
            string: gpu
          uuid:
            string: GPU-4d403095-4294-6ddd-66fd-cfe5778ef56e
        capacity:
          memory:
            value: 23034Mi
      name: gpu-0
    - basic:
        attributes:
          architecture:
            string: Ada Lovelace
          brand:
            string: Nvidia
          cudaComputeCapability:
            version: 8.9.0
          cudaDriverVersion:
            version: 12.9.0
          driverVersion:
            version: 575.57.8
          index:
            int: 1
          minor:
            int: 1
          productName:
            string: NVIDIA L4
          type:
            string: gpu
          uuid:
            string: GPU-cc326645-f91d-d013-1c2f-486827c58e50
        capacity:
          memory:
            value: 23034Mi
      name: gpu-1
    driver: gpu.nvidia.com
    nodeName: gke-cluster-gpu-pool-9b10ff37-mf70
    pool:
      generation: 1
      name: gke-cluster-gpu-pool-9b10ff37-mf70
      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