RDMA 在 Kubernetes 中的应用实施指南¶
1. RDMA 技术简介¶
RDMA (Remote Direct Memory Access) 是一种高性能数据传输技术,允许网络适配器直接访问应用程序内存,绕过操作系统内核和CPU,从而实现:
- 极低的延迟
- 高带宽
- 低CPU使用率
2. 环境要求¶
2.1 硬件要求¶
- RDMA capable 网卡 (如Mellanox ConnectX-⅘/6)
- 支持RDMA的交换机
- 服务器需要支持PCIe 3.0/4.0
2.2 软件要求和组件说明¶
- Mellanox OFED 驱动
- OFED (OpenFabrics Enterprise Distribution) 是一个完整的软件栈,提供RDMA支持
- 包含了用户空间库、内核驱动、诊断工具和性能测试工具
- 负责管理RDMA硬件,提供底层驱动支持
-
提供 IB (InfiniBand) 和 RoCE (RDMA over Converged Ethernet) 支持
-
RDMA Shared Device Plugin
- Kubernetes 设备插件,用于管理和分配RDMA资源
- 允许在容器中使用RDMA设备
- 提供RDMA设备的资源追踪和隔离
-
支持设备的动态发现和热插拔
-
Multus CNI 插件
- 支持Pod附加多个网络接口
- 允许Pod同时使用Kubernetes默认网络和RDMA网络
- 提供网络资源的细粒度控制
- 支持自定义网络配置和资源分配
3. 部署步骤¶
3.1 安装 Mellanox OFED 驱动¶
# 下载对应版本的OFED驱动
wget http://content.mellanox.com/ofed/MLNX_OFED-5.4-1.0.3.0/MLNX_OFED_LINUX-5.4-1.0.3.0-ubuntu20.04-x86_64.tgz
# 解压并安装
tar xzf MLNX_OFED_LINUX-5.4-1.0.3.0-ubuntu20.04-x86_64.tgz
cd MLNX_OFED_LINUX-5.4-1.0.3.0-ubuntu20.04-x86_64
./mlnxofedinstall --force
3.2 部署 Multus CNI¶
kubectl apply -f https://raw.githubusercontent.com/k8snetworkplumbingwg/multus-cni/master/deployments/multus-daemonset.yml
3.3 部署 RDMA Shared Device Plugin¶
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: rdma-shared-dp-ds
namespace: kube-system
spec:
selector:
matchLabels:
name: rdma-shared-dp-ds
template:
metadata:
labels:
name: rdma-shared-dp-ds
spec:
containers:
- name: k8s-rdma-shared-dp
image: mellanox/k8s-rdma-shared-dev-plugin
imagePullPolicy: IfNotPresent
securityContext:
privileged: true
volumeMounts:
- name: device-plugin
mountPath: /var/lib/kubelet/device-plugins
- name: config
mountPath: /etc/config
- name: devs
mountPath: /dev/
volumes:
- name: device-plugin
hostPath:
path: /var/lib/kubelet/device-plugins
- name: config
configMap:
name: rdma-devices
optional: true
- name: devs
hostPath:
path: /dev/
4. 配置和使用¶
4.1 创建网络附件定义¶
apiVersion: "k8s.cni.cncf.io/v1"
kind: NetworkAttachmentDefinition
metadata:
name: rdma-net
annotations:
k8s.v1.cni.cncf.io/resourceName: rdma/hca_shared_devices
spec:
config: '{
"cniVersion": "0.3.1",
"type": "host-device",
"device": "enp3s0f0",
"ipam": {
"type": "host-local",
"subnet": "192.168.1.0/24",
"rangeStart": "192.168.1.100",
"rangeEnd": "192.168.1.200",
"gateway": "192.168.1.1"
}
}'
4.2 部署支持 RDMA 的应用¶
apiVersion: v1
kind: Pod
metadata:
name: rdma-app
annotations:
k8s.v1.cni.cncf.io/networks: rdma-net
spec:
containers:
- name: rdma-app
image: rdma-app:latest
resources:
limits:
rdma/hca_shared_devices: 1
securityContext:
privileged: true
5. 验证和测试¶
5.1 验证 RDMA 设备¶
# 查看IB设备状态
ibstat
# 输出示例:
# CA 'mlx5_0'
# CA type: MT4115
# Number of ports: 1
# Firmware version: 12.21.1000
# Hardware version: 0
# Node GUID: 0x506b4b0300cc4a4e
# System image GUID: 0x506b4b0300cc4a4e
# Port 1:
# State: Active
# Physical state: LinkUp
# Rate: 100
# Base lid: 1
# LMC: 0
# SM lid: 1
# Capability mask: 0x2651e848
# Port GUID: 0x506b4b0300cc4a4e
# Link layer: InfiniBand
# 查看可用的RDMA设备
ibv_devices
# 输出示例:
# device node GUID
# ------ ----------------
# mlx5_0 0x506b4b0300cc4a4e
# 查看RDMA设备详细信息
ibv_devinfo
5.2 性能测试¶
# 1. 带宽测试
## 在服务器A上启动服务端
ib_send_bw -d mlx5_0 -i 1 -F --report_gbits
## 在服务器B上启动客户端
ib_send_bw -d mlx5_0 -i 1 -F --report_gbits <服务器A的IP地址>
# 2. 延迟测试
## 在服务器A上启动服务端
ib_send_lat -d mlx5_0 -i 1
## 在服务器B上启动客户端
ib_send_lat -d mlx5_0 -i 1 <服务器A的IP地址>
# 3. RDMA读写测试
## 测试RDMA读性能
ib_read_bw -d mlx5_0 -i 1 -F --report_gbits # 服务端
ib_read_bw -d mlx5_0 -i 1 -F --report_gbits <服务器IP> # 客户端
## 测试RDMA写性能
ib_write_bw -d mlx5_0 -i 1 -F --report_gbits # 服务端
ib_write_bw -d mlx5_0 -i 1 -F --report_gbits <服务器IP> # 客户端
5.3 性能指标说明¶
- 带宽测试指标
- Gb/s: 每秒传输的吉比特数
- MSG/s: 每秒传输的消息数
-
测试不同大小的消息包(64B - 1MB)的传输性能
-
延迟测试指标
- 平均延迟(Average Latency)
- 最小延迟(Min Latency)
- 最大延迟(Max Latency)
-
标准差(Standard Deviation)
-
性能优化建议
- 使用大页内存(HugePages)提升性能
- 调整IRQ亲和性
- 优化网络队列配置
- 调整系统参数(sysctl)
5.4 应用层验证¶
# 1. 检查RDMA应用进程
ps aux | grep rdma
# 2. 检查RDMA资源使用情况
rdma res show
# 3. 检查RDMA统计信息
rdma stat show
# 4. 验证NUMA亲和性
numactl --hardware
numactl --show
6. 常见问题和故障排除¶
- RDMA 设备未被识别
- 检查OFED驱动安装状态
-
验证设备插件是否正常运行
-
网络性能未达到预期
- 检查网络配置
- 验证RDMA配置是否正确
-
检查交换机配置
-
Pod调度失败
- 检查资源配额
- 验证设备插件状态
- 查看Kubernetes事件日志
7. 最佳实践¶
- 资源隔离
- 使用专用的RDMA网络
-
合理规划资源配额
-
性能优化
- 使用CPU绑定
- 开启NUMA亲和性
-
调整系统参数
-
监控
- 部署Prometheus监控
- 配置RDMA指标采集
- 设置告警规则