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:
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.
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
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
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:
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
Ve al directorio que contiene los gráficos:
cd common-infra/common/charts
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: ""