使用 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 会为支持 RDMA 的设备创建 mrdma.google.com 类,并为其他网络设备创建 netdev.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 驱动程序。为此,请向具有 GPU 和 TPU 的节点池添加 cloud.google.com/gke-networking-dra-driver=true 标签。

  • 使用其他 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,这可能会导致设置不正确和行为不可预测。

要求

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

  • GKE 1.34.1-gke.1829001 版或更高版本。
  • 集群上已启用 GKE Dataplane V2。
  • 预览版)GKE DRANET 可在 A4X Max 机器上使用。

限制

GKE DRANET 存在以下限制:

  • 您无法使用 GKE DRANET 来分配默认网络接口卡 (NIC) 或虚拟 NIC(例如 veth)。
  • 不支持集群自动扩缩和 Autopilot。
  • 您无法将 GKE DRANET 与配置了 secondaryPodRange 的接口搭配使用。

准备工作

如需获得使用 GKE DRANET 创建集群和分配网络资源的权限,请让您的管理员为您授予项目的 Kubernetes Engine Admin (roles/container.admin) IAM 角色。

在开始之前,请完成以下任务:

  1. 启用 Google Kubernetes Engine API。

    gcloud services enable container.googleapis.com --project=PROJECT_ID
    

    请将 PROJECT_ID 替换为您的 Google Cloud 项目 ID。

  2. 如果您要使用 Google Cloud CLI 执行此任务,请安装初始化 gcloud CLI。如果您之前安装了 gcloud CLI,请通过运行 gcloud components update 来获取最新版本。

  3. 创建启用了 GKE Dataplane V2 和 IP 别名的 GKE 集群:

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

    替换以下内容:

    • CLUSTER_NAME:新集群的名称。
    • REGION:集群的 Google Cloud 区域。
    • PROJECT_ID:您的 Google Cloud 项目 ID。
    • CLUSTER_VERSION:集群的 GKE 版本。必须为 1.34.1-gke.1829001 或更高版本。

使用 GPU 节点池中的 RDMA 接口

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

在 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_TYPEGPU 加速器的类型:

    例如:

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

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

  • 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
    

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

    eth0
    gpu0rdma0
    gpu1rdma0
    gpu2rdma0
    gpu3rdma0
    lo
    

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

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

验证网络 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 DeviceClassResourceClaimTemplate。以下清单请求节点上的所有可用非 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
    

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

    eth0
    eth1
    eth2
    lo
    

请求特定数量的网络设备

上述示例展示了如何通过将 allocationMode 设置为 All 来请求特定类型的所有可用网络设备。如果您需要改为请求特定数量的设备,可以在 ResourceClaimTemplate 中将 allocationMode 设置为 ExactCount

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

后续步骤