Esta página explica como configurar a sua infraestrutura do Google Kubernetes Engine (GKE) para suportar a alocação dinâmica de recursos (DRA). Nesta página, vai criar clusters que podem implementar cargas de trabalho de GPU ou TPU e instalar manualmente os controladores de que precisa para ativar o DRA.
Esta página destina-se aos administradores de plataformas que querem reduzir a complexidade e a sobrecarga da configuração de infraestruturas com dispositivos de hardware especializados.
Acerca da DRA
A DRA é uma funcionalidade do Kubernetes incorporada que lhe permite pedir, atribuir e partilhar hardware de forma flexível no seu cluster entre pods e contentores. Para mais informações, consulte o artigo Acerca da atribuição dinâmica de recursos.
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)
Requisitos
Para usar o DRA, a versão do GKE tem de ser a 1.32.1-gke.1489001 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. Se instalou anteriormente a CLI gcloud, execute
gcloud components update
para obter a versão mais recente.
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
Crie um cluster padrão do GKE
Crie um cluster do modo padrão que ative as APIs beta do 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
Substitua o seguinte:
CLUSTER_NAME
: um nome para o cluster.GKE_VERSION
: a versão do GKE a usar para o cluster e os nós. Tem de ser 1.32.1-gke.1489001 ou posterior.
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.
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 de controladores da GPU com o
gpu-driver-version=disabled
. - Desative o plug-in do dispositivo GPU adicionando a etiqueta do nó
gke-no-default-nvidia-gpu-device-plugin=true
. - Permita que o DRA Driver DaemonSet seja executado nos nós adicionando a
nvidia.com/gpu.present=true
etiqueta do nó.
Para criar um pool de nós de GPU para DRA, siga estes passos:
Crie um node pool com o hardware necessário. O exemplo seguinte cria um conjunto de nós com instâncias g2-standard-24 no SO otimizado para contentores com duas GPUs L4.
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
Substitua o seguinte:
NODEPOOL_NAME
: o nome do seu node pool.CLUSTER_NAME
: o nome do cluster.
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 TPUs, tem de desativar o plug-in do dispositivo TPU adicionando a etiqueta do nó gke-no-default-tpu-device-plugin=true
.
Crie um node pool que use TPUs. O exemplo seguinte cria um node pool 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
Substitua o seguinte:
NODEPOOL_NAME
: o nome do seu node pool.CLUSTER_NAME
: o nome do cluster.
Instale controladores DRA
GPU
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
Instale o controlador NVIDIA DRA com a versão 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 nós do Ubuntu, use o caminho do diretório
nvidiaDriverRoot="/opt/nvidia"
.
TPU
Pode instalar controladores DRA para TPUs com o gráfico Helm fornecido. Para aceder aos gráficos Helm, conclua os seguintes passos:
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
Navegue para o diretório que contém os gráficos:
cd common-infra/common/charts
Instale o controlador DRA da TPU:
./tpu-dra-driver/install-tpu-dra-driver.sh
Verifique se a sua infraestrutura está pronta para a DRA
Verifique se o pod do controlador DRA está em execução.
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
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 ResourceSlice
é semelhante ao seguinte, dependendo do tipo de hardware que usou:
GPU
O exemplo seguinte cria uma máquina g2-standard-24 com duas 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: ""