DRANET di Google Kubernetes Engine (GKE) è una funzionalità GKE gestita che si basa sul progetto DRANET open source, che implementa l'API DRA di Kubernetes per le risorse di networking. DRANET ti consente di richiedere e allocare risorse di networking ad alte prestazioni per i tuoi pod, incluse le interfacce di rete che supportano l'accesso diretto alla memoria remota (RDMA). Questo approccio fornisce un'API portatile e allineata con l'upstream per la gestione delle risorse di rete.
Questo documento fornisce una panoramica concettuale di GKE DRANET e mostra come allocare le risorse di rete ai workload nei tuoi cluster GKE.
Questo documento è rivolto ad architetti cloud e specialisti di networking che progettano reti per le loro organizzazioni. Per una panoramica di tutta la documentazione di GKE, consulta Esplora la documentazione di GKE. Per scoprire di più sui ruoli e sulle attività comuni a cui si fa riferimento nei contenuti di Google Cloud , consulta Ruoli e attività comuni degli utenti GKE.
Prima di leggere questo documento, assicurati di avere familiarità con quanto segue:
- Allocazione dinamica delle risorse
- Informazioni sull'allocazione dinamica delle risorse in GKE
- Concetti di base di Kubernetes
- Networking di GKE
- Nozioni di base sul networking di GKE
Come funziona DRANET gestito da GKE
DRANET gestito da GKE viene implementato tramite un DaemonSet networking-dra-driver. Questo DaemonSet viene eseguito su nodi con GPU, TPU o VM ottimizzate per l'archiviazione con GKE DRANET abilitato.
Funziona come un agente a livello di nodo per rendere le interfacce di rete rilevabili e allocabili ai pod tramite le API di allocazione dinamica delle risorse (DRA) di Kubernetes.
In GKE 1.34.1-gke.1829001 e versioni successive, GKE installa automaticamente le risorse DeviceClass per il networking. Queste classi definiscono i tipi di dispositivi di rete che puoi richiedere. Ad esempio,
GKE crea la classe mrdma.google.com per le VM GPU, la
classe netdev.google.com per le TPU e altri dispositivi di rete e la
classe irdma.google.com per le VM ottimizzate per l'archiviazione (come Z4M).
Per utilizzare GKE DRANET, devi prima attivare il driver GKE DRANET su un pool di nodi con GPU, TPU o VM ottimizzate per l'archiviazione.
Per richiedere dispositivi di rete per un workload, definisci un ResourceClaimTemplate.
Questo template specifica DeviceClass e la modalità di allocazione, ad esempio la richiesta di tutti i dispositivi disponibili su un nodo. Nella specifica del pod, fai riferimento a questo template in un campo resourceClaims per concedere al pod l'accesso alle interfacce di rete richieste sul nodo.
Quando utilizzare DRANET gestito da GKE
GKE DRANET fornisce un modo standardizzato per gestire le risorse di rete che tengono conto della topologia e delle dipendenze. Questa standardizzazione lo rende una soluzione adatta per AI e ML, file system paralleli di grandi dimensioni e altri workload di archiviazione ad alta intensità di dati che richiedono un networking ad alte prestazioni.
I casi d'uso comuni per la richiesta di interfacce di rete per un pod includono:
- Richiesta di tutte le interfacce compatibili con RDMA disponibili.
- Richiedere un numero specifico di interfacce compatibili con RDMA.
- Richiesta di tutte le interfacce non RDMA disponibili.
- Richiesta di un numero specifico di interfacce non RDMA.
Considerazioni principali sull'utilizzo di DRANET gestito da GKE per il networking
Tieni presente quanto segue quando utilizzi DRANET di GKE per il networking:
Interfacce di rete dedicate
Quando utilizzi GKE DRANET per richiedere un'interfaccia di rete per un pod, l'interfaccia è dedicata a quel pod. Altri pod sullo stesso nodo non possono condividerlo. Questo approccio contribuisce a garantire che il pod abbia accesso esclusivo alla larghezza di banda e alle risorse complete di quell'interfaccia, il che rappresenta un vantaggio chiave per i carichi di lavoro sensibili alle prestazioni.
Utilizza il driver DRANET gestito da GKE in modo indipendente
Puoi attivare il driver DRA di GKE per gestire le risorse di rete senza attivare altri driver DRANET di GKE. Per farlo, aggiungi l'etichetta
cloud.google.com/gke-networking-dra-driver=truea un pool di nodi con GPU, TPU o VM ottimizzate per lo spazio di archiviazione.Utilizza altri driver DRA GKE
Per ottenere un throughput più elevato nei workload di AI/ML più impegnativi, combina l'API DRA per gli acceleratori (come GPU e TPU) con il networking gestito DRANET di GKE. Questo approccio combinato migliora l'allineamento delle risorse e la consapevolezza della topologia. Per scoprire di più sull'utilizzo di DRA per altre risorse, consulta Prepara l'infrastruttura GKE per i carichi di lavoro DRA.
Evita configurazioni in conflitto
Il driver DRANET di GKE gestisce le interfacce RDMA e le gVNIC che non hanno intervalli di indirizzi IP secondari configurati. Non utilizzare contemporaneamente il driver DRANET di GKE e l'API multi-rete di GKE con una risorsa di rete di tipo
Devicenello stesso cluster. L'utilizzo combinato del driver e dell'API non è supportato perché entrambe le API tentano di gestire lo stesso insieme di NIC, il che può portare a una configurazione errata e a un comportamento imprevedibile.Ciclo di vita gestito del driver DRANET
In GKE versione 1.34 e successive, GKE crea automaticamente lo spazio dei nomi
gke-managed-networking-dra-drivergestito nel cluster. Analogamente a diversi altri workload di sistema GKE, i pod del driver DRANET vengono eseguiti solo sui nodi in cui sono pertinenti (ad esempio nodi con GPU, TPU e altro hardware specializzato). Sui nodi in cui il driver non è pertinente, non vengono eseguiti pod per questo driver. Non modificare manualmente il DaemonSetnetworking-dra-driver. Le modifiche manuali, come l'aggiornamento del camponodeAffinity, possono interferire con la gestione della funzionalità DRANET da parte di GKE e causare la pianificazione dei pod del daemon DRANET su nodi non supportati.
Requisiti
Per utilizzare DRANET gestito da GKE, il tuo ambiente deve soddisfare i seguenti requisiti:
- Standard: 1.34.1-gke.1829001 o versioni successive (1.36.3-gke.1767000 o versioni successive per le VM Z4M).
- Autopilot: 1.35.2-gke.1842000 o versioni successive (1.37.0-gke.4713000 o versioni successive per le VM Z4M).
- GKE Dataplane V2 è abilitato nel cluster.
Devi inoltre utilizzare uno dei seguenti tipi di macchine ottimizzate per l'acceleratore o per l'archiviazione:
| Serie di macchine | Tipo di macchina | Modello di acceleratore | Tecnologia di networking | 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 | Qualsiasi tipo di macchina Z4M che supporta IRDMA | Non applicabile (ottimizzato per l'archiviazione) | RDMA | irdma.google.com |
Limitazioni
GKE DRANET presenta le seguenti limitazioni:
- Non puoi utilizzare GKE DRANET per allocare la scheda di interfaccia di rete (NIC) predefinita o le NIC virtuali (come veth).
- Alcuni tipi di istanze, in particolare i nodi bare metal come
a4x-max, non sono compatibili con i cluster con scalabilità automatica e Autopilot.
Considerazioni specifiche per la macchina
A seconda dell'architettura hardware sottostante dei nodi, alcune serie di macchine richiedono flag aggiuntivi per i pool di nodi, pacchetti di immagini container o DaemonSet di sistema per configurare le interfacce RDMA con GKE DRANET.
A4X Max Bare Metal
- Esegui il deployment di asapd-lite: quando utilizzi nodi GPU bare metal, come A4X Max, devi eseguire il deployment del DaemonSet
asapd-litenel tuo cluster. Il DaemonSetasapd-liteconfigura le schede di interfaccia di rete (NIC) RDMA. Senza questo, le interfacce secondarie non vengono create e il driverdranetfiltra le NIC RDMA, impedendo la funzionalità RDMA all'interno dei pod. Per istruzioni complete sulla configurazione, consulta Configura le NIC MRDMA con asapd-lite.
VM Z4M ottimizzate per l'archiviazione
- Requisiti delle immagini container: per utilizzare RDMA sulle istanze Z4M, devi utilizzare un'immagine container Rocky Linux 8 configurata con i pacchetti RDMA dello spazio utente richiesti. Altre distribuzioni, come Ubuntu o Debian, non sono supportate.
I pacchetti upstream standard per queste distribuzioni non dispongono delle estensioni ABI personalizzate richieste dal driver IRDMA. Senza queste estensioni, i pacchetti non funzionano in fase di runtime e viene visualizzato un errore
-ENOSPC. Per istruzioni sulla configurazione, consulta Utilizza le interfacce RDMA in un pool di nodi ottimizzato per l'archiviazione.
Prima di iniziare
Prima di iniziare, assicurati di aver eseguito le seguenti attività:
- Abilita l'API Google Kubernetes Engine. Abilita l'API Google Kubernetes Engine
- Per utilizzare Google Cloud CLI per questa attività,
installala e poi
inizializza
gcloud CLI. Se hai già installato gcloud CLI, scarica l'ultima
versione eseguendo il comando
gcloud components update. Le versioni precedenti di gcloud CLI potrebbero non supportare l'esecuzione dei comandi in questo documento.
Ruoli obbligatori
Per ottenere le autorizzazioni necessarie per creare node pool e allocare risorse di rete, chiedi all'amministratore di concederti il ruolo IAM Kubernetes Engine Admin (roles/container.admin) nel progetto.
Per saperne di più sulla concessione dei ruoli, consulta Gestisci l'accesso a progetti, cartelle e organizzazioni.
Potresti anche riuscire a ottenere le autorizzazioni richieste tramite i ruoli personalizzati o altri ruoli predefiniti.
Crea un cluster
Crea un cluster GKE Standard che utilizza GKE Dataplane V2:
gcloud container clusters create CLUSTER_NAME \
--enable-dataplane-v2 \
--region=CONTROL_PLANE_LOCATION \
--project=PROJECT_ID \
--cluster-version=CLUSTER_VERSION
Sostituisci quanto segue:
CLUSTER_NAME: il nome del nuovo cluster.CONTROL_PLANE_LOCATION: la regione o la zona del control plane del cluster, ad esempious-central1ous-central1-a.PROJECT_ID: il tuo ID progetto Google Cloud .CLUSTER_VERSION: la versione di GKE per il tuo cluster:- VM Z4M:
1.36.3-gke.1767000o versioni successive - Tutte le altre VM o istanze bare metal supportate:
1.34.1-gke.1829001o versioni successive
- VM Z4M:
Utilizza le interfacce RDMA da un pool di nodi GPU
Le sezioni seguenti descrivono come configurare un pool di nodi di GPU e un workload per utilizzare le interfacce di rete RDMA con GKE DRANET.
Abilita il driver DRANET gestito da GKE su un pool di nodi GPU
Per abilitare il driver GKE DRANET su un pool di nodi GPU che supporta RDMA, aggiungi l'etichetta cloud.google.com/gke-networking-dra-driver=true quando crei il pool di nodi.
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
Sostituisci quanto segue:
NODE_POOL_NAME: il nome del nuovo pool di nodi.REGION: la regione Google Cloud del tuo cluster.CLUSTER_NAME: il nome del tuo cluster.ACCELERATOR_TYPE: il tipo di acceleratore GPU:Ad esempio:
- VM A4: inserisci
nvidia-b200. - VM A3 Ultra: inserisci
nvidia-h200-141gb.
- VM A4: inserisci
ACCELERATOR_COUNT: il numero di GPU da collegare ai nodi nel pool di nodi. Ad esempio, per le VM a4-highgpu-8g e a3-ultragpu-8g, la quantità di GPU è 8.DRIVER_VERSION: la versione del driver GPU da utilizzare. Ad esempio:defaultolatest.MACHINE_TYPE: il tipo di macchina per il pool di nodi, ad esempioa3-ultragpu-8g.NUM_NODES: il numero di nodi per il pool di nodi. Per flex-start, questo valore deve essere impostato su 0.RESERVATION_PROJECT: l'ID progetto della prenotazione.RESERVATION_NAME: il nome della prenotazione. Per trovare questo valore, consulta Visualizza le richieste di prenotazione futura.RESERVATION_BLOCK: il nome di un blocco specifico all'interno della prenotazione. Per trovare questo valore, consulta Visualizza le richieste di prenotazione futura.
Questo comando utilizza i profili di rete dell'acceleratore per configurare automaticamente le reti e le subnet VPC per le VM con acceleratore. In alternativa, puoi specificare esplicitamente la rete VPC e le subnet.
Esegui il deployment di un workload con risorse RDMA
Per allocare risorse RDMA per un pod, specifica un ResourceClaimTemplate.
Crea un
ResourceClaimTemplateper definire come allocare i dispositivi RDMA. Il seguente manifest richiede tutti i dispositivimrdmadisponibili sul nodo. Salva il manifest comeall-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: AllApplica il manifest:
kubectl apply -f all-mrdma-template.yamlEsegui il deployment del workload e fai riferimento a
ResourceClaimTemplate. Il seguente manifest esegue il deployment di un pod che fa riferimento al templateall-mrdma, che concede al pod l'accesso alle interfacce RDMA sul nodo. Salva il manifest comeagnhost-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-mrdmaApplica il manifest:
kubectl apply -f agnhost-rdma-pod.yamlVerifica che le interfacce di rete allocate aggiuntive siano visibili all'interno del pod.
kubectl exec agnhost-rdma -- ls /sys/class/netL'output di esempio seguente mostra le interfacce predefinite
eth0elo, nonché le interfacce RDMA allocate, comegpu0rdma0. Il numero e i nomi delle interfacce di rete (NIC) variano in base al tipo di macchina del nodo GKE.eth0 gpu0rdma0 gpu1rdma0 gpu2rdma0 gpu3rdma0 lo
Utilizza interfacce di rete non RDMA in un pool di nodi TPU
Le sezioni seguenti descrivono come configurare un pool di nodi TPU e un workload per utilizzare interfacce di rete non RDMA con GKE DRANET.
Verifica le DeviceClass di networking
Verifica che le risorse DeviceClass per il networking esistano nel tuo cluster.
kubectl get deviceclass netdev.google.com
L'output è simile al seguente:
NAME AGE
netdev.google.com 2d22h
Abilita il driver DRANET gestito da GKE su un pool di nodi di sezioni TPU
Per abilitare il driver DRANET di GKE durante la creazione di un pool di nodi di sezioni TPU, aggiungi l'etichetta 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
Sostituisci quanto segue:
NODE_POOL_NAME: il nome del nuovo pool di nodi.LOCATION: la regione o la zona Google Cloud del tuo cluster.CLUSTER_NAME: il nome del tuo cluster.NODE_LOCATIONS: le zone Google Cloud per i nodi nel pool di nodi.MACHINE_TYPE: il tipo di macchina da utilizzare per i nodi. Per saperne di più sui tipi di macchine compatibili con TPU, consulta Scegli la versione della TPU.TPU_TOPOLOGY: la topologia TPU, ad esempio2x4x4. Il formato della topologia dipende dalla versione della TPU. Per saperne di più sulle topologie TPU, consulta Scegli una topologia.NUM_NODES: il numero di nodi nel pool di nodi.
Per saperne di più, consulta Crea un pool di nodi di sezioni TPU single-host.
Esegui il deployment di un workload che richiede tutti i dispositivi di rete
Per allocare dispositivi di rete non RDMA per un pod, specifica un ResourceClaimTemplate.
Crea un
ResourceClaimTemplateche faccia riferimento anetdev.google.comDeviceClass. Il seguente manifest richiede tutti i dispositivi di rete non RDMA disponibili sul nodo.Salva il manifest come
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: AllApplica il manifest:
kubectl apply -f all-netdev-template.yamlEsegui il deployment del workload e fai riferimento a
ResourceClaimTemplate. Il seguente manifest esegue il deployment di un pod che utilizza il templateall-netdevper concedere al pod l'accesso a tutti i dispositivi di rete non RDMA sul nodo. Salva il manifest comenetdev-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-netdevSostituisci quanto segue:
TPU_ACCELERATOR: il tipo di acceleratore TPU, ad esempiotpu-v5p-slice.TPU_TOPOLOGY: la topologia TPU, ad esempio2x4x4.
Applica il manifest:
kubectl apply -f netdev-pod.yamlVerifica che le interfacce di rete allocate aggiuntive siano visibili all'interno del pod.
kubectl exec agnhost-netdev -- ls /sys/class/netL'output di esempio seguente mostra le interfacce predefinite
eth0elo, insieme ai dispositivi di rete allocati, che hanno nomi comeeth1eeth2. Il numero di NIC e i relativi nomi variano in base al tipo di macchina del nodo GKE.eth0 eth1 eth2 lo
Utilizza le interfacce RDMA in un pool di nodi ottimizzato per l'archiviazione
Le sezioni seguenti descrivono come configurare un pool di nodi e un workload ottimizzati per l'archiviazione in modo da utilizzare le interfacce di rete RDMA con GKE DRANET, utilizzando come esempio una VM Z4M (z4m-highmem-192).
Crea un pool di nodi ottimizzato per l'archiviazione
Crea un pool di nodi ottimizzato per l'archiviazione con il flag --accelerator-network-profile=auto in modo che GKE esegua automaticamente il provisioning e il collegamento delle reti VPC Falcon, delle subnet e delle interfacce di rete secondarie sottostanti. Sui node pool Z4M, GKE attiva DRANET per impostazione predefinita, quindi non è necessario specificare l'etichetta del nodo cloud.google.com/gke-networking-dra-driver=true quando crei il pool di nodi. Questo esempio utilizza il tipo di macchina z4m-highmem-192, che dispone di NIC Titanium fisiche doppie e fornisce due interfacce RDMA. Per l'elenco dei tipi di macchine supportati, consulta Requisiti.
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
Sostituisci quanto segue:
NODE_POOL_NAME: il nome del nuovo pool di nodi.CLUSTER_NAME: il nome del tuo cluster.PROJECT_ID: il tuo ID progetto Google Cloud .ZONE: la zona Google Cloud per il tuo node pool.NUM_NODES: il numero di nodi nel pool di nodi. Per testare il traffico RDMA tra i nodi con i pod di esempiordma-servererdma-client, specifica almeno2.
Prepara l'immagine container del workload ottimizzato per lo spazio di archiviazione
I workload che utilizzano Cloud RDMA su nodi ottimizzati per l'archiviazione richiedono un'immagine container Rocky Linux 8 con le librerie RDMA personalizzate dello spazio utente (rdma-core) installate per Cloud RDMA. Non utilizzare i pacchetti upstream predefiniti, in quanto non dispongono delle estensioni ABI personalizzate richieste dal driver IRDMA host e non funzionano in fase di runtime con errori -ENOSPC. Per verificare le assegnazioni degli indirizzi IP e testare la connettività RDMA, installa anche iproute, libibverbs-utils, librdmacm-utils, infiniband-diags e perftest.
Per un esempio di Dockerfile che configura il Package Repository richiesto, consulta Prepara l'immagine Docker.
Nel comando dnf install, includi iproute in modo da poter ispezionare le assegnazioni IP con il comando ip.
Per saperne di più sui pacchetti richiesti, consulta
RPM
Cloud RDMA.
Esegui il deployment di un workload con risorse RDMA
Per allocare interfacce RDMA a un pod su un nodo ottimizzato per l'archiviazione, crea un
ResourceClaimTemplate che richiede irdma.google.com DeviceClass:
Crea un manifest
ResourceClaimTemplatee salvalo comeirdma-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: 2In questo manifest:
deviceClassName: irdma.google.com: richiede interfacce di rete IRDMA gestite da GKE DRANET su nodi ottimizzati per l'archiviazione.allocationMode: ExactCountecount: 2: richiedono entrambe le interfacce IRDMA disponibili su un nodoz4m-highmem-192. Se il tuo workload richiede una sola interfaccia RDMA o se utilizzi un tipo di macchina Z4M che fornisce un'interfaccia IRDMA, specifica1.
Applica il manifest:
kubectl apply -f irdma-template.yamlCrea un manifest che definisca due pod,
rdma-servererdma-client, in modo da poter testare il traffico RDMA tra i nodi. Ogni pod aggiunge la funzionalitàIPC_LOCKe fa riferimento airdma-templateResourceClaimTemplate. Salva il manifest comeirdma-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-templateSostituisci entrambe le istanze di
IMAGE_URIcon l'URI della tua immagine container RDMA Rocky Linux 8.In questo manifest:
metadata.labels: etichetta ogni pod conapp: perfteste un'etichettarole. Entrambi i pod condividono l'etichettaapp: perftestin modo che la regola di anti-affinità venga applicata. L'etichettaroledistingue il podrdma-server(role: server) dal podrdma-client(role: client) in modo da poter testare la connettività RDMA da pod a pod tra i nodi.affinity.podAntiAffinity: impedisce a Kubernetes di pianificare i pod che condividono l'etichettaapp: perftestsullo stesso nodo. Poiché entrambi i pod hanno questa etichetta, vengono eseguiti su host fisici separati per i test RDMA tra nodi, anche quandoResourceClaimTemplaterichiede una sola interfaccia (count: 1). Il tuo pool di nodi deve avere almeno due nodi per pianificare entrambi i pod.securityContext.capabilities.add: ["IPC_LOCK"]: consente al container di bloccare le pagine di memoria, operazione necessaria per consentire alle librerie dello spazio utente RDMA di registrare le regioni di memoria per l'accesso diretto alla memoria.spec.resourceClaims: genera unResourceClaimspecifico per il pod (denominatoirdma) dalResourceClaimTemplateirdma-template.containers.resources.claims: concede al containerperftestl'accesso alle interfacce allocate dalla richiestairdma.
Applica il manifest:
kubectl apply -f irdma-pods.yamlVerifica che le interfacce RDMA allocate (
rdma0erdma1) siano visibili all'interno del pod del server:kubectl exec rdma-server -- ip -br addr showL'output è simile al seguente:
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
Per verificare il traffico RDMA tra i due pod, esegui rping tra
rdma-server e rdma-client:
Avvia il server
rpingnel pod del server:kubectl exec -it rdma-server -- rping -s -a RDMA_IP -v -dSostituisci
RDMA_IPcon l'indirizzo IPrdma0ordma1del pod server, ad esempio10.31.0.3.In un secondo terminale, esegui il client
rpingsul pod client:kubectl exec -it rdma-client -- rping -c -a RDMA_IP -C 5 -v -dNell'output del client, verifica i seguenti indicatori di una connessione RDMA riuscita:
RDMA_CM_EVENT_ADDR_RESOLVEDeRDMA_CM_EVENT_ROUTE_RESOLVED: conferma che RDMA Communication Manager ha risolto l'indirizzo IP e la route RDMA di destinazione.ESTABLISHEDerdma_connect successful: conferma che il client ha creato la coppia di code (qp), la coda di completamento (cq) e il dominio di protezione (pd) e ha stabilito la connessione RDMA.- Cinque voci
send completion,recv completioneping data: rdma-ping-: confermano che cinque iterazioni di andata e ritorno di lettura e scrittura RDMA sono state completate sull'interfaccia RDMA prima di chiudere la connessione (destroy cm_id).
Abilita DRANET con ComputeClass personalizzata
Per utilizzare DRANET gestito da GKE nei cluster Autopilot o con il provisioning automatico dei nodi nei cluster Standard, devi utilizzare una risorsa ComputeClass personalizzata per attivare la funzionalità.
Crea un manifest ComputeClass che attiva il driver DRANET e imposta il profilo di rete dell'acceleratore su
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: autoSostituisci quanto segue:
MACHINE_TYPE: il tipo di macchina per il node pool, ad esempioa3-ultragpu-8goz4m-highmem-192.GPU_COUNT: il numero di GPU per il tipo di macchina.GPU_TYPE: il tipo di GPU, ad esempionvidia-h200.
Applica il manifest:
kubectl apply -f COMPUTE_CLASS_FILENAME.yamlNella specifica del pod, fai riferimento alla classe ComputeClass utilizzando il selettore di nodi
cloud.google.com/compute-class:apiVersion: v1 kind: Pod metadata: name: dranet-pod spec: nodeSelector: cloud.google.com/compute-class: "dranet-compute-class" ...
Richiedi un numero specifico di dispositivi di rete
Gli esempi di GPU e TPU precedenti mostrano come richiedere tutti i dispositivi di rete disponibili di un determinato tipo impostando allocationMode su All. Per richiedere un
numero specifico di dispositivi, imposta allocationMode su ExactCount nel
tuo ResourceClaimTemplate, come mostrato in Esegui il deployment di un workload con risorse
RDMA.
L'esempio seguente richiede due dispositivi di rete 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
Passaggi successivi
- Scopri di più sull'allocazione dinamica delle risorse.
- Scopri di più su come configurare il networking automatizzato per le VM con acceleratore.