DRANET de Google Kubernetes Engine (GKE) es una función gestionada de GKE que se basa en el proyecto DRANET de código abierto, que implementa la API DRA de Kubernetes para los recursos de red. DRANET te permite solicitar y asignar recursos de red de alto rendimiento para tus pods, incluidas interfaces de red que admitan el acceso directo a memoria remota (RDMA). Este enfoque proporciona una API portátil y alineada con la versión upstream para la gestión de recursos de red.
En este documento se ofrece una descripción general conceptual de DRANET de GKE y se muestra cómo asignar recursos de red a las cargas de trabajo de tus clústeres de GKE.
Este documento está dirigido a arquitectos de la nube y especialistas en redes que diseñan redes para sus organizaciones. Para obtener una visión general de toda la documentación de GKE, consulta Explorar la documentación de GKE. Para obtener información sobre los roles y las tareas habituales que se mencionan en el contenido, consulta Roles y tareas habituales de los usuarios de GKE. Google Cloud
Antes de leer este documento, asegúrese de que conoce los siguientes conceptos:
- Asignación dinámica de recursos
- Acerca de la asignación dinámica de recursos en GKE
- Conceptos de Kubernetes
- Redes de GKE
- Conceptos básicos de las redes de GKE
Cómo funciona la DRANET gestionada de GKE
La DRANET gestionada de GKE se implementa mediante un networking-dra-driver
DaemonSet. Este DaemonSet se ejecuta en nodos con GPUs o TPUs que tienen habilitado GKE DRANET. Funciona como un agente a nivel de nodo para que las interfaces de red se puedan descubrir y asignar a los pods mediante las APIs de asignación dinámica de recursos (DRA) de Kubernetes.
En las versiones 1.34.1-gke.1829001 y posteriores de GKE, GKE instala automáticamente recursos DeviceClass para la red. Estas clases definen los tipos de dispositivos de red que puedes solicitar. Por ejemplo, GKE crea la clase mrdma.google.com para dispositivos compatibles con RDMA y la clase netdev.google.com para otros dispositivos de red.
Para usar GKE DRANET, primero debes habilitar el controlador de GKE DRANET en un grupo de nodos con GPUs o TPUs.
Para solicitar dispositivos de red para una carga de trabajo, define un ResourceClaimTemplate.
Esta plantilla especifica el DeviceClass y el modo de asignación, como
solicitar todos los dispositivos disponibles en un nodo. En la especificación de tu pod, haz referencia a esta plantilla en un campo resourceClaims para conceder a tu pod acceso a las interfaces de red solicitadas en el nodo.
Cuándo usar DRANET gestionado de GKE
GKE DRANET proporciona una forma estandarizada de gestionar los recursos de red que tienen en cuenta la topología y las dependencias. Esta estandarización la convierte en una solución adecuada para cargas de trabajo de IA y aprendizaje automático que requieren redes de alto rendimiento.
Estos son algunos de los casos prácticos habituales en los que se solicitan interfaces de red para un pod:
- Solicitando todas las interfaces disponibles compatibles con RDMA.
- Solicitar un número específico de interfaces compatibles con RDMA.
- Solicitar todas las interfaces no RDMA disponibles.
- Solicitar un número específico de interfaces no RDMA.
Consideraciones clave al usar DRANET gestionado de GKE para las redes
Ten en cuenta los siguientes puntos al usar GKE DRANET para las redes:
Interfaces de red dedicadas
Cuando usas GKE DRANET para reclamar una interfaz de red para un pod, esa interfaz se dedica a ese pod. Otros pods del mismo nodo no pueden compartirlo. De esta forma, el pod tiene acceso exclusivo al ancho de banda y a los recursos completos de esa interfaz, lo que supone una ventaja clave para las cargas de trabajo sensibles al rendimiento.
Usar el controlador DRANET gestionado de GKE de forma independiente
Puedes habilitar el controlador DRA de GKE para gestionar recursos de red sin habilitar otros controladores DRANET de GKE. Para ello, añade la etiqueta
cloud.google.com/gke-networking-dra-driver=truea un grupo de nodos con GPUs y TPUs.Usar otros controladores de DRA de GKE
Para conseguir un mayor rendimiento en cargas de trabajo exigentes de IA o aprendizaje automático, combina la API DRA para aceleradores (como GPUs y TPUs) con la red gestionada DRANET de GKE. Este enfoque combinado mejora la alineación de los recursos y la detección de la topología. Para obtener información sobre cómo usar DRA en otros recursos, consulta Preparar la infraestructura de GKE para cargas de trabajo de DRA.
Evitar configuraciones contradictorias
El controlador DRANET de GKE gestiona las interfaces RDMA y las gNICs virtuales que no tienen configurados intervalos de direcciones IP secundarias. No uses el controlador DRANET de GKE y la API de varias redes de GKE con un recurso de red de tipo
Deviceen el mismo clúster. No se admite el uso conjunto del controlador y la API, ya que ambas APIs intentan gestionar el mismo conjunto de NICs, lo que puede provocar una configuración incorrecta y un comportamiento impredecible.
Requisitos
Para usar GKE Managed DRANET, tu entorno debe cumplir los siguientes requisitos:
- GKE 1.34.1-gke.1829001 o una versión posterior.
- GKE Dataplane V2 está habilitado en el clúster.
- (Vista previa) GKE DRANET está disponible en máquinas A4X Max.
Limitaciones
GKE DRANET tiene las siguientes limitaciones:
- No puedes usar GKE DRANET para asignar la tarjeta de interfaz de red (NIC) predeterminada ni las NICs virtuales (como veth).
- No se admiten el autoescalado de clústeres ni Autopilot.
- No puedes usar GKE DRANET con interfaces en las que hayas configurado un
secondaryPodRange.
Antes de empezar
Antes de empezar, asegúrate de que has 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 CLI de gcloud, obtén la versión más reciente ejecutando el comando
gcloud components update. Es posible que las versiones anteriores de la interfaz de línea de comandos de gcloud no admitan la ejecución de los comandos de este documento.
Roles obligatorios
Para obtener los permisos que necesitas para crear grupos de nodos y asignar recursos de red, pide a tu administrador que te conceda el rol de gestión de identidades y accesos Administrador de Kubernetes Engine (roles/container.admin) en tu proyecto.
Para obtener más información sobre cómo conceder roles, consulta el artículo Gestionar acceso a proyectos, carpetas y organizaciones.
También puedes conseguir los permisos necesarios a través de roles personalizados u otros roles predefinidos.
Crear un clúster
Crea un clúster estándar de GKE que use GKE Dataplane V2:
gcloud container clusters create CLUSTER_NAME \
--enable-dataplane-v2 \
--region=CONTROL_PLANE_LOCATION \
--project=PROJECT_ID \
--cluster-version=CLUSTER_VERSION
Haz los cambios siguientes:
CLUSTER_NAME: el nombre del nuevo clúster.CONTROL_PLANE_LOCATION: la región o zona del plano de control del clúster, comous-central1ous-central1-a.PROJECT_ID: tu ID de proyecto Google Cloud .CLUSTER_VERSION: la versión de GKE de tu clúster. Esta versión debe ser 1.34.1-gke.1829001 o una posterior.
Usar interfaces RDMA desde un grupo de nodos de GPU
En las siguientes secciones se describe cómo configurar un grupo de nodos de GPU y una carga de trabajo para usar interfaces de red RDMA con GKE DRANET.
Habilitar el controlador DRANET gestionado de GKE en un grupo de nodos de GPU
Para habilitar el controlador DRANET de GKE en un grupo de nodos de GPU que admita RDMA, añade la etiqueta cloud.google.com/gke-networking-dra-driver=true cuando crees el grupo de nodos.
gcloud beta container node-pools create NODE_POOL_NAME \
--region=REGION \
--cluster=CLUSTER_NAME \
--node-locations=NODE_LOCATIONS \
--accelerator type=ACCELERATOR_TYPE,count=ACCELERATOR_COUNT,gpu-driver-version=DRIVER_VERSION \
--machine-type=MACHINE_TYPE \
--num-nodes=NUM_NODES \
--reservation-affinity=specific \
--reservation=projects/RESERVATION_PROJECT/reservations/RESERVATION_NAME/reservationBlocks/RESERVATION_BLOCK \
--accelerator-network-profile=auto \
--node-labels=cloud.google.com/gke-networking-dra-driver=true
Haz los cambios siguientes:
NODE_POOL_NAME: el nombre del nuevo grupo de nodos.REGION: la Google Cloud región de tu clúster.CLUSTER_NAME: el nombre de tu clúster.ACCELERATOR_TYPE: el tipo de acelerador de GPU:Por ejemplo:
- Máquinas virtuales A4: introduce
nvidia-b200. - Máquinas virtuales A3 Ultra: introduce
nvidia-h200-141gb.
- Máquinas virtuales A4: introduce
ACCELERATOR_COUNT: número de GPUs que se van a asociar a los nodos del grupo de nodos. Por ejemplo, en las máquinas virtuales a4-highgpu-8g y a3-ultragpu-8g, el número de GPUs es 8.DRIVER_VERSION: la versión del controlador de la GPU que se va a usar. Por ejemplo,defaultolatest.MACHINE_TYPE: el tipo de máquina del grupo de nodos. Por ejemplo,a3-ultragpu-8g.NUM_NODES: el número de nodos del grupo de nodos. En el caso de flex-start, este valor debe ser 0.RESERVATION_PROJECT: el ID del proyecto de la reserva.RESERVATION_NAME: el nombre de tu reserva. Para encontrar este valor, consulta Ver solicitudes de reserva futuras.RESERVATION_BLOCK: el nombre de un bloque específico de la reserva. Para encontrar este valor, consulta Ver solicitudes de reserva futuras.
Este comando usa perfiles de red de aceleradores para configurar automáticamente redes de VPC y subredes para tus VMs de aceleradores. También puedes especificar tu red VPC y subredes de forma explícita.
Desplegar recursos RDMA de una carga de trabajo
Para asignar recursos de RDMA a un pod, especifica un ResourceClaimTemplate.
Crea un
ResourceClaimTemplatepara definir cómo asignar los dispositivos RDMA. La siguiente solicitud de manifiesto solicita todos los dispositivosmrdmadisponibles en el nodo. Guarda el archivo de manifiesto comoall-mrdma-template.yaml:apiVersion: resource.k8s.io/v1 kind: ResourceClaimTemplate metadata: name: all-mrdma spec: spec: devices: requests: - name: req-mrdma exactly: deviceClassName: mrdma.google.com allocationMode: AllAplica el archivo de manifiesto:
kubectl apply -f all-mrdma-template.yamlDespliega tu carga de trabajo y consulta la
ResourceClaimTemplate. El siguiente manifiesto implementa un pod que hace referencia a la plantillaall-mrdma, lo que le da acceso a las interfaces RDMA del nodo. Guarda el manifiesto comoagnhost-rdma-pod.yaml:apiVersion: v1 kind: Pod metadata: name: agnhost-rdma namespace: default labels: app: agnhost spec: containers: - name: agnhost image: registry.k8s.io/e2e-test-images/agnhost:2.39 args: ["netexec", "--http-port", "80"] ports: - name: agnhost-port containerPort: 80 resources: claims: - name: rdma limits: nvidia.com/gpu: 1 resourceClaims: - name: rdma resourceClaimTemplateName: all-mrdmaAplica el archivo de manifiesto:
kubectl apply -f agnhost-rdma-pod.yamlVerifica que las interfaces de red asignadas adicionales estén visibles en el pod.
kubectl exec agnhost-rdma -- ls /sys/class/netEn el siguiente ejemplo de salida se muestran las interfaces
eth0ylopredeterminadas, así como las interfaces RDMA asignadas, comogpu0rdma0. El número y los nombres de las interfaces de red (NICs) varían en función del tipo de máquina del nodo de GKE.eth0 gpu0rdma0 gpu1rdma0 gpu2rdma0 gpu3rdma0 lo
Usar interfaces de red que no sean RDMA en un grupo de nodos de TPU
En las siguientes secciones se describe cómo configurar un grupo de nodos de TPU y una carga de trabajo para usar interfaces de red que no sean RDMA con GKE DRANET.
Verificar DeviceClasses de redes
Verifica que los recursos DeviceClass para la red existan en tu clúster.
kubectl get deviceclass netdev.google.com
El resultado debería ser similar al siguiente:
NAME AGE
netdev.google.com 2d22h
Habilitar el controlador DRANET gestionado de GKE en un grupo de nodos de un segmento de TPU
Para habilitar el controlador DRANET de GKE al crear un grupo de nodos de segmento de TPU, añade la etiqueta cloud.google.com/gke-networking-dra-driver=true.
gcloud beta container node-pools create NODE_POOL_NAME \
--location=LOCATION \
--cluster=CLUSTER_NAME \
--node-locations=NODE_LOCATIONS \
--machine-type=MACHINE_TYPE \
--tpu-topology=TPU_TOPOLOGY \
--num-nodes=NUM_NODES \
--accelerator-network-profile=auto \
--node-labels=cloud.google.com/gke-networking-dra-driver=true
Haz los cambios siguientes:
NODE_POOL_NAME: el nombre del nuevo grupo de nodos.LOCATION: la Google Cloud región o zona de tu clúster.CLUSTER_NAME: el nombre del clúster.NODE_LOCATIONS: las Google Cloud zonas de los nodos del grupo de nodos.MACHINE_TYPE: el tipo de máquina que se va a usar en los nodos. Para obtener más información sobre los tipos de máquinas compatibles con TPU, consulta Elegir la versión de TPU.TPU_TOPOLOGY: la topología de la TPU. Por ejemplo,2x4x4. El formato de la topología depende de la versión de la TPU. Para obtener más información sobre las topologías de TPU, consulta Elegir una topología.NUM_NODES: número de nodos del grupo de nodos.
Para obtener más información, consulta Crear un grupo de nodos de segmento de TPU de un solo host.
Desplegar una carga de trabajo que reclame todos los dispositivos de red
Para asignar dispositivos de red que no sean RDMA a un Pod, especifica un ResourceClaimTemplate.
Crea un
ResourceClaimTemplateque haga referencia alnetdev.google.comDeviceClass. El siguiente manifiesto solicita todos los dispositivos de red no RDMA disponibles en el nodo.Guarda el archivo de manifiesto como
all-netdev-template.yaml:apiVersion: resource.k8s.io/v1 kind: ResourceClaimTemplate metadata: name: all-netdev spec: spec: devices: requests: - name: req-netdev exactly: deviceClassName: netdev.google.com allocationMode: AllAplica el archivo de manifiesto:
kubectl apply -f all-netdev-template.yamlDespliega tu carga de trabajo y consulta la
ResourceClaimTemplate. El siguiente manifiesto implementa un pod que usa la plantillaall-netdevpara concederle acceso a todos los dispositivos de red que no sean RDMA del nodo. Guarda el archivo de manifiesto comonetdev-pod.yaml:apiVersion: v1 kind: Pod metadata: name: agnhost-netdev namespace: default labels: app: agnhost spec: containers: - name: agnhost image: registry.k8s.io/e2e-test-images/agnhost:2.39 args: ["netexec", "--http-port", "80"] ports: - name: agnhost-port containerPort: 80 resources: claims: - name: netdev limits: google.com/tpu: 4 nodeSelector: cloud.google.com/gke-tpu-accelerator: TPU_ACCELERATOR cloud.google.com/gke-tpu-topology: TPU_TOPOLOGY resourceClaims: - name: netdev resourceClaimTemplateName: all-netdevHaz los cambios siguientes:
TPU_ACCELERATOR: el tipo de acelerador de TPU, por ejemplo,tpu-v5p-slice.TPU_TOPOLOGY: la topología de la TPU. Por ejemplo,2x4x4.
Aplica el archivo de manifiesto:
kubectl apply -f netdev-pod.yamlVerifica que las interfaces de red adicionales asignadas estén visibles en el pod.
kubectl exec agnhost-netdev -- ls /sys/class/netEn el siguiente ejemplo de salida se muestran las interfaces
eth0ylopredeterminadas, así como los dispositivos de red asignados, que tienen nombres comoeth1yeth2. El número de NICs y sus nombres variarán en función del tipo de máquina del nodo de GKE.eth0 eth1 eth2 lo
Solicitar un número específico de dispositivos de red
En los ejemplos anteriores se muestra cómo solicitar todos los dispositivos de red disponibles de un tipo determinado configurando allocationMode como All. Si necesitas solicitar un número específico de dispositivos, puedes definir allocationMode como ExactCount
en tu ResourceClaimTemplate.
En el siguiente ejemplo se solicitan dos dispositivos de red RDMA:
apiVersion: resource.k8s.io/v1
kind: ResourceClaimTemplate
metadata:
name: two-mrdma
spec:
spec:
devices:
requests:
- name: req-mrdma
exactly:
deviceClassName: mrdma.google.com
allocationMode: ExactCount
count: 2
Siguientes pasos
- Consulta más información sobre la asignación dinámica de recursos.
- Consulte más información sobre cómo configurar la red automatizada para VMs de acelerador.