intel/intel-dlb-initcontainer该Intel DLB设备插件为Kubernetes集群提供对Intel DLB设备的支持。
DLB设备插件需要安装并启用Linux内核DLB驱动才能运行。获取DLB软件发行版,按照目录dlb/docs中DLB_Driver_User_Guide.pdf的说明构建并加载dlb2驱动模块。
成功加载模块后,可在设备文件系统中看到可用的dlb设备节点:
bash$ ls -1 /dev/dlb* /dev/dlb0 /dev/dlb1 /dev/dlb2 ...
如果需要配置SR-IOV/VF(虚拟功能),请继续以下配置。本说明使用DPDK工具检查事件设备、解绑VF设备以及将dlb2驱动绑定到VF设备。
为DPDK源代码打补丁以支持DLB:
bash$ wget -q [***] -O- | tar -Jx $ wget -q [***] -O- | tar -Jx $ cd ./dpdk-*/ && patch -p1 < ../dlb/dpdk/dpdk_dlb_*_diff.patch $ sed -i 's/270b,2710,2714/270b,2710,2711,2714/g' ./usertools/dpdk-devbind.py
列出事件设备:
bash$ ./usertools/dpdk-devbind.py -s | grep -A10 ^Eventdev Eventdev devices using kernel driver ==================================== 0000:6d:00.0 'Device 2710' drv=dlb2 unused= 0000:72:00.0 'Device 2710' drv=dlb2 unused= ...
启用虚拟功能:
bash$ echo 4 | sudo tee -a /sys/bus/pci/devices/0000\:6d\:00.0/sriov_numvfs
注意: 如果失败并提示"No such file or directory",可能是因为设备已绑定到vfio-pci驱动。请将设备绑定到dlb2驱动。
检查是否出现新的dlb设备节点:
bash$ ls -1 /dev/dlb* /dev/dlb0 /dev/dlb1 /dev/dlb10 /dev/dlb11 ... /dev/dlb8 /dev/dlb9
检查是否出现新的事件设备:
bash$ ./usertools/dpdk-devbind.py -s | grep -A14 ^Eventdev Eventdev devices using kernel driver ==================================== 0000:6d:00.0 'Device 2710' drv=dlb2 unused= 0000:6d:00.1 'Device 2711' drv=dlb2 unused= 0000:6d:00.2 'Device 2711' drv=dlb2 unused= 0000:6d:00.3 'Device 2711' drv=dlb2 unused= 0000:6d:00.4 'Device 2711' drv=dlb2 unused= 0000:72:00.0 'Device 2710' drv=dlb2 unused= ...
将PF资源分配给VF:
注意: 以下过程仅针对4个资源中的第一个vf资源。对
/sys/bus/pci/devices/0000\:6d\:00.0/中的其他vfN_resources重复此过程,然后将dlb2驱动绑定到对应vfN_resources的0000:6d:00.M。
bash$ sudo ./usertools/dpdk-devbind.py --unbind 0000:6d:00.1
bash$ echo 2048 | sudo tee -a /sys/bus/pci/devices/0000\:6d\:00.0/vf0_resources/num_atomic_inflights && echo 2048 | sudo tee -a /sys/bus/pci/devices/0000\:6d\:00.0/vf0_resources/num_dir_credits && echo 64 | sudo tee -a /sys/bus/pci/devices/0000\:6d\:00.0/vf0_resources/num_dir_ports && echo 2048 | sudo tee -a /sys/bus/pci/devices/0000\:6d\:00.0/vf0_resources/num_hist_list_entries && echo 8192 | sudo tee -a /sys/bus/pci/devices/0000\:6d\:00.0/vf0_resources/num_ldb_credits && echo 64 | sudo tee -a /sys/bus/pci/devices/0000\:6d\:00.0/vf0_resources/num_ldb_ports && echo 32 | sudo tee -a /sys/bus/pci/devices/0000\:6d\:00.0/vf0_resources/num_ldb_queues && echo 32 | sudo tee -a /sys/bus/pci/devices/0000\:6d\:00.0/vf0_resources/num_sched_domains && echo 2 | sudo tee -a /sys/bus/pci/devices/0000\:6d\:00.0/vf0_resources/num_sn0_slots && echo 2 | sudo tee -a /sys/bus/pci/devices/0000\:6d\:00.0/vf0_resources/num_sn1_slots
bash$ sudo ./usertools/dpdk-devbind.py --bind dlb2 0000:6d:00.1
运行libdlb示例应用:
注意: 另一种方法是使用此Dockerfile运行测试。
bash$ ls dlb dpdk-21.11 $ cd ./dlb/libdlb/ && make && sudo LD_LIBRARY_PATH=$PWD ./examples/dir_traffic -n 128 -d 1 # 若要测试/dev/dlbN,将1替换为N。
运行DPDK示例应用:
注意: 另一种方法是使用此Dockerfile修补和构建DPDK并运行测试。
bash$ sudo apt-get update && sudo apt-get install build-essential meson python3-pyelftools libnuma-dev python3-pip && sudo pip install ninja # 此配置基于Ubuntu/Debian发行版。对于不使用apt的其他发行版,请通过其他方式安装依赖。 $ ls dlb dpdk-21.11 $ cd ./dpdk-* && meson setup --prefix $(pwd)/installdir builddir && ninja -C builddir install
bashsudo ./builddir/app/dpdk-test-eventdev --no-huge --vdev='dlb2_event,dev_id=1' -- --test=order_queue --nb_flows 64 --nb_pkts 512 --plcores 1 --wlcores 2-7 # 若要测试/dev/dlbN,将1替换为N。
以下部分详细介绍如何获取、构建、部署和测试DLB设备插件。
示例展示了如何通过DaemonSet或按节点手动部署插件。
该组件的预构建镜像可在Docker Hub获取。这些镜像会从本仓库的最新main分支自动构建并上传至hub。
组件的发布标签镜像也可在Docker Hub获取,标签格式为x.y.z,对应本仓库中的分支和版本。因此,在集群中部署插件的最简单方法是运行以下命令:
bash$ kubectl apply -k '[***]<RELEASE_VERSION>' daemonset.apps/intel-dlb-plugin created
其中<RELEASE_VERSION>需要替换为所需的发布标签或main以获取devel镜像。
可通过在节点上搜索相关资源分配状态来验证插件是否已注册:
bash$ kubectl get nodes -o go-template='{{range .items}}{{.metadata.name}}{{"\n"}}{{range $k,$v:=.status.allocatable}}{{" "}}{{$k}}{{": "}}{{$v}}{{"\n"}}{{end}}{{end}}' | grep '^\([^ ]\)\|\( dlb\)' master dlb.intel.com/pf: 7 dlb.intel.com/vf: 4
可通过部署提供的示例测试镜像(dlb-libdlb-demo和dlb-dpdk-demo)来测试插件是否正常工作。
构建Docker镜像并创建基于本地Docker镜像运行单元测试的pod:
bash$ make dlb-libdlb-demo ... Successfully tagged intel/dlb-libdlb-demo:devel $ kubectl apply -f ${INTEL_DEVICE_PLUGINS_SRC}/demo/dlb-libdlb-demo-pod.yaml pod/dlb-libdlb-demo-pod created
bash$ make dlb-dpdk-demo ... Successfully tagged intel/dlb-dpdk-demo:devel $ kubectl apply -f ${INTEL_DEVICE_PLUGINS_SRC}/demo/dlb-dpdk-demo-pod.yaml pod/dlb-dpdk-demo-pod created
等待pod完成:
bash$ kubectl get pods | grep dlb-.*-demo NAME READY STATUS RESTARTS AGE dlb-dpdk-demo 0/2 Completed 0 79m dlb-libdlb-demo 0/2 Completed 0 18h
查看作业日志:
bash$ kubectl logs dlb-libdlb-demo <pf/vf> <日志输出>
bash$ kubectl logs dlb-dpdk-demo <pf/vf> <日志输出>
如果pod未能成功启动(可能是因为无法获取DLB资源),它将处于Pending状态:
bash$ kubectl get pods NAME READY STATUS RESTARTS AGE dlb-dpdk-demo 0/2 Pending 0 3s dlb-libdlb-demo 0/2 Pending 0 10s
可通过检查pod的事件来确认:
bash$ kubectl describe pod dlb-libdlb-demo | grep -A3 Events: Events: Type Reason Age From Message ---- ------ ---- ---- ------- Warning FailedScheduling 85s default-scheduler 0/1 nodes are available: 1 Insufficient dlb.intel.com/pf, 1 Insufficient dlb.intel.com/vf.
manifest unknown 错误
TLS 证书验证失败
DNS 解析超时
410 错误:版本过低
402 错误:流量耗尽
身份认证失败错误
429 限流错误
凭证保存错误
来自真实用户的反馈,见证轩辕镜像的优质服务