使用 GKE 管理的 DRANET 分配网络资源

Google Kubernetes Engine (GKE) DRANET 是一项托管式 GKE 功能,基于开源 DRANET 项目构建,该项目为网络资源实现了 Kubernetes DRA API。DRANET 允许您为 Pod 请求和分配高性能网络资源,包括支持远程直接内存访问 (RDMA) 的网络接口。此方法可为网络资源管理提供可移植、与上游一致的 API。

本文档从概念上简要介绍了 GKE DRANET,并展示了如何为 GKE 集群中的工作负载分配网络资源。

本文档适用于为组织设计网络的云架构师和网络专家。如需简要了解所有 GKE 文档,请参阅探索 GKE 文档。如需了解我们在 Google Cloud 内容中提及的常见角色和任务,请参阅常见的 GKE 用户角色和任务。

在阅读本文档之前,请确保您熟悉以下内容:

GKE 管理的 DRANET 的工作原理

GKE 管理的 DRANET 通过 networking-dra-driver DaemonSet 实现。此 DaemonSet 在具有启用了 GKE DRANET 的 GPU、TPU 或存储优化型虚拟机的节点上运行。

它充当节点级代理,通过 Kubernetes 动态资源分配 (DRA) API 使网络接口可被 Pod 发现和分配。

在 GKE 1.34.1-gke.1829001 版及更高版本中,GKE 会自动安装用于网络的 DeviceClass 资源。这些类定义了您可以请求的网络设备类型。例如,GKE 会为 GPU 虚拟机创建 mrdma.google.com 类,为 TPU 和其他网络设备创建 netdev.google.com 类,为存储优化型虚拟机(例如 Z4M)创建 irdma.google.com 类。

如需使用 GKE DRANET,您首先需要在具有 GPU、TPU 或存储优化型虚拟机的节点池启用 GKE DRANET 驱动程序。

如需为工作负载请求网络设备,请定义 ResourceClaimTemplate。此模板指定 DeviceClass 和分配模式,例如请求节点上的所有可用设备。在 Pod 规范中,在 resourceClaims 字段中引用此模板,以授予 Pod 对节点上请求的网络接口的访问权限。

何时使用 GKE 管理的 DRANET

GKE DRANET 提供了一种标准化方式来管理了解拓扑和依赖项的网络资源。这种标准化使其成为 AI 和机器学习、大型并行文件系统以及其他需要高性能网络的数据密集型存储工作负载的理想解决方案。

为 Pod 请求网络接口的常见应用场景包括:

  • 请求所有可用的支持 RDMA 的接口。
  • 请求特定数量的支持 RDMA 的接口。
  • 请求所有可用的非 RDMA 接口。
  • 请求特定数量的非 RDMA 接口。

将 GKE 管理的 DRANET 用于网络时的主要考虑事项

