简介
rdma-agent 是腾讯云容器服务 TKE 提供的网络组件,该组件会自动检测节点可用的 RDMA 设备,并注册到 Kubernetes 中。该组件支持 RDMA 网络虚拟化,能够将 RDMA 设备分配绑定到 Kubernetes Pod 当中,从而支持 Pod 使用 RDMA 设备的高性能数据传输能力。
网络架构
rdma-agent 支持通过 IPVLAN 实现 RDMA 网络虚拟化,其网络架构如下:

上图为 2 个节点 4 个 Kubernetes Pod 的图例,在图中:
每个节点有 1 个主网卡和 8 个 RDMA Bond 网卡。
每个 Pod 分配了 1 个名为 eth0 的普通网卡,可访问普通 VPC 网络。
每个 Pod 还分配了 8 个 IPVLAN 虚拟化出的 RDMA Bond 网卡,每个网卡与节点的其中一个 Bond 网卡对应,且有独立的 IP 地址,可访问 RDMA 互联网络。
部署在集群内的 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 设备的实例上。
组件部署
前置检查
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 机器加入的 THCC 集群已经支持 /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,则需要修改这个配置。 |