k8s中pod使用RDMA网卡的方法

推荐

由于越来越多的接触到RDMA网卡,所以在k8s中使用InfinaBand网卡的场景也会遇到,所以在k8s中使用IB网卡的方案也需要进行记录,方便后续使用。
IB网卡提供了低延迟大带宽、高吞吐等特点的高性能网络,适用于AI训练场景,我们使用的是nvidia官方的 NVIDIA Network Operator 方案,它是一个 Kubernetes Operator,能够自动化地部署、配置和管理下文提到的所有RDMA相关组件。
接下来我们看看如何部署配置

1.安装OFED驱动

我们首先去https://network.nvidia.com/products/infiniband-drivers/linux/mlnx_ofed/下载合适的IB网卡驱动程序
tar -xvf MLNX_OFED_LINUX-*.tgz
cd MLNX_OFED_LINUX-*
sudo ./mlnxofedinstall --add-kernel-support --skip-distro-check --force --enable-opensm

上述安装好驱动重启以后可以使用命令进行IB网卡的检查。

2.安装network-operator

首先我们需要创建命名空间

kubectl create ns network-operator --dry-run=client -o yaml | kubectl apply -f -
kubectl label --overwrite ns network-operator pod-security.kubernetes.io/enforce=privileged

然后使用helm进行安装

helm upgrade --install network-operator nvidia/network-operator \
    --namespace network-operator \
    --set nfd.enabled=false \
    --set ofedDriver.deploy=false \
    --set rdmaSharedDevicePlugin.deploy=true \
    --set sriovNetworkOperator.enabled=true \

使用helm upgrade --install是幂等的,无论是否安装过都会生效。
这里安装的关键是我们需要禁用NFD

3.安装NicClusterPolicy对象定义网络策略

tee ./nic-cluster-policy.yaml<<EOF
apiVersion: mellanox.com/v1alpha1
kind: NicClusterPolicy
metadata:
  name: nic-cluster-policy
spec:
  rdmaSharedDevicePlugin:
    image: k8s-rdma-shared-dev-plugin
    repository: ghcr.io/mellanox
    version: v1.5.2
    config: |
      {
        "configList": [
          {
            "resourceName": "rdma_ib",
            "rdmaHcaMax": 100,
            "selectors": {
              "ifNames": ["ibp0","ibp1","ibp2","ibp3","ibp4","ibp5","ibp6","ibp7"]
            }
          }
        ]
      }
EOF

配置的含义:
resourceName: "rdma_ib":在节点上会注册为可计数的扩展资源,例如 rdma/ib,rdma/roce。

rdmaHcaMax: 100:每张网卡最多可被 100 个 Pod 共享(实际能否共享取决于网卡支持的 VF 数量,这里写大一点表示不设硬上限)。

selectors.vendors: ["15b3"]:只选择 Mellanox 设备。

selectors.ifNames: ["ibp0","ibp1","ibp2","ibp3","ibp4","ibp5","ibp6","ibp7"]:这里填写IB/ROCE网卡的名字,可以通过ibv_devices查询

selectors.linkTypes: ["IB"]:仅选择 InfiniBand 链路类型,如果是Roce网卡,则这里必须要添加,填写"linkTypes": ["ETH"]。

selectors.isRdma: true:确保设备支持 RDMA。

4.配置CNI和网络附加

tee ./ib-network.yaml<<EOF
apiVersion: k8s.cni.cncf.io/v1
kind: NetworkAttachmentDefinition
metadata:
  name: ib-network
spec:
  config: '{
      "cniVersion": "0.3.1",
      "type": "ib-sriov",
      # "ipam": { ... } # 如需IP地址,可配置IPAM,通常RDMA应用不需要
      # "type": "roce-sriov"  # RoCE需要添加这个
  }'
EOF

若需要使用IP over InfiniBand (IPoIB),可将type字段改为ipoib,并根据需要配置静态IP或DHCP

5.验证RDMA网卡上报

kubectl describe node <node_name>

可以查看到节点已经上报了100张IB网卡。
202605102346507114828649.png

6.部署工作负载

tee ./test_rdma.yaml<<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
  name: test-rdma
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      name: test
  template:
    metadata:
      labels:
        name: test
    spec:
      containers:
      - name: test
        image: nvidia/cuda:12.9.0-cudnn-devel-ubuntu22.04
        imagePullPolicy: IfNotPresent
        command: ["bash", "-c"]
        args: ["while true; do sleep 30; done;"]
        resources:
          requests:
            rdma/rdma_ib: 8
            nvidia.com/gpu: 8
          limits:
            rdma/rdma_ib: 8
            nvidia.com/gpu: 8

EOF

POD中没有lspci和ibstatus相关命令,我们安装一下

apt update -y
apt install pciutils infiniband-diags ibverbs-utils rdma-core -y

然后使用ibv_devices查看下容器内部的IB网卡

ibv_devices
    device                 node GUID
    ------              ----------------
    mpi_0               a088c2030054f946
    mpi_1               a088c2030054f96e
    mpi_2               a088c2030054f81e
    mpi_3               a088c203005a9bec
    mpi_4               a088c2030054f93e
    mpi_5               a088c2030054f7de
    mpi_6               a088c2030054f996
    mpi_7               a088c2030054f8b6
    mpi_8               a088c203006b0f38


内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://sulao.cn/post/1092

评论列表

0%