DRANET de Google Kubernetes Engine (GKE) es una función de GKE administrada que se basa en el proyecto DRANET de código abierto, que implementa la API de DRA de Kubernetes para los recursos de red. DRANET te permite solicitar y asignar recursos de red de alto rendimiento para tus Pods, incluidas las interfaces de red que admiten el acceso directo a memoria remota (RDMA). Este enfoque proporciona una API portátil y alineada con la versión upstream para la administración de recursos de red.
En este documento, se proporciona una descripción general conceptual de DRANET de GKE y se muestra cómo asignar recursos de red a las cargas de trabajo en tus clústeres de GKE.
Este documento está dirigido a arquitectos de nube y especialistas en herramientas de redes que diseñan redes para sus organizaciones. Para obtener una descripción general de toda la documentación de GKE, consulta Explora la documentación de GKE. Para obtener información sobre los roles y las tareas comunes a los que se hace referencia en el contenido de Google Cloud , consulta Roles y tareas comunes del usuario de GKE.
Antes de leer este documento, asegúrate de estar familiarizado con los siguientes temas:
- Asignación dinámica de recursos
- Acerca de la asignación dinámica de recursos en GKE
- Conceptos de Kubernetes
- Herramientas de redes de GKE
- Aspectos básicos de las herramientas de redes de GKE
Cómo funciona DRANET administrado por GKE
DRANET administrado por GKE se implementa a través de un
DaemonSet de networking-dra-driver. Este DaemonSet se ejecuta en nodos con GPU,
TPU o VMs optimizadas para el almacenamiento que tienen habilitada la DRANET de GKE.
Funciona como un agente a nivel del nodo para que las interfaces de red se puedan descubrir y asignar a los Pods a través de 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 de forma automática recursos DeviceClass para las redes. Estas clases
definen los tipos de dispositivos de red que puedes solicitar. Por ejemplo,
GKE crea la clase mrdma.google.com para las VMs de GPU, la
clase netdev.google.com para las TPU y otros dispositivos de red, y la
clase irdma.google.com para las VMs optimizadas para el almacenamiento (como Z4M).
Para usar DRANET de GKE, primero debes habilitar el controlador de DRANET de GKE en un grupo de nodos con GPU, TPU o VMs optimizadas para el almacenamiento.
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 del Pod, haz referencia
a esta plantilla en un campo resourceClaims para otorgar al Pod acceso a las
interfaces de red solicitadas en el nodo.
Cuándo usar DRANET administrado por GKE
GKE DRANET proporciona una forma estandarizada de administrar los recursos de red que conocen la topología y las dependencias. Esta estandarización lo convierte en una solución adecuada para la IA y el AA, los sistemas de archivos paralelos grandes y otras cargas de trabajo de almacenamiento con uso intensivo de datos que requieren redes de alto rendimiento.
Entre los casos de uso comunes para solicitar interfaces de red para un Pod, se incluyen los siguientes:
- Se solicitan todas las interfaces disponibles compatibles con RDMA.
- Solicitar una cantidad específica de interfaces compatibles con RDMA
- Solicitando todas las interfaces que no son de RDMA disponibles.
- Solicitar una cantidad específica de interfaces que no sean de RDMA.
Consideraciones clave para usar DRANET administrada por GKE para las herramientas de redes
Ten en cuenta los siguientes puntos cuando uses DRANET de GKE para las herramientas de redes:
Interfaces de red dedicadas
Cuando usas DRANET de GKE para reclamar una interfaz de red para un Pod, esa interfaz se dedica a ese Pod. Otros Pods en el mismo nodo no pueden compartirla. Este enfoque ayuda a garantizar que el Pod tenga acceso exclusivo al ancho de banda y los recursos completos de esa interfaz, lo que es un beneficio clave para las cargas de trabajo sensibles al rendimiento.
Usa el controlador de DRANET administrado por GKE de forma independiente
Puedes habilitar el controlador de DRA de GKE para administrar recursos de red sin habilitar otros controladores de DRANET de GKE. Para ello, agrega la etiqueta
cloud.google.com/gke-networking-dra-driver=truea un grupo de nodos con GPU, TPU o VMs optimizadas para el almacenamiento.Usa otros controladores de DRA de GKE
Para lograr una mayor capacidad de procesamiento en cargas de trabajo de IA/AA exigentes, combina la API de DRA para aceleradores (como GPUs y TPUs) con las redes administradas de DRANET de GKE. Este enfoque combinado mejora la alineación de recursos y el conocimiento de la topología. Para obtener más información sobre el uso de la DRA para otros recursos, consulta Prepara la infraestructura de GKE para las cargas de trabajo de DRA.
Evita las configuraciones en conflicto
El controlador DRANET de GKE administra las interfaces de RDMA y las gVNIC que no tienen configurados rangos de direcciones IP secundarios. No uses el controlador DRANET de GKE ni 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 administrar el mismo conjunto de NIC, lo que puede generar una configuración incorrecta y un comportamiento impredecible.Ciclo de vida administrado del controlador de DRANET
En la versión 1.34 y posteriores de GKE, GKE crea automáticamente el espacio de nombres
gke-managed-networking-dra-driveradministrado en tu clúster. Al igual que otras cargas de trabajo del sistema de GKE, los Pods del controlador de DRANET solo se ejecutan en los nodos en los que son relevantes (como los nodos con GPU, TPU y otro hardware especializado). En los nodos en los que el controlador no es relevante, no se ejecutan Pods para este controlador. No modifiques manualmente el DaemonSetnetworking-dra-driver. Los cambios manuales, como la actualización del camponodeAffinity, pueden interferir en la administración que hace GKE de la función de DRANET y hacer que los Pods del daemon de DRANET se programen en nodos no compatibles.
Requisitos
Para usar DRANET administrado por GKE, tu entorno debe cumplir con los siguientes requisitos:
- Standard: 1.34.1-gke.1829001 o posterior (1.36.3-gke.1767000 o posterior para VMs Z4M).
- Autopilot: 1.35.2-gke.1842000 o posterior (1.37.0-gke.4713000 o posterior para VMs Z4M).
- GKE Dataplane V2 está habilitado en el clúster.
También debes usar uno de los siguientes tipos de máquinas optimizadas para aceleradores o para almacenamiento:
| Series de máquinas | Tipo de máquina | Modelo de acelerador | Tecnología de redes | DeviceClass |
|---|---|---|---|---|
| A3 Ultra | a3-ultragpu-8g |
GPU NVIDIA H200 | RDMA | mrdma.google.com |
| A4 | a4-highgpu-8g |
GPU NVIDIA B200 | RDMA | mrdma.google.com |
| A4X | a4x-highgpu-4g |
GPU NVIDIA GB200 | RDMA | mrdma.google.com |
| A4X Max | a4x-maxgpu-4g-metal |
GPU NVIDIA B300 | RDMA | mrdma.google.com |
| TPU v7 | tpu7x-standard-4t |
TPU v7 | NetDevice | netdev.google.com |
| TPU v6e | ct6e-standard-8t |
TPU Trillium | NetDevice | netdev.google.com |
| TPU v6e | ct6e-standard-4t |
TPU Trillium | NetDevice | netdev.google.com |
| TPU v6e | ct6e-standard-1t |
TPU Trillium | NetDevice | netdev.google.com |
| Z4M | Cualquier tipo de máquina Z4M que admita IRDMA | No aplicable (optimizada para almacenamiento) | RDMA | irdma.google.com |
Limitaciones
La DRANET de GKE tiene las siguientes limitaciones:
- No puedes usar DRANET de GKE para asignar la tarjeta de interfaz de red (NIC) predeterminada o las NIC virtuales (como veth).
- Ciertos tipos de instancias, específicamente los nodos de equipos físicos como
a4x-max, son incompatibles con los clústeres de ajuste de escala automático y Autopilot.
Consideraciones específicas de la máquina
Según la arquitectura de hardware subyacente de tus nodos, algunas series de máquinas requieren marcas de grupos de nodos, paquetes de imágenes de contenedor o DaemonSets del sistema adicionales para configurar interfaces de RDMA con DRANET de GKE.
A4X Max sin sistema operativo
- Implementa asapd-lite: Cuando uses nodos de GPU de equipos físicos, como A4X Max, debes
implementar el DaemonSet
asapd-liteen tu clúster. El DaemonSetasapd-liteconfigura las tarjetas de interfaz de red (NIC) de RDMA. Sin él, no se crean interfaces secundarias y el controladordranetfiltra las NIC de RDMA, lo que impide la funcionalidad de RDMA dentro de tus Pods. Para obtener instrucciones de configuración completas, consulta Configura las NIC de MRDMA con asapd-lite.
VMs Z4M con optimización de almacenamiento
- Requisitos de la imagen de contenedor: Para usar RDMA en instancias Z4M, debes usar
una imagen de contenedor de Rocky Linux 8 configurada con los paquetes de RDMA de espacio de usuario
necesarios. No se admiten otras distribuciones, como Ubuntu o Debian.
Los paquetes upstream estándar para estas distribuciones carecen de las extensiones de ABI personalizadas que requiere el controlador de IRDMA. Sin estas extensiones, los
paquetes fallan en el entorno de ejecución con un error
-ENOSPC. Para obtener instrucciones de configuración, consulta Usa interfaces de RDMA en un grupo de nodos optimizado para el almacenamiento.
Antes de comenzar
Antes de comenzar, asegúrate de haber realizado las siguientes tareas:
- Habilita la API de Google Kubernetes Engine. Habilitar la API de Google Kubernetes Engine
- Si deseas usar Google Cloud CLI para esta tarea,
instala y, luego,
inicializa
gcloud CLI. Si ya instalaste gcloud CLI, ejecuta el comando
gcloud components updatepara obtener la versión más reciente. Es posible que las versiones anteriores de gcloud CLI 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,
pídele a tu administrador que te otorgue el rol de IAM de
administrador de Kubernetes Engine (roles/container.admin) en tu proyecto.
Para obtener más información sobre cómo otorgar roles, consulta Administra el acceso a proyectos, carpetas y organizaciones.
También puedes obtener los permisos necesarios a través de roles personalizados o cualquier otro rol predefinido.
Crea un clúster
Crea un clúster de GKE Standard 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
Reemplaza lo siguiente:
CLUSTER_NAME: Es el nombre del clúster nuevo.CONTROL_PLANE_LOCATION: Es la región o la zona del plano de control del clúster, comous-central1ous-central1-a.PROJECT_ID: Es el ID del proyecto de Google Cloud .CLUSTER_VERSION: Es la versión de GKE para tu clúster:- VMs Z4M:
1.36.3-gke.1767000o posterior - Todas las demás VMs o instancias de Bare Metal compatibles:
1.34.1-gke.1829001o posterior
- VMs Z4M:
Usa interfaces de 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 de RDMA con DRANET de GKE.
Habilita el controlador de DRANET administrado por GKE en un grupo de nodos de GPU
Para habilitar el controlador de DRANET de GKE en un grupo de nodos de GPU que admita
RDMA, agrega 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
Reemplaza lo siguiente:
NODE_POOL_NAME: es el nombre de tu grupo de nodos nuevo.REGION: Es la región de Google Cloud para tu clúster.CLUSTER_NAME: El nombre de tu clúster.ACCELERATOR_TYPE: Es el tipo de acelerador de GPU:Por ejemplo:
- VMs A4: ingresa
nvidia-b200. - VMs A3 Ultra: ingresa
nvidia-h200-141gb.
- VMs A4: ingresa
ACCELERATOR_COUNT: Es la cantidad de GPU que se deben adjuntar a los nodos del grupo de nodos. Por ejemplo, para las VMs a4-highgpu-8g y a3-ultragpu-8g, la cantidad de GPUs es 8.DRIVER_VERSION: Es la versión del controlador de GPU que se usará. Por ejemplo,defaultolatest.MACHINE_TYPE: el tipo de máquina para el grupo de nodos, por ejemplo,a3-ultragpu-8g.NUM_NODES: Es la cantidad de nodos para el grupo de nodos. Para flex-start, este valor debe establecerse en 0.RESERVATION_PROJECT: el ID del proyecto de la reserva.RESERVATION_NAME: Es el nombre de tu reserva. Para encontrar este valor, consulta Visualiza las solicitudes de reserva futuras.RESERVATION_BLOCK: Es el nombre de un bloque específico dentro de la reserva. Para encontrar este valor, consulta Visualiza las solicitudes de reserva futuras.
Este comando usa perfiles de red de acelerador para configurar automáticamente redes de VPC y subredes para tus VMs de acelerador. Como alternativa, puedes especificar de forma explícita tu red de VPC y las subredes.
Implementa recursos de RDMA para 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. En el siguiente manifiesto, se solicitan todos los dispositivosmrdmadisponibles en el nodo. Guarda el 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 manifiesto
kubectl apply -f all-mrdma-template.yamlImplementa tu carga de trabajo y haz referencia al
ResourceClaimTemplate. En el siguiente manifiesto, se implementa un Pod que hace referencia a la plantillaall-mrdma, que otorga al Pod acceso a las interfaces de RDMA en el 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 manifiesto
kubectl apply -f agnhost-rdma-pod.yamlVerifica que las interfaces de red asignadas adicionales sean visibles dentro del Pod.
kubectl exec agnhost-rdma -- ls /sys/class/netEn el siguiente resultado de ejemplo, se muestran las interfaces predeterminadas
eth0ylo, así como las interfaces de RDMA asignadas, comogpu0rdma0. La cantidad y los nombres de las interfaces de red (NIC) varían según el tipo de máquina del nodo de GKE.eth0 gpu0rdma0 gpu1rdma0 gpu2rdma0 gpu3rdma0 lo
Usa interfaces de red que no sean de RDMA en un grupo de nodo TPU
En las siguientes secciones, se describe cómo configurar un grupo de nodo TPU y una carga de trabajo para usar interfaces de red que no sean de RDMA con DRANET de GKE.
Verifica las DeviceClasses de redes
Verifica que los recursos de DeviceClass para las herramientas de redes existan en tu clúster.
kubectl get deviceclass netdev.google.com
El resultado es similar a lo siguiente:
NAME AGE
netdev.google.com 2d22h
Habilita el controlador de DRANET administrado por GKE en un grupo de nodos de porción de TPU
Para habilitar el controlador DRANET de GKE cuando crees un grupo de nodos de porción de TPU, agrega 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
Reemplaza lo siguiente:
NODE_POOL_NAME: Es el nombre de tu grupo de nodos nuevo.LOCATION: Es la región o zona de Google Cloud para tu clúster.CLUSTER_NAME: Es el nombre del clúster.NODE_LOCATIONS: Son las zonas de Google Cloud para los nodos del grupo de nodos.MACHINE_TYPE: Es el tipo de máquina que se usará para los nodos. Para obtener más información sobre los tipos de máquinas compatibles con TPU, consulta Elige la versión de TPU.TPU_TOPOLOGY: Es la topología de 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 Elige una topología.NUM_NODES: la cantidad de nodos en el grupo de nodos.
Para obtener más información, consulta Crea un grupo de nodos de porción de TPU de host único.
Implementa 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 alDeviceClassnetdev.google.com. En el siguiente manifiesto, se solicitan todos los dispositivos de red que no son de RDMA disponibles en el nodo.Guarda el 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 manifiesto
kubectl apply -f all-netdev-template.yamlImplementa tu carga de trabajo y haz referencia al
ResourceClaimTemplate. En el siguiente manifiesto, se implementa un Pod que usa la plantillaall-netdevpara otorgarle acceso a todos los dispositivos de red que no son de RDMA en el nodo. Guarda el 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-netdevReemplaza lo siguiente:
TPU_ACCELERATOR: Es el tipo de acelerador de TPU, por ejemplo,tpu-v5p-slice.TPU_TOPOLOGY: Es la topología de TPU, por ejemplo,2x4x4.
Aplica el manifiesto
kubectl apply -f netdev-pod.yamlVerifica que las interfaces de red asignadas adicionales sean visibles dentro del Pod.
kubectl exec agnhost-netdev -- ls /sys/class/netEn el siguiente resultado de ejemplo, se muestran las interfaces predeterminadas
eth0ylo, junto con los dispositivos de red asignados, que tienen nombres comoeth1yeth2. La cantidad de NIC y sus nombres variarán según el tipo de máquina del nodo de GKE.eth0 eth1 eth2 lo
Usa interfaces de RDMA en un grupo de nodos optimizado para el almacenamiento
En las siguientes secciones, se describe cómo configurar un grupo de nodos optimizado para el almacenamiento
y una carga de trabajo para usar interfaces de red RDMA con DRANET de GKE,
con una VM Z4M (z4m-highmem-192) como ejemplo.
Crea un grupo de nodos optimizado para el almacenamiento
Crea un grupo de nodos optimizado para el almacenamiento con la
marca --accelerator-network-profile=auto para que GKE
aprovisione y conecte de forma automática las redes de VPC, las subredes y las interfaces de red secundarias de Falcon
subyacentes. En los grupos de nodos de Z4M,
GKE habilita DRANET de forma predeterminada, por lo que no necesitas especificar la
etiqueta de nodo cloud.google.com/gke-networking-dra-driver=true cuando creas el
grupo de nodos. En este ejemplo, se usa el tipo de máquina z4m-highmem-192, que tiene NIC físicas
Titanium dobles y proporciona dos interfaces de RDMA. Para obtener la lista
de tipos de máquinas compatibles, consulta Requisitos.
gcloud container node-pools create NODE_POOL_NAME \
--cluster=CLUSTER_NAME \
--project=PROJECT_ID \
--zone=ZONE \
--machine-type=z4m-highmem-192 \
--num-nodes=NUM_NODES \
--accelerator-network-profile=auto
Reemplaza lo siguiente:
NODE_POOL_NAME: es el nombre de tu grupo de nodos nuevo.CLUSTER_NAME: El nombre de tu clúster.PROJECT_ID: Es el ID del proyecto de Google Cloud .ZONE: Es la zona de Google Cloud para tu grupo de nodos.NUM_NODES: Es la cantidad de nodos en el grupo de nodos. Para probar el tráfico de RDMA en los nodos con los Podsrdma-serveryrdma-clientde ejemplo, especifica al menos2.
Prepara la imagen de contenedor de la carga de trabajo optimizada para el almacenamiento
Las cargas de trabajo que usan Cloud RDMA en nodos optimizados para el almacenamiento requieren una
imagen de contenedor de Rocky Linux 8 con las bibliotecas de RDMA de espacio de usuario personalizadas
(rdma-core) para Cloud RDMA instaladas. No uses paquetes ascendentes predeterminados, ya que carecen de las extensiones de ABI personalizadas que requiere el controlador IRDMA del host y fallan en el entorno de ejecución con errores -ENOSPC. Para verificar las asignaciones de direcciones IP
y probar la conectividad de RDMA, también instala iproute,
libibverbs-utils, librdmacm-utils, infiniband-diags y perftest.
Para ver un ejemplo de Dockerfile que configura el repositorio de paquetes requerido, consulta
Prepara tu imagen de
Docker.
En el comando dnf install, incluye iproute para que puedas inspeccionar las asignaciones de IP con el comando ip.
Para obtener más información sobre los paquetes obligatorios, consulta
RPM de RDMA de Cloud.
Implementa una carga de trabajo con recursos de RDMA
Para asignar interfaces de RDMA a un Pod en un nodo optimizado para el almacenamiento, crea un
ResourceClaimTemplate que solicite el irdma.google.com DeviceClass:
Crea un manifiesto
ResourceClaimTemplatey guárdalo comoirdma-template.yaml:apiVersion: resource.k8s.io/v1 kind: ResourceClaimTemplate metadata: name: irdma-template spec: spec: devices: requests: - name: irdma exactly: deviceClassName: irdma.google.com allocationMode: ExactCount count: 2En el manifiesto se muestra lo siguiente:
deviceClassName: irdma.google.com: solicita interfaces de red de IRDMA administradas por DRANET de GKE en nodos optimizados para el almacenamiento.allocationMode: ExactCountycount: 2: solicita las dos interfaces de IRDMA disponibles en un nodoz4m-highmem-192. Si tu carga de trabajo solo necesita una interfaz de RDMA o si usas un tipo de máquina Z4M que proporciona una interfaz de IRDMA, especifica1.
Aplica el manifiesto
kubectl apply -f irdma-template.yamlCrea un manifiesto que defina dos Pods,
rdma-serveryrdma-client, para que puedas probar el tráfico de RDMA entre nodos. Cada Pod agrega la capacidadIPC_LOCKy hace referencia alResourceClaimTemplateirdma-template. Guarda el manifiesto comoirdma-pods.yaml:apiVersion: v1 kind: Pod metadata: name: rdma-server labels: app: perftest role: server spec: restartPolicy: Never affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: app operator: In values: ["perftest"] topologyKey: "kubernetes.io/hostname" containers: - name: perftest image: IMAGE_URI command: ["sleep", "infinity"] securityContext: capabilities: add: ["IPC_LOCK"] resources: claims: - name: irdma resourceClaims: - name: irdma resourceClaimTemplateName: irdma-template --- apiVersion: v1 kind: Pod metadata: name: rdma-client labels: app: perftest role: client spec: restartPolicy: Never affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: app operator: In values: ["perftest"] topologyKey: "kubernetes.io/hostname" containers: - name: perftest image: IMAGE_URI command: ["sleep", "infinity"] securityContext: capabilities: add: ["IPC_LOCK"] resources: claims: - name: irdma resourceClaims: - name: irdma resourceClaimTemplateName: irdma-templateReemplaza ambas instancias de
IMAGE_URIpor el URI de tu imagen de contenedor de Rocky Linux 8 RDMA.En el manifiesto se muestra lo siguiente:
metadata.labels: Etiqueta cada Pod conapp: perftesty una etiquetarole. Ambos Pods comparten la etiquetaapp: perftestpara que se les aplique la regla de antiafinidad. La etiquetaroledistingue el Podrdma-server(role: server) del Podrdma-client(role: client) para que puedas probar la conectividad de RDMA de Pod a Pod en los nodos.affinity.podAntiAffinity: Impide que Kubernetes programe Pods que compartan la etiquetaapp: perftesten el mismo nodo. Debido a que ambos Pods tienen esta etiqueta, se ejecutan en hosts físicos independientes para las pruebas de RDMA entre nodos, incluso cuando tuResourceClaimTemplatesolicita solo una interfaz (count: 1). Tu grupo de nodos debe tener al menos dos nodos para programar ambos Pods.securityContext.capabilities.add: ["IPC_LOCK"]: Permite que el contenedor bloquee las páginas de memoria, lo que es necesario para que las bibliotecas de espacio de usuario de RDMA registren regiones de memoria para el acceso directo a la memoria.spec.resourceClaims: Genera unResourceClaimespecífico del Pod (llamadoirdma) a partir delResourceClaimTemplatedeirdma-template.containers.resources.claims: Otorga al contenedorperftestacceso a las interfaces asignadas por la reclamaciónirdma.
Aplica el manifiesto
kubectl apply -f irdma-pods.yamlVerifica que las interfaces de RDMA asignadas (
rdma0yrdma1) estén visibles dentro del Pod del servidor:kubectl exec rdma-server -- ip -br addr showEl resultado es similar a lo siguiente:
lo UNKNOWN 127.0.0.1/8 rdma1 UP 10.5.0.3/32 rdma0 UP 10.31.0.3/32 eth0@if18 UP 10.120.2.6/32
Para verificar el tráfico de RDMA entre los dos Pods, ejecuta rping entre
rdma-server y rdma-client:
Inicia el servidor
rpingen el Pod del servidor:kubectl exec -it rdma-server -- rping -s -a RDMA_IP -v -dReemplaza
RDMA_IPpor la dirección IPrdma0ordma1del Pod del servidor, como10.31.0.3.En una segunda terminal, ejecuta el cliente
rpingen el Pod del cliente:kubectl exec -it rdma-client -- rping -c -a RDMA_IP -C 5 -v -dEn el resultado del cliente, verifica los siguientes indicadores de una conexión de RDMA correcta:
RDMA_CM_EVENT_ADDR_RESOLVEDyRDMA_CM_EVENT_ROUTE_RESOLVED: confirma que el administrador de comunicación de RDMA resolvió la dirección IP y la ruta de RDMA de destino.ESTABLISHEDyrdma_connect successful: Confirma que el cliente creó el par de colas (qp), la cola de finalización (cq) y el dominio de protección (pd), y estableció la conexión de RDMA.- Cinco entradas
send completion,recv completionyping data: rdma-ping-: Confirma que se completaron cinco iteraciones de ida y vuelta de lectura y escritura de RDMA en la interfaz de RDMA antes de cerrar la conexión (destroy cm_id).
Habilita DRANET con ComputeClass personalizada
Para usar DRANET administrado por GKE en clústeres de Autopilot o con el aprovisionamiento automático de nodos en clústeres de Standard, debes usar un recurso ComputeClass personalizado para habilitar la función.
Crea un manifiesto de ComputeClass que habilite el controlador de DRANET y establezca el perfil de red del acelerador en
auto:apiVersion: cloud.google.com/v1 kind: ComputeClass metadata: name: dranet-compute-class spec: nodePoolAutoCreation: enabled: true nodePoolConfig: dra: networking: enabled: true priorities: - machineType: MACHINE_TYPE # Omit the gpu section for storage-optimized VMs (such as Z4M). gpu: count: GPU_COUNT type: GPU_TYPE acceleratorNetworkProfile: autoReemplaza lo siguiente:
MACHINE_TYPE: Es el tipo de máquina para el grupo de nodos, comoa3-ultragpu-8goz4m-highmem-192.GPU_COUNT: Es la cantidad de GPU para el tipo de máquina.GPU_TYPE: Es el tipo de GPU, comonvidia-h200.
Aplica el manifiesto
kubectl apply -f COMPUTE_CLASS_FILENAME.yamlEn la especificación del Pod, haz referencia a la ComputeClass con el selector de nodos
cloud.google.com/compute-class:apiVersion: v1 kind: Pod metadata: name: dranet-pod spec: nodeSelector: cloud.google.com/compute-class: "dranet-compute-class" ...
Solicita una cantidad específica de dispositivos de red
En los ejemplos anteriores de GPU y TPU, se muestra cómo solicitar todos los dispositivos de red disponibles
de un tipo determinado configurando allocationMode como All. Para solicitar una
cantidad específica de dispositivos, establece allocationMode en ExactCount en
tu ResourceClaimTemplate, como se muestra en Implementa una carga de trabajo con recursos
de RDMA.
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
¿Qué sigue?
- Obtén más información sobre la asignación dinámica de recursos.
- Obtén más información para configurar las redes automatizadas para las VMs de aceleradores.