运行DPDK类型的应用

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