跳转至

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 软件要求和组件说明

  1. Mellanox OFED 驱动
  2. OFED (OpenFabrics Enterprise Distribution) 是一个完整的软件栈,提供RDMA支持
  3. 包含了用户空间库、内核驱动、诊断工具和性能测试工具
  4. 负责管理RDMA硬件,提供底层驱动支持
  5. 提供 IB (InfiniBand) 和 RoCE (RDMA over Converged Ethernet) 支持

  6. RDMA Shared Device Plugin

  7. Kubernetes 设备插件,用于管理和分配RDMA资源
  8. 允许在容器中使用RDMA设备
  9. 提供RDMA设备的资源追踪和隔离
  10. 支持设备的动态发现和热插拔

  11. Multus CNI 插件

  12. 支持Pod附加多个网络接口
  13. 允许Pod同时使用Kubernetes默认网络和RDMA网络
  14. 提供网络资源的细粒度控制
  15. 支持自定义网络配置和资源分配

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 性能指标说明

  1. 带宽测试指标
  2. Gb/s: 每秒传输的吉比特数
  3. MSG/s: 每秒传输的消息数
  4. 测试不同大小的消息包(64B - 1MB)的传输性能

  5. 延迟测试指标

  6. 平均延迟(Average Latency)
  7. 最小延迟(Min Latency)
  8. 最大延迟(Max Latency)
  9. 标准差(Standard Deviation)

  10. 性能优化建议

  11. 使用大页内存(HugePages)提升性能
  12. 调整IRQ亲和性
  13. 优化网络队列配置
  14. 调整系统参数(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. 常见问题和故障排除

  1. RDMA 设备未被识别
  2. 检查OFED驱动安装状态
  3. 验证设备插件是否正常运行

  4. 网络性能未达到预期

  5. 检查网络配置
  6. 验证RDMA配置是否正确
  7. 检查交换机配置

  8. Pod调度失败

  9. 检查资源配额
  10. 验证设备插件状态
  11. 查看Kubernetes事件日志

7. 最佳实践

  1. 资源隔离
  2. 使用专用的RDMA网络
  3. 合理规划资源配额

  4. 性能优化

  5. 使用CPU绑定
  6. 开启NUMA亲和性
  7. 调整系统参数

  8. 监控

  9. 部署Prometheus监控
  10. 配置RDMA指标采集
  11. 设置告警规则

8. 参考资料

回到页面顶部