将 GKE DRANET 用于网络时,请考虑以下几点:

  • 专用网络接口

    使用 GKE DRANET 为 Pod 声明网络接口时,该接口专用于该 Pod。同一节点上的其他 Pod 无法共享该接口。此方法有助于确保 Pod 独占对相应接口的完整带宽和资源的访问权限,这对于对性能敏感的工作负载来说是一项关键优势。

  • 单独使用 GKE 托管的 DRANET 驱动程序

    您可以启用 GKE DRA 驱动程序来管理网络资源,而无需启用其他 GKE DRANET 驱动程序。为此,请将 cloud.google.com/gke-networking-dra-driver=true 标签添加到具有 GPU、TPU 或存储优化虚拟机的节点池。

  • 使用其他 GKE DRA 驱动程序

    为了在要求苛刻的 AI/机器学习工作负载中实现更高的吞吐量,请将加速器(如 GPU 和 TPU)的 DRA API 与 GKE DRANET 托管式网络相结合。这种组合方法可提高资源一致性和拓扑感知度。如需详细了解如何将 DRA 用于其他资源,请参阅为 DRA 工作负载准备 GKE 基础设施。

  • 避免配置冲突

    GKE DRANET 驱动程序管理未配置任何次要 IP 地址范围的 RDMA 接口和 gVNIC。请勿在同一集群中同时将 GKE DRANET 驱动程序和 GKE 多网络 API 用于 Device 类型的网络资源。不支持同时使用驱动程序和 API,因为这两个 API 都会尝试管理同一组 NIC,这可能会导致设置不正确和行为不可预测。

  • DRANET 驱动程序的代管式生命周期

    在 GKE 1.34 版及更高版本中,GKE 会自动在集群中创建代管式 gke-managed-networking-dra-driver 命名空间。与多个其他 GKE 系统工作负载类似,DRANET 驱动程序的 Pod 仅在相关节点(例如具有 GPU、TPU 和其他专用硬件的节点)上运行。在与驱动程序无关的节点上,不会运行此驱动程序的 Pod。请勿手动修改 networking-dra-driver DaemonSet。手动更改(例如更新 nodeAffinity 字段)可能会干扰 GKE 对 DRANET 功能的管理,并导致 DRANET 守护程序 Pod 在不受支持的节点上进行调度。

要求

如需使用 GKE 管理的 DRANET,您的环境必须满足以下要求:

  • Standard:1.34.1-gke.1829001 或更高版本(对于 Z4M 虚拟机,为 1.36.3-gke.1767000 或更高版本)。
  • Autopilot:1.35.2-gke.1842000 或更高版本(对于 Z4M 虚拟机,为 1.37.0-gke.4713000 或更高版本)。
  • 集群上已启用 GKE Dataplane V2。

您还必须使用以下加速器优化型或存储优化型机器类型之一:

机器系列 机器类型 加速器模型 网络技术 DeviceClass
A3 Ultra a3-ultragpu-8g NVIDIA H200 GPU RDMA mrdma.google.com
A4 a4-highgpu-8g NVIDIA B200 GPU RDMA mrdma.google.com
A4X a4x-highgpu-4g NVIDIA GB200 GPU RDMA mrdma.google.com
A4X Max a4x-maxgpu-4g-metal NVIDIA B300 GPU RDMA mrdma.google.com
TPU v7 tpu7x-standard-4t TPU v7 NetDevice netdev.google.com
TPU v6e ct6e-standard-8t Trillium TPU NetDevice netdev.google.com
TPU v6e ct6e-standard-4t Trillium TPU NetDevice netdev.google.com
TPU v6e ct6e-standard-1t Trillium TPU NetDevice netdev.google.com
Z4M 支持 IRDMA 的任何 Z4M 机器类型 不适用(存储优化型) RDMA irdma.google.com

限制

GKE DRANET 存在以下限制:

  • 您无法使用 GKE DRANET 分配默认网络接口卡 (NIC) 或虚拟 NIC(例如 veth)。
  • 某些实例类型(特别是裸金属节点,例如 a4x-max)与自动扩缩和 Autopilot 集群不兼容。

特定于机器的注意事项

根据节点的底层硬件架构,某些机器系列需要额外的节点池标志、容器映像软件包或系统 DaemonSet,才能使用 GKE DRANET 配置 RDMA 接口。

A4X Max 裸金属

  • 部署 asapd-lite:使用裸金属 GPU 节点(例如 A4X Max)时,您必须将 asapd-lite DaemonSet 部署到集群。asapd-lite DaemonSet 用于配置 RDMA 网络接口卡 (NIC)。如果没有它,系统不会创建子接口,并且 dranet 驱动程序会滤除 RDMA NIC,从而阻止 Pod 中的 RDMA 功能。如需查看完整的设置说明,请参阅使用 asapd-lite 配置 MRDMA NIC。

