本文介绍如何在阿里云容器服务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
文档内容是否对您有帮助?