RDMA 高速网络部署(InfiniBand / RoCE / Mellanox)
RDMA(Remote Direct Memory Access)提供低延迟、高带宽、低 CPU 占用的网络传输,是多机多卡分布式训练(NCCL 通信)和高性能存储的关键。CubeStudio 通过 k8s-rdma-shared-dev-plugin 把宿主机的 RDMA 网卡以 rdma/hca 资源的形式暴露给 Pod。
本文合并自三份源码侧文档:
install/kubernetes/rdma/readme.md(驱动安装与验证总述)install/kubernetes/rdma/roce.md(在 k8s 中使用 Mellanox RoCE 模式)install/kubernetes/rdma/mellanox/readme.md(Mellanox 命令速查)
并补充了 install/kubernetes/rdma/ 下的实际部署 YAML(device plugin DaemonSet、测试 Pod 等)。
两种链路层:ibv_devinfo 输出 Link layer: InfiniBand 表示走 IB 网络;link_layer: Ethernet 表示走 RoCE(以太网承载 RDMA)。
一、节点驱动安装与验证(总述)
先重启机器,避免以前的安装需要重启才生效。
1. 查看系统内核
# centos
yum update -y
# ubuntu
apt update -y
rpm -qa | grep kernel # 查看最新的 kernel 包版本
uname -r # 查看操作系统当前运行的内核版本
对比上面两者是否一致,不一致需要重启。
2. 安装依赖包
# centos
yum install -y gcc-c++ dkms cmake kernel-devel kernel-headers libnl3 libnl3-devel
# ubuntu
apt-get install -y dkms cmake libnl-3-dev libnl-route-3-dev kernel-headers
apt-get install -y python-libxml2 gfortran libgfortran3 libnl-route-3-200 dpatch quilt bison \
swig debhelper automake libltdl-dev chrpath flex autoconf m4 autotools-dev graphviz lsb-core
3. 安装/加载驱动
/etc/init.d/openibd restart # 重新加载 RDMA 驱动
ibstat # 查看 IB 状态
ibstatus # 查询状态是否激活
4. 安装软件测试包并检查 RDMA 库
apt update && apt install -y infiniband-diags
检查是否已安装 RDMA 相关库:
dpkg -l perftest ibverbs-providers libibumad3 libibverbs1 libnl-3-200 libnl-route-3-200 librdmacm1
如有软件包未安装,执行:
apt update && apt install -y perftest ibverbs-providers libibumad3 libibverbs1 \
libnl-3-200 libnl-route-3-200 librdmacm1
然后再次用 dpkg -l ... 确认安装结果。
5. 检查设备
lspci:检查本地是否有 IB 卡。ibstatus:查询状态是否激活。ibv_devices:查看本主机的 InfiniBand 设备。ibnodes:查看网络中的 InfiniBand 设备(RoCE 网络不一定有 IB 设备)。ibv_devinfo:查询设备信息。Link layer: InfiniBand表示 IB 网络,link_layer: Ethernet表示 RoCE。
二、RoCE 模式(Mellanox over Ethernet)
在 Kubernetes 中使用 Mellanox 网卡的 RoCE(RDMA over Converged Ethernet)模式,需要结合硬件配置、驱动设置、Kubernetes 网络插件以及 RDMA 容器化支持。
1. 确认硬件和驱动支持
网卡型号:确保 Mellanox 网卡支持 RoCE(如 ConnectX-4/5/6 系列)。
驱动和固件:安装最新 MLNX_OFED 驱动(Linux)或 WinOF-2(Windows)。用
mlxconfig把网卡切换为 RoCE(ETH 模式):mlxconfig -d <device> set LINK_TYPE_P1=2 # 2 = ETH 模式(RoCE) reboot # 需重启生效验证模式:
ibv_devinfo查看网卡是否显示为 RoCE 设备。
2. 配置 RoCE 网络环境
交换机设置:启用 PFC(Priority Flow Control)和 ECN(Explicit Congestion Notification)以避免拥塞;若使用链路聚合(LAG),需配置 LACP(模式 4)并匹配服务器的 Bond 配置。
服务器端优化:设置 MTU(通常为 4200)并开启 PFC:
ifconfig <interface> mtu 4200 mlnx_qos -i <interface> --pfc=0,0,0,0,1,0,0,0 --trust=dscp关闭流控卸载(如 Flow Control)以减少 CPU 开销。
3. Kubernetes 节点配置
加载 RDMA 内核模块:
modprobe rdma_rxe # 可选:Soft-RoCE 支持
modprobe ib_uverbs
安装 RDMA device plugin,使 Kubernetes 能识别 RDMA 设备(社区参考方案):
kubectl apply -f https://raw.githubusercontent.com/Mellanox/k8s-rdma-shared-dev-plugin/master/deployment/k8s-rdma-shared-dev-plugin-daemonset.yaml
CubeStudio 自带了改造后的 device plugin DaemonSet,见下文「四、CubeStudio 实际部署」,生产部署请用仓库内的
install/kubernetes/rdma/mellanox/daemonset.yaml,而非上面这条社区示例命令。
验证设备是否可见:
kubectl describe node <node-name> | grep rdma
4. 容器化应用配置
在 Pod 的 resources.limits 中请求 RDMA 资源:
resources:
limits:
rdma/rdma_shared_device: "1" # 请求 1 个 RDMA 设备
注意:这里的
rdma/rdma_shared_device是通用示例,实际资源名取决于 device plugin ConfigMap 中的resourceName。CubeStudio 仓库内 device plugin 的配置为resourceName: "hca"(见install/kubernetes/rdma/mellanox/daemonset.yaml的 ConfigMap),对应 Pod 应请求rdma/hca(与install/kubernetes/rdma/mellanox/test-hca-pod.yaml一致)。请以实际部署的 device plugin 配置中的resourceName为准。
也可直接把 RDMA 设备挂载到容器:
volumeMounts:
- name: rdma-devices
mountPath: /dev/infiniband
volumes:
- name: rdma-devices
hostPath:
path: /dev/infiniband
应用兼容性:确保容器内应用支持 RDMA Verbs API(如使用 libibverbs 库);测试工具 ib_write_bw / ib_read_bw 可用于验证带宽。
5. 网络插件选择
- Multus:支持多网络接口,可为 Pod 附加 RoCE 网络(需配置 RDMA CNI)。
- Kube-OVN/Calico:需确保不干扰 RDMA 流量(避免封装 overhead)。
- 避免使用 Service Mesh(如 Istio)或网络策略插件,可能干扰 RDMA 性能。
6. 性能调优
NCCL 参数(AI 训练场景):
env:
- name: NCCL_IB_TC
value: "128" # 匹配 PFC 队列
- name: NCCL_IB_QPS_PER_CONNECTION
value: "8" # 增加 QP 数量
NUMA 亲和性:绑定 Pod 到与网卡相同的 NUMA 节点以减少延迟。
常见问题
- 驱动加载失败:检查内核版本兼容性,更新 MLNX_OFED 驱动。
- RoCE 性能差:确认交换机 PFC 配置,并禁用 TCP 卸载(如
ethtool -K <interface> tso off gso off)。
三、Mellanox 命令速查
设备/驱动信息
ofed_info # 查看 OFED 驱动信息(IB 驱动版本)
ibstat # 查询 InfiniBand 设备的基本状态
ibstatus # 网卡信息
ibv_devinfo # 网卡设备信息(ibv_devinfo -d mlx5_0 -v)
ibv_devices # 查看本主机的 infiniband 设备
ibnodes # 查看网络中的 infiniband 设备
show_gids # 查看网卡支持的 roce 版本
show_counters # 网卡端口统计数据(发送/接收数据大小)
mlxconfig -d mlx5_1 q # 查询网卡配置信息
网络设备映射与链路验证
ibdev2netdev # 查看 ib 设备与网络设备(ibX/ethX)的映射
ibdev2netdev -v # 详细模式
hca_self_test.ofed # 验证 InfiniBand 链接是否已启动(Mellanox)
配置与信息文件
/etc/infiniband/info # Mellanox OFED 安装信息
/etc/infiniband/openib.conf # 自动加载的模块列表
lspci | grep Mellanox # 检查 Mellanox 网卡是否安装及型号
modinfo mlx5_core # 查看驱动版本
ip a # 查看系统所有网卡及工作状态
重启 RDMA 驱动
/etc/init.d/openibd restart # 重启 RDMA 驱动
service ibacm start # 启动 ibacm(名称/地址解析服务)
注意:
service network restart只能启动 Ethernet 端口,并不会真正加载 RDMA 驱动。若驱动异常,/etc/init.d/openibd restart会暴露很多错误,记得同时启动ibacm。
信息收集脚本:/usr/sbin/sysinfo-snapshot.py。
参考资料:
- https://blog.csdn.net/bandaoyu/article/details/115798045
- https://winddoing.github.io/post/f4fa9e36.html
- 百度云 CCE RDMA 文档:https://cloud.baidu.com/doc/CCE/s/6lil1dftn
- device plugin 项目:https://github.com/Mellanox/k8s-rdma-shared-dev-plugin
四、CubeStudio 实际部署(install/kubernetes/rdma/)
1. 节点打标
device plugin DaemonSet 通过 nodeSelector: rdma: 'true' 调度,只在打了标签的节点上运行。先给有 RDMA 网卡的节点打标:
kubectl label node <node-name> rdma=true
2. 部署 RDMA Device Plugin(Mellanox 共享设备)
install/kubernetes/rdma/mellanox/daemonset.yaml 包含一个 ConfigMap 和一个 DaemonSet:
- ConfigMap
rdma-devices(命名空间kube-system)声明资源resourceName: "hca",按厂商vendors: ["15b3"](Mellanox)匹配网卡,rdmaHcaMax: 500,periodicUpdateInterval: 300。 - DaemonSet
rdma-shared-dp-ds(命名空间kube-system)使用镜像ccr.ccs.tencentyun.com/cube-studio/k8s-rdma-shared-dev-plugin:mellanox,hostNetwork: true、privileged: true、nodeSelector: rdma: 'true'。
kubectl apply -f install/kubernetes/rdma/mellanox/daemonset.yaml
部署后,节点会上报 rdma/hca 可分配资源(用 kubectl describe node <node> | grep rdma 验证)。
如需 CDI(Container Device Interface)支持,使用
install/kubernetes/rdma/mellanox/cdi.yaml,它额外挂载了/var/run/cdi,并演示了按devices: ["ib0","ib1"]或selectors(vendor 15b3 / deviceID 1017 / ifNames)声明多个资源(hca_shared_devices_a/hca_shared_devices_b)。
3. 测试 Pod
install/kubernetes/rdma/mellanox/test-hca-pod.yaml 起一个 Deployment rdma-test,请求 rdma/hca: '1',并加 IPC_LOCK capability,用 ib_read_bw -d mlx5_0 验证带宽:
kubectl apply -f install/kubernetes/rdma/mellanox/test-hca-pod.yaml
# 进入容器后:
ls -l /dev/infiniband /sys/class/infiniband /sys/class/net
ib_read_bw -d mlx5_0 # 服务端
ib_read_bw -d mlx5_0 <container_ip> # 客户端
4. 阿里云 eRDMA 变体(可选)
install/kubernetes/rdma/ali/ 提供阿里云环境的变体:
erdma.yaml:device plugin DaemonSetrdma-device-plugin(镜像registry.cn-shanghai.aliyuncs.com/acs/rdma-device-plugin,ConfigMap 用{"mode":"hca"},nodeSelector: rdma: "true",容忍CriticalAddonsOnly)。demo.yaml:两个测试 Pod(rdma-test-pod/rdma-test-pod-1),镜像mellanox/centos_7_4_mofed_4_2_1_2_0_0_60,请求rdma/hca: 1,用ib_read_bw -q 30测试。
本页命令、镜像名、资源名以源码为准(
install/kubernetes/rdma/下readme.md/roce.md/mellanox/*/ali/*),仅供导航与说明。