DPDK(Data Plane Development Kit)是一种高性能网络数据面开发工具包,常用于需要低延迟、高吞吐量的场景。本文介绍如何在ACK集群中运行DPDK应用。
步骤一:创建可运行 DPDK 应用的节点池
您可以在控制台创建并配置可运行 DPDK 应用的节点池。
1、配置节点池维度的容器网络
DPDK应用需基于Terway独占ENI模式运行,请参见配置节点池级容器网络完成节点配置。
2、配置节点池开启DPDK依赖
为充分发挥 DPDK 的高性能优势,节点加入集群前或启动 DPDK 应用前,需完成VFIO驱动和大页内存(HugePages)的配置。
VFIO驱动:允许应用直接访问物理网卡,降低延迟。
HugePages:减少页表切换开销,提升应用的内存访问效率。
您可以在节点池创建或编辑页面,单击高级选项(选填)区域,然后在实例自定义数据区域填写如下脚本完成对应配置。具体操作,请参见创建和管理节点池。
# 启用VFIO驱动
rmmod vfio-pci vfio_iommu_type1 vfio || true
modprobe vfio enable_unsafe_noiommu_mode=1
echo 1 > /sys/module/vfio/parameters/enable_unsafe_noiommu_mode
modprobe vfio-pci
# 打开节点上的hugepage
sysctl -w vm.nr_hugepages=1024
# 重启kubelet以上报hugepage资源
systemctl restart kubelet
步骤二:在Pod中使用DPDK
1、构建DPDK容器镜像
您可以参见如下Dockerfile示例构建官方DPDK镜像。
FROM alibaba-cloud-linux-3-registry.cn-hangzhou.cr.aliyuncs.com/alinux3/alinux3
ARG DPDK_VERSION=21.11.3
# dpdk dependency
RUN yum groupinstall -y 'Development Tools' && yum install -y python3 pciutils iproute && pip3 install meson ninja==v1.8.2 pyelftools
# dpdk build
RUN mkdir dpdk_build && cd dpdk_build && curl -OL http://fast.dpdk.org/rel/dpdk-${DPDK_VERSION}.tar.xz \
&& tar -xvf dpdk-${DPDK_VERSION}.tar.xz \
&& cd dpdk-stable-${DPDK_VERSION} \
&& meson build && cd build && ninja && ninja install
2、通过Pod运行DPDK容器镜像
为运行此前构建的DPDK容器镜像,需为Pod配置如下关键参数。
挂载 VFIO 设备:使用
hostPath
类型的 Volume 将宿主机的/dev
目录挂载到容器的/dev
。HugePages内存申请:在 Pod 配置中声明DPDK 应用所需 HugePages 与内存限制。
网卡驱动绑定:容器启动前,执行
mount -o remount,rw /sys/ && dpdk-devbind.py --force -b vfio-pci eth0
,将Pod的网卡驱动卡绑定到vfio-pci
驱动。
一个运行DPDK应用的Pod YAML示例如下。
apiVersion: v1
kind: Pod
metadata:
name: dpdk-test
spec:
containers:
- args:
- "-c"
- "mount -o remount,rw /sys/ && dpdk-devbind.py --force -b vfio-pci eth0 && dpdk-testpmd -- --forward-mode icmpecho"
command:
- bash
tty: true
image: registry.aliyuncs.com/acs-sample/dpdk-test:21.11.3
imagePullPolicy: Always
name: dpdk-test
resources:
limits:
hugepages-2Mi: 1Gi
memory: 2Gi
securityContext:
privileged: true
volumeMounts:
- name: host-dev
mountPath: /dev
- mountPath: /hugepages-2Mi
name: hugepage-2mi
volumes:
- name: host-dev
hostPath:
path: /dev
- name: hugepage-2mi
emptyDir:
medium: HugePages-2Mi
该文章对您有帮助吗?