Prepare a infraestrutura do GKE para cargas de trabalho da DRA

Este documento explica como configurar a sua infraestrutura do Google Kubernetes Engine (GKE) para suportar a atribuição dinâmica de recursos (DRA). Os passos de configuração incluem a criação de pools de nós que usam GPUs ou TPUs e a instalação de controladores DRA no cluster. Este documento destina-se aos administradores de plataformas que querem reduzir a complexidade e a sobrecarga da configuração de infraestruturas com dispositivos de hardware especializados.

Limitações

  • A administração de contas automática de nós não é suportada.
  • Os clusters do Autopilot não suportam o DRA.
  • A instalação automática de controladores de GPU não é suportada com o DRA.
  • Não pode usar as seguintes funcionalidades de partilha de GPU:
    • GPUs de partilha de tempo
    • GPUs de várias instâncias
    • Serviço multiprocessos (MPS)
  • Para as TPUs, tem de ativar as versões v1beta1 e v1beta2 dos tipos de API DRA. Esta limitação não se aplica às GPUs, que podem usar versões da API v1.

Requisitos

Para usar o DRA, o cluster do GKE tem de executar a versão 1.34 ou posterior.

Também deve estar familiarizado com os seguintes requisitos e limitações, consoante o tipo de hardware que quer usar:

Antes de começar

Antes de começar, certifique-se de que realizou as seguintes tarefas:

  • Ative a API Google Kubernetes Engine.
  • Ative a API Google Kubernetes Engine
  • Se quiser usar a CLI gcloud para esta tarefa, instale-a e, em seguida, inicialize a CLI gcloud. Se instalou anteriormente a CLI gcloud, execute o comando gcloud components update para obter a versão mais recente. As versões anteriores da CLI gcloud podem não suportar a execução dos comandos neste documento.
  • Ter um cluster padrão do GKE com a versão 1.34 ou posterior. Também pode criar um cluster regional.

  • Se não estiver a usar o Cloud Shell, instale a CLI 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 a DRA para as TPUs, ative as versões v1beta1 e v1beta2 dos tipos de APIs 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"
    

Crie um node pool do GKE com GPUs ou TPUs

No GKE, pode usar a DRA com GPUs e TPUs. As definições de configuração do conjunto de nós, como o tipo de máquina, o tipo de acelerador, a quantidade, o sistema operativo do nó e as localizações dos nós, dependem dos seus requisitos. Para criar um conjunto de nós que suporte DRA, selecione uma das seguintes opções:

GPU

Para usar a DRA para GPUs, tem de fazer o seguinte quando criar o conjunto de nós:

  • Desative a instalação automática do controlador da GPU especificando a opção gpu-driver-version=disabled na flag --accelerator quando configurar GPUs para um conjunto de nós.
  • Desative o plug-in do dispositivo GPU adicionando a etiqueta do nó gke-no-default-nvidia-gpu-device-plugin=true.
  • Permita que o DaemonSet do controlador DRA seja executado nos nós adicionando a nvidia.com/gpu.present=true etiqueta do nó.

Para criar um conjunto de nós de GPU para DRA, siga estes passos:

  1. Crie um node pool com o hardware necessário. O exemplo seguinte cria um conjunto de nós que tem uma instância g2-standard-24 no SO otimizado para contentores com duas 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
    

    Substitua o seguinte:

    • NODEPOOL_NAME: o nome do seu node pool.
    • CLUSTER_NAME: o nome do seu cluster.
    • CONTROL_PLANE_LOCATION: a região ou a zona do painel de controlo do cluster, como us-central1 ou us-central1-a.
  2. Instale manualmente os controladores nos nós do SO otimizado para contentores ou do Ubuntu. Para obter instruções detalhadas, consulte o artigo Instale manualmente os controladores da GPU NVIDIA.

TPU

Para usar a DRA para as TPUs, tem de desativar o plug-in do dispositivo TPU adicionando a etiqueta do nó gke-no-default-tpu-device-plugin=true. O exemplo seguinte cria um conjunto de nós da TPU Trillium com suporte de 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

Substitua o seguinte:

  • NODEPOOL_NAME: o nome do seu node pool.
  • CLUSTER_NAME: o nome do seu cluster.
  • CONTROL_PLANE_LOCATION: a região ou a zona do painel de controlo do cluster, como us-central1 ou us-central1-a.

Instale controladores DRA

GPU

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

    helm repo add nvidia https://helm.ngc.nvidia.com/nvidia \
        && helm repo update
    
  2. Instale o controlador NVIDIA DRA com a versão 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 nós do Ubuntu, use o caminho do diretório nvidiaDriverRoot="/opt/nvidia".

TPU

  1. Clone o repositório ai-on-gke para aceder aos gráficos Helm que contêm os controladores DRA para GPUs e TPUs:

    git clone https://github.com/ai-on-gke/common-infra.git
    
  2. Navegue para o diretório que contém os gráficos:

    cd common-infra/common/charts
    
  3. Instale o controlador DRA da TPU:

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

Verifique se a sua infraestrutura está pronta para a DRA

  1. Para verificar se os pods do controlador DRA estão em execução, selecione uma das seguintes opções:

    GPU

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

    O resultado é semelhante ao seguinte:

    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
    
    

    O resultado é semelhante ao seguinte:

    NAME                                         READY   STATUS    RESTARTS   AGE
    tpu-dra-driver-kubeletplugin-h6m57           1/1     Running   0          30s
    
  2. Confirme se a página ResourceSlice apresenta os dispositivos de hardware que adicionou:

    kubectl get resourceslices -o yaml
    

    Se usou o exemplo na secção anterior, o resultado é semelhante ao seguinte, consoante tenha configurado GPUs ou 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: ""
    

O que se segue?