由于越来越多的接触到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网卡。
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
EOFPOD中没有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
评论列表