Z4M 存储优化型虚拟机

  • 容器映像要求:如需在 Z4M 实例上使用 RDMA,您必须使用配置了所需用户空间 RDMA 软件包的 Rocky Linux 8 容器映像。不支持其他发行版,例如 Ubuntu 或 Debian。 这些发行版的标准上游软件包缺少 IRDMA 驱动程序所需的自定义 ABI 扩展。如果没有这些扩展程序,软件包会在运行时失败,并显示 -ENOSPC 错误。如需了解设置说明,请参阅在存储优化型节点池中使用 RDMA 接口。

准备工作

在开始之前,请确保您已执行以下任务:

  • 启用 Google Kubernetes Engine API。
  • 启用 Google Kubernetes Engine API
  • 如需使用 Google Cloud CLI 执行此任务,请安装并初始化 gcloud CLI。如果您之前安装了 gcloud CLI,请通过运行 gcloud components update 命令来获取最新版本。较早版本的 gcloud CLI 可能不支持运行本文档中的命令。

所需的角色

如需获得创建节点池和分配网络资源所需的权限,请让您的管理员为您授予项目的 Kubernetes Engine Admin (roles/container.admin) IAM 角色。如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限。

您也可以通过自定义角色或其他预定义角色来获取所需的权限。

创建集群

创建使用 GKE Dataplane V2 的 GKE Standard 集群:

gcloud container clusters create CLUSTER_NAME \
    --enable-dataplane-v2 \
    --region=CONTROL_PLANE_LOCATION \
    --project=PROJECT_ID \
    --cluster-version=CLUSTER_VERSION

替换以下内容:

  • CLUSTER_NAME:新集群的名称。
  • CONTROL_PLANE_LOCATION:集群控制平面所在的区域或可用区,例如 us-central1 或 us-central1-a。
  • PROJECT_ID:您的 Google Cloud 项目 ID。
  • CLUSTER_VERSION:集群的 GKE 版本:
    • Z4M 虚拟机:1.36.3-gke.1767000 或更高版本
    • 所有其他受支持的虚拟机或裸金属实例:1.34.1-gke.1829001 或更高版本

使用 GPU 节点池中的 RDMA 接口

以下部分介绍了如何配置 GPU 节点池和工作负载,以使用 GKE DRANET 来启用 RDMA 网络接口。

在 GPU 节点池上启用 GKE 管理的 DRANET 驱动程序

如需在支持 RDMA 的 GPU 节点池上启用 GKE DRANET 驱动程序,请在创建节点池时添加 cloud.google.com/gke-networking-dra-driver=true 标签。

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

替换以下内容:

  • NODE_POOL_NAME:新节点池的名称。
  • REGION:集群的 Google Cloud 区域。
  • CLUSTER_NAME:您的集群的名称。
  • ACCELERATOR_TYPE:GPU 加速器的类型:

    例如:

    • A4 虚拟机:输入 nvidia-b200。
    • A3 Ultra 虚拟机:输入 nvidia-h200-141gb。
  • ACCELERATOR_COUNT:要挂接到节点池中节点的 GPU 数量。 例如,对于 a4-highgpu-8g 和 a3-ultragpu-8g 虚拟机,GPU 数量均为 8。

  • DRIVER_VERSION:要使用的 GPU 驱动程序版本。例如 default 或 latest。

  • MACHINE_TYPE:节点池的机器类型,例如 a3-ultragpu-8g。

  • NUM_NODES:节点池的节点数。对于灵活启动,此值必须设置为 0。

  • RESERVATION_PROJECT:预留的项目 ID。

  • RESERVATION_NAME:预留的名称。 如需查找此值,请参阅查看未来预留请求。

  • RESERVATION_BLOCK:预留中特定块的名称。如需查找此值,请参阅查看未来预留请求。

此命令使用加速器网络配置方案自动为加速器虚拟机配置 VPC 网络和子网。或者,您也可以明确指定 VPC 网络和子网。

部署工作负载 RDMA 资源

