运行DPDK类型的应用

本文介绍如何在阿里云容器服务ACK上运行DPDK类型的应用。

前提条

DPDK(Data Plane Development Kit)应用依赖于Terway独占ENI模式来运行,该模式需要在配额中心申请容器网络支持Terway ENI独占模式白名单使用。

创建Terway独占ENI类型的集群

以下操作均需登录容器服务管理控制台进行操作。

步骤一:配置集群网络类型为Terway独占ENI模式

重要

仅支持在创建集群时配置集群网络类型为Terway独占ENI模式,集群创建后将不支持修改网络类型和模式。

由于DPDK依赖应用独占网络设备,所以在创建集群时网络插件需要选择Terway并勾选Pod 独占弹性网卡以获得最佳性能选项。详细选项配置,请参见使用Terway网络插件

步骤二:配置节点池开启DPDK依赖选项

需要在节点加入时配置好DPDK应用依赖的VFIO驱动和大页内存。

在创建集群的节点池配置页面,或者已有集群(集群已部署网络类型为Terway独占ENI模式)的创建节点池页面,单击显示高级选项区域,然后在实例自定义数据区域填写如下脚本进行节点池配置。具体操作,请参见实例预自定义数据

# 启用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

步骤一:构建DPDK容器镜像

通过Dockerfile构建DPDK,如下为构建官方DPDK包的Dockerfile示例。

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

步骤二:通过Pod运行DPDK程序

通过Pod运行上一步骤构建的DPDK的容器镜像,运行Pod所需要的额外配置如下。

  • 通过hostPath方式额外挂载宿主机的/dev目录用于访问vfio设备。

  • 额外申请hugepage资源和挂载hugepage用于运行DPDK应用所需的大页内存。

  • DPDK应用前需要首先执行mount -o remount,rw /sys/ && dpdk-devbind.py --force -b vfio-pci eth0,为Pod网卡切换驱动为vfio。

如下示例为运行dpdk-testpmd的示例模板。

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