Prepara la infraestructura de GKE para las 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). 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.

Esta página está destinada 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.

Acerca del DRA

La 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 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 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)

Requisitos

Para usar DRA, tu clúster de GKE debe ejecutar la versión 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 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.32.1-gke.1489001 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
    

Habilita las APIs beta de DRA en tu clúster

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"

Reemplaza lo siguiente:

  • 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.

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.

GPU

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

  • Inhabilita la instalación automática del controlador de GPU con gpu-driver-version=disabled.
  • Inhabilita el complemento de dispositivo GPU agregando la etiqueta de nodo gke-no-default-nvidia-gpu-device-plugin=true.
  • Agrega la etiqueta de nodo nvidia.com/gpu.present=true para permitir que el DaemonSet del controlador de DRA se ejecute en los nodos.

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 instancias g2-standard-24 en Container-Optimized OS con dos GPU 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.

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 \
    --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 de DRA de NVIDIA 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
    

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

TPU

Puedes instalar controladores de DRA para TPU con el gráfico de Helm proporcionado. Para acceder a los gráficos de Helm, completa los siguientes 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. 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

Verifica que el Pod del controlador de DRA esté en ejecución.

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 ResourceSlice muestre los dispositivos de hardware que agregaste:

kubectl get resourceslices -o yaml

Si usaste el ejemplo de la sección anterior, el ResourceSlice se parecerá al siguiente, según el 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: ""

¿Qué sigue?