如需为 Pod 分配 RDMA 资源,请指定 ResourceClaimTemplate。

  1. 创建 ResourceClaimTemplate 以定义如何分配 RDMA 设备。 以下清单请求节点上的所有可用 mrdma 设备。将该清单保存为 all-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: All
    
  2. 应用清单:

    kubectl apply -f all-mrdma-template.yaml
    
  3. 部署工作负载并引用 ResourceClaimTemplate。以下清单部署了一个引用 all-mrdma 模板的 Pod,该模板会授予 Pod 对节点上 RDMA 接口的访问权限。将该清单保存为 agnhost-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-mrdma
    
  4. 应用清单:

    kubectl apply -f agnhost-rdma-pod.yaml
    
  5. 验证在 Pod 内是否可以看到额外分配的网络接口。

    kubectl exec agnhost-rdma -- ls /sys/class/net
    

    以下示例输出显示了默认的 eth0 和 lo 接口,以及分配的 RDMA 接口(例如 gpu0rdma0)。网络接口 (NIC) 的数量和名称因 GKE 节点的机器类型而异。

    eth0
    gpu0rdma0
    gpu1rdma0
    gpu2rdma0
    gpu3rdma0
    lo
    

在 TPU 节点池中使用非 RDMA 网络接口

以下部分介绍了如何配置 TPU 节点池和工作负载,以使用 GKE DRANET 来启用非 RDMA 网络接口。

验证网络 DeviceClass

验证集群中是否存在用于网络的 DeviceClass 资源。

kubectl get deviceclass netdev.google.com

输出类似于以下内容:

NAME                AGE
netdev.google.com   2d22h

在 TPU 切片节点池上启用 GKE 管理的 DRANET 驱动程序

如需在创建 TPU 切片节点池时启用 GKE DRANET 驱动程序,请添加 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

替换以下内容:

  • NODE_POOL_NAME:新节点池的名称。
  • LOCATION:集群的 Google Cloud 区域或可用区。
  • CLUSTER_NAME:您的集群的名称。
  • NODE_LOCATIONS:节点池中节点的 Google Cloud 可用区。
  • MACHINE_TYPE:要用于节点的机器类型。 如需详细了解与 TPU 兼容的机器类型,请参阅选择 TPU 版本。
  • TPU_TOPOLOGY:TPU 拓扑,例如 2x4x4。 拓扑格式取决于 TPU 版本。如需详细了解 TPU 拓扑,请参阅选择拓扑。
  • NUM_NODES:节点池中的节点数。

如需了解详情,请参阅创建单主机 TPU 切片节点池。

部署声明所有网络设备的工作负载

如需为 Pod 分配非 RDMA 网络设备,请指定 ResourceClaimTemplate。

  1. 创建引用 netdev.google.com DeviceClass 的 ResourceClaimTemplate。以下清单将请求节点上的所有可用非 RDMA 网络设备。

    将清单保存为 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: All
    
  2. 应用清单:

    kubectl apply -f all-netdev-template.yaml
    
  3. 部署工作负载并引用 ResourceClaimTemplate。以下清单部署了一个使用 all-netdev 模板的 Pod,以授予该 Pod 对节点上所有非 RDMA 网络设备的访问权限。 将该清单保存为 netdev-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-netdev
    

    替换以下内容:

    • TPU_ACCELERATOR:TPU 加速器类型,例如 tpu-v5p-slice。
    • TPU_TOPOLOGY:TPU 拓扑,例如 2x4x4。
  4. 应用清单:

    kubectl apply -f netdev-pod.yaml
    
  5. 验证在 Pod 内是否可以看到额外分配的网络接口。

    kubectl exec agnhost-netdev -- ls /sys/class/net
    

    以下示例输出显示了默认的 eth0 和 lo 接口,以及已分配的网络设备(名称类似于 eth1 和 eth2)。NIC 的数量及其名称会因 GKE 节点的机器类型而异。

    eth0
    eth1
    eth2
    lo
    

