rdma-agent 说明

最近更新时间:2025-12-08 21:19:52

我的收藏

简介

rdma-agent 是腾讯云容器服务 TKE 提供的网络组件,该组件会自动检测节点可用的 RDMA 设备,并注册到 Kubernetes 中。该组件支持 RDMA 网络虚拟化,能够将 RDMA 设备分配绑定到 Kubernetes Pod 当中,从而支持 Pod 使用 RDMA 设备的高性能数据传输能力。
核心职责:
1. 设备发现与上报:扫描节点上的 RDMA 网卡设备,通过 Device Plugin 机制向 Kubelet 上报 RDMA 资源。
2. 设备分配与挂载:在 Pod 创建时,返回需要挂载的 RDMA 字符设备(/dev/infiniband/*)列表,由容器运行时挂载到 Pod 内并配置 cgroup 规则,确保 NCCL 等库能正确访问 RDMA 设备。
3. RDMA 网卡管理:生成并管理 RDMA CNI 配置,管理 Pod 内的 RDMA Bond 网卡。

网络架构

rdma-agent 支持 RDMA 网卡独占或 RDMA 网卡共享两种模式,实现 RDMA 网络虚拟化,其网络架构如下:

独占 RDMA 网卡


上图为 1 个节点 2 个 Kubernetes Pod 的图例,在图中:
每个节点有 1 个主网卡和 8 个 RDMA Bond 网卡。
每个 Pod 分配了 1 个名为 eth0 的普通网卡,可访问普通 VPC 网络。
每个 Pod 还分配了 2 个 MACVLAN 虚拟化出的 RDMA Bond 网卡(根据 Pod 申请的 Bond 网卡数决定,按 NUMA 亲和分配),每个网卡与节点的其中一个 Bond 网卡对应,且复用节点 Bond 网卡的 IP 地址,可访问 RDMA 互联网络。

共享 RDMA 网卡


上图为 1 个节点 2 个 Kubernetes Pod 的图例,在图中:
每个节点有 1 个主网卡和 8 个 RDMA Bond 网卡。
每个 Pod 分配了 1 个名为 eth0 的普通网卡,可访问普通 VPC 网络。
每个 Pod 还分配了 8 个 IPVLAN 虚拟化出的 RDMA Bond 网卡,每个网卡与节点的其中一个 Bond 网卡对应,且有独立的 IP 地址,可访问 RDMA 互联网络。

两种模式的对比

特性
独占 RDMA 网卡
共享 RDMA 网卡
资源模型
物理资源(实际 bond 数)
虚拟资源(1000)
网卡使用
独占主机 bond
共享主机 bond
IP 分配
复用主机 bond IP
主机 Bond 需扩网段,分配网段内 IP
设备挂载
分配的 bond 对应设备
所有 RDMA 设备
GID Index
固定为 Host GID
动态(需 Pod 内脚本动态查询)
拓扑感知
独占部分主机网卡,按 NUMA 拓扑感知分配
共享所有主机网卡,拓扑简单
推荐场景
单个 Hostnetwork 独占主机 Node 的场景;单 Pod 分配 8、4、2、1 卡的场景(2、1 卡不确保 GPU 和 NIC 的 PCIE-Switch 感知)。
单卡或者双卡,对 PCI-SWITCH 拓扑感知有高要求的场景;多个 Hostnetwork Pod 共享主机 Node 的场景。

部署在集群内的 Kubernetes 对象

Kubernetes 对象名称
类型
默认占用资源
所属 Namespaces
tke-rdma-agent-conf
ConfigMap
-
kube-system
tke-rdma-shared-agent
DaemonSet
0.01核CPU,100MB内存
kube-system

使用限制

支持 Kubernetes 1.20及以上版本的集群。
仅支持部署在相关有 RDMA 设备的实例上。

组件部署

前置检查

注意:
确保 RDMA netns 为 shared 模式,如果不是 shared,组件不能正常工作。
如果使用共享 RDMA 网卡非 hostnetwork 模式,确保 RDMA 机器加入的 高性能计算集群(THCC)已经支持 /28 及以上的网段。
1. 执行以下命令,查看节点当前 rdma netns 是否为 shared:
/opt/mellanox/iproute2/sbin/rdma system show
输出应为:
netns shared
2. 如果输出为 exclusive,则需要执行以下命令修改为 shared:
rm /etc/modprobe.d/ib_core.conf
/opt/mellanox/iproute2/sbin/rdma system set netns shared
如果命令执行失败,则需要重启节点。
3. 如果使用共享 RDMA 网卡非 hostnetwork 模式,确保 RDMA 机器加入的 HCC 集群已经支持 /28 及以上的网段,在节点上访问 meta-data 接口查询 RDMA 网卡支持的网段,确保其中 intMask 都为 /28 及以上,否则无法支持 IPVLAN 网络虚拟化能力(仅能支持 HostNetwork 的方式使用)。
curl http://169.254.0.23/meta-data/rdma-subnet | grep intMask


部署安装

1. 登录 容器服务控制台,在左侧导航栏中选择集群
2. 在集群列表中,单击目标集群 ID,进入集群详情页。
3. 选择左侧菜单栏中的组件管理,在组件管理页面单击新建
4. 新建组件管理页面中勾选 rdma-agent。如下图所示:

5. 参数配置请参见 组件参数配置说明
6. 单击完成即可创建组件。

部署节点设置 label

1. 容器服务控制台 的集群详情页中,选择节点管理 > 节点池,单击编辑修改节点池中节点的 label。如下图所示:

2. 在编辑参数设置中,新增或修改节点池中节点的 label,默认需添加 feature.node.kubernetes.io/tke-shared-rdma=true

3. 添加、修改完以后,也可勾选“对存量节点应用本次 Label/Annotation/Taint 更新”,从而应用到存量节点。
存量节点也可通过以下命令给节点添加 label,从而部署 rdma-agent 组件:
# <nodeName> 替换成存量节点的名称,通过 kubectl get node 可查询
kubectl label node <nodeName> feature.node.kubernetes.io/tke-shared-rdma=true

组件参数配置说明


参数配置项
描述
CpuRequest
组件在每个节点上运行时需要占用的 CPU,默认为 10m。
CpuLimit
组件在每个节点上运行时最大占用的 CPU,默认为 50m。
MemoryRequest
组件在每个节点上运行时需要占用的内存,默认为 100Mi。
MemoryLimit
组件在每个节点上运行时最大占用的内存,默认为 500Mi。
KubeletRootDir
组件运行所在节点的 kubelet 的根目录,默认为 /var/lib/kubelet,根目录修改时需同步修改组件的这个配置。
NodeSelector
组件所需运行节点的 label 键值对,默认配置是feature.node.kubernetes.io/tke-shared-rdma=true,若需自定义部署的节点 label,则需要修改这个配置。

使用方法