简介
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,则需要修改这个配置。 |
使用方法