在存储优化型节点池中使用 RDMA 接口

以下部分以 Z4M (z4m-highmem-192) 虚拟机为例,介绍了如何配置存储优化型节点池和工作负载,以使用 GKE DRANET 来启用 RDMA 网络接口。

创建存储优化型节点池

使用 --accelerator-network-profile=auto 标志创建存储优化型节点池,以便 GKE 自动预配和挂接底层 Falcon VPC 网络、子网和辅助网络接口。在 Z4M 节点池上,GKE 默认启用 DRANET,因此您在创建节点池时无需指定 cloud.google.com/gke-networking-dra-driver=true 节点标签。此示例使用 z4m-highmem-192 机器类型,该类型具有双物理 Titanium NIC,并提供两个 RDMA 接口。如需查看支持的机器类型列表,请参阅要求。

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

替换以下内容:

  • NODE_POOL_NAME:新节点池的名称。
  • CLUSTER_NAME:您的集群的名称。
  • PROJECT_ID:您的 Google Cloud 项目 ID。
  • ZONE:节点池的 Google Cloud 可用区。
  • NUM_NODES:节点池中的节点数。如需使用示例 rdma-server 和 rdma-client Pod 测试跨节点的 RDMA 流量,请至少指定 2。

准备存储优化型工作负载容器映像

在存储优化型节点上使用 Cloud RDMA 的工作负载需要安装了适用于 Cloud RDMA 的自定义用户空间 RDMA 库 (rdma-core) 的 Rocky Linux 8 容器映像。请勿使用默认的上游软件包;它们缺少主机 IRDMA 驱动程序所需的自定义 ABI 扩展程序,并且在运行时会失败,并出现 -ENOSPC 错误。如需验证 IP 地址分配并测试 RDMA 连接,还需安装 iproute、libibverbs-utils、librdmacm-utils、infiniband-diags 和 perftest。

如需查看配置所需 Package Repository 的 Dockerfile 示例,请参阅准备 Docker 映像。在 dnf install 命令中,添加 iproute,以便您可以使用 ip 命令检查 IP 分配。如需详细了解所需的软件包,请参阅 Cloud RDMA RPM。

部署具有 RDMA 资源的工作负载

如需将 RDMA 接口分配给存储优化型节点上的 Pod,请创建一个请求 irdma.google.com DeviceClass 的 ResourceClaimTemplate:

  1. 创建 ResourceClaimTemplate 清单并将其保存为 irdma-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: 2
    

    在此清单中:

    • deviceClassName: irdma.google.com:在存储优化型节点上请求由 GKE DRANET 管理的 IRDMA 网络接口。
    • allocationMode: ExactCount 和 count: 2:请求 z4m-highmem-192 节点上可用的两个 IRDMA 接口。如果您的工作负载只需要一个 RDMA 接口,或者您使用的是提供一个 IRDMA 接口的 Z4M 机器类型,请指定 1。
  2. 应用清单:

    kubectl apply -f irdma-template.yaml
    
  3. 创建一个清单,其中定义了两个 Pod(rdma-server 和 rdma-client),以便测试节点之间的 RDMA 流量。每个 Pod 都会添加 IPC_LOCK 功能并引用 irdma-template ResourceClaimTemplate。将清单保存为 irdma-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-template
    

    将 IMAGE_URI 的两个实例都替换为 Rocky Linux 8 RDMA 容器映像的 URI。

    在此清单中:

    • metadata.labels:使用 app: perftest 和 role 标签标记每个 Pod。两个 Pod 共享 app: perftest 标签,以便反亲和性规则应用于它们。role 标签用于区分 rdma-server Pod (role: server) 和 rdma-client Pod (role: client),以便您测试跨节点的 Pod 到 Pod RDMA 连接。
    • affinity.podAntiAffinity:阻止 Kubernetes 将共享 app: perftest 标签的 Pod 调度到同一节点上。由于两个 Pod 都具有此标签,因此即使您的 ResourceClaimTemplate 仅请求一个接口 (count: 1),它们也会在不同的物理主机上运行,以进行跨节点 RDMA 测试。您的节点池必须至少有两个节点才能调度这两个 Pod。
    • securityContext.capabilities.add: ["IPC_LOCK"]:允许容器锁定内存页,这是 RDMA 用户空间库注册内存区域以进行直接内存访问所必需的。
    • spec.resourceClaims:从 irdma-template ResourceClaimTemplate 生成 Pod 专用 ResourceClaim(名为 irdma)。
    • containers.resources.claims:向 perftest 容器授予对 irdma 声明分配的接口的访问权限。
  4. 应用清单:

    kubectl apply -f irdma-pods.yaml
    
  5. 验证在服务器 Pod 内是否可以看到分配的 RDMA 接口(rdma0 和 rdma1):

    kubectl exec rdma-server -- ip -br addr show
    

    输出类似于以下内容:

    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
    

