Preparar a infraestrutura do GKE para cargas de trabalho do DRA

Este documento explica como configurar manualmente sua infraestrutura do Google Kubernetes Engine (GKE) para oferecer suporte à alocação dinâmica de recursos (DRA). As etapas de configuração incluem a criação de pools de nós que usam GPUs e a instalação de drivers DRA.

Este documento é destinado a administradores de plataforma que querem criar infraestrutura com dispositivos de hardware especializados que operadores de aplicativos podem reivindicar em cargas de trabalho.

Limitações

Considere as seguintes limitações:

Antes de começar

Antes de começar, verifique se você realizou as tarefas a seguir:

  • Ative a API Google Kubernetes Engine.
  • Ativar a API Google Kubernetes Engine
  • Se você quiser usar a CLI do Google Cloud para essa tarefa, instale e inicialize a gcloud CLI. Se você instalou a gcloud CLI anteriormente, instale a versão mais recente executando o comando gcloud components update. Talvez as versões anteriores da gcloud CLI não sejam compatíveis com a execução dos comandos neste documento.
  • Ter um cluster do GKE Standard que execute a versão 1.35 ou mais recente. Também é possível criar um cluster regional.

  • Instale o Helm. Se você usa o Cloud Shell, o Helm já está instalado.

Criar um pool de nós do GKE com GPUs

Nesta seção, mostramos como criar um pool de nós de GPU e instalar os drivers DRA correspondentes. As etapas desta seção se aplicam apenas a pools de nós criados manualmente. Para criar um pool de nós de GPU que ofereça suporte ao DRA, faça o seguinte:

  • Desativar a instalação automática do driver de GPU: especifique a opção gpu-driver-version=disabled na flag --accelerator.
  • Desative o plug-in de dispositivo GPU: adicione o rótulo de nó gke-no-default-nvidia-gpu-device-plugin=true ao pool de nós.
  • Execute o DaemonSet do driver DRA: adicione o rótulo do nó nvidia.com/gpu.present=true ao pool de nós.
  • Configurar o escalonamento automático: para usar o escalonador automático de cluster no pool de nós, adicione o rótulo do nó cloud.google.com/gke-nvidia-gpu-dra-driver=true ao pool de nós. O escalonador automático de cluster usa esse rótulo de nó para identificar os nós que executam o driver DRA para GPUs.

Para criar e configurar pools de nós de GPU, siga estas etapas:

  1. Crie um pool de nós de GPU. Os comandos de exemplo a seguir criam pools de nós com configurações diferentes:

    • Crie um pool de nós com uma instância g2-standard-24 que tenha duas GPUs L4:

      gcloud container node-pools create NODEPOOL_NAME \
          --cluster=CLUSTER_NAME \
          --location=CONTROL_PLANE_LOCATION \
          --node-locations=NODE_LOCATION1,NODE_LOCATION2,... \
          --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
      

      Substitua:

      • NODEPOOL_NAME: um nome para o pool de nós.
      • CLUSTER_NAME: o nome do cluster.
      • CONTROL_PLANE_LOCATION: a região ou zona do plano de controle do cluster, como us-central1 ou us-central1-a.
      • NODE_LOCATION1,NODE_LOCATION2,...: uma lista separada por vírgulas de zonas, na mesma região do plano de controle, para criar nós. Escolha zonas que tenham disponibilidade de GPU.
    • Crie um pool de nós com escalonamento automático com instâncias a2-ultragpu-1g que tenham uma GPU NVIDIA A100 (80 GB) em cada instância:

      gcloud container node-pools create NODEPOOL_NAME \
          --cluster=CLUSTER_NAME \
          --location=CONTROL_PLANE_LOCATION \
          --node-locations=NODE_LOCATION1,NODE_LOCATION2,... \
          --enable-autoscaling \
          --max-nodes=5 \
          --machine-type="a2-ultragpu-1g" \
          --accelerator="type=nvidia-a100-80gb,count=1,gpu-driver-version=disabled" \
          --num-nodes="1" \
          --node-labels=gke-no-default-nvidia-gpu-device-plugin=true,nvidia.com/gpu.present=true,cloud.google.com/gke-nvidia-gpu-dra-driver=true
      
  2. Instale manualmente os drivers de GPU NVIDIA.

  3. Instale os drivers DRA.

Instalar drivers DRA

  1. Extraia e atualize o gráfico do Helm que contém o driver NVIDIA DRA:

    helm repo add nvidia https://helm.ngc.nvidia.com/nvidia \
        && helm repo update
    
  2. Instale o driver de GPU NVIDIA DRA com a versão 25.8.0 ou mais recente:

    helm install nvidia-dra-driver-gpu nvidia/nvidia-dra-driver-gpu \
        --version="25.8.0" --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 nós do Ubuntu, especifique o caminho do diretório "/opt/nvidia" na flag --set nvidiaDriverRoot.

Verificar se sua infraestrutura está pronta para o DRA

  1. Verifique se os pods de driver do DRA estão em execução:

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

    O resultado será o seguinte:

    NAME                                         READY   STATUS    RESTARTS   AGE
    nvidia-dra-driver-gpu-kubelet-plugin-52cdm   1/1     Running   0          46s
    
  2. Confirme se o ResourceSlice lista os dispositivos de hardware que você adicionou:

    kubectl get resourceslices -o yaml
    

    O resultado será o seguinte:

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

A seguir