如需验证两个 Pod 之间的 RDMA 流量,请在 rdma-server 和 rdma-client 之间运行 rping:

  1. 在服务器 Pod 上启动 rping 服务器:

    kubectl exec -it rdma-server -- rping -s -a RDMA_IP -v -d
    

    将 RDMA_IP 替换为服务器 Pod 的 rdma0 或 rdma1 IP 地址,例如 10.31.0.3。

  2. 在第二个终端中,在客户端 Pod 上运行 rping 客户端:

    kubectl exec -it rdma-client -- rping -c -a RDMA_IP -C 5 -v -d
    

    在客户端输出中,验证以下 RDMA 连接成功的指标:

    • RDMA_CM_EVENT_ADDR_RESOLVED 和 RDMA_CM_EVENT_ROUTE_RESOLVED:确认 RDMA 通信管理器已解析目标 RDMA IP 地址和路由。
    • ESTABLISHED 和 rdma_connect successful:确认客户端已创建队列对 (qp)、完成队列 (cq) 和保护网域 (pd),并建立了 RDMA 连接。
    • 五个 send completion、recv completion 和 ping data: rdma-ping- 条目:确认在关闭连接 (destroy cm_id) 之前,通过 RDMA 接口完成了五次 RDMA 读写往返迭代。

使用自定义 ComputeClass 启用 DRANET

如需在 Autopilot 集群中或在 Standard 集群中通过节点自动预配使用 GKE 托管式 DRANET,您必须使用自定义 ComputeClass 资源来选择启用该功能。

  1. 创建一个 ComputeClass 清单,用于启用 DRANET 驱动程序并将加速器网络配置方案设置为 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: auto
    

    替换以下内容:

    • MACHINE_TYPE:节点池的机器类型,例如 a3-ultragpu-8g 或 z4m-highmem-192。
    • GPU_COUNT:机器类型的 GPU 数量。
    • GPU_TYPE:GPU 类型,例如 nvidia-h200。
  2. 应用清单:

    kubectl apply -f COMPUTE_CLASS_FILENAME.yaml
    
  3. 在 Pod 规范中,使用 cloud.google.com/compute-class 节点选择器引用 ComputeClass:

    apiVersion: v1
    kind: Pod
    metadata:
      name: dranet-pod
    spec:
      nodeSelector:
        cloud.google.com/compute-class: "dranet-compute-class"
      ...
    

请求特定数量的网络设备

前面的 GPU 和 TPU 示例展示了如何通过将 allocationMode 设置为 All 来请求特定类型的所有可用网络设备。如需改为请求特定数量的设备,请在 ResourceClaimTemplate 中将 allocationMode 设置为 ExactCount,如部署具有 RDMA 资源的工作负载中所示。

以下示例请求两个 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

后续步骤