You need to enable JavaScript to run this app.
文档中心
容器服务

容器服务

复制全文
下载 pdf
网络
部署并运行 DPDK 应用
复制全文
下载 pdf
部署并运行 DPDK 应用
容器服务支持在 Pod 中开启 DPDK,适用于需要低延迟、高吞吐量的场景。本文介绍如何在集群中部署并运行 DPDK 应用。​
背景信息​
DPDK(Data Plane Development Kit)是一种高性能网络数据面开发工具包,通过采用用户态轮询驱动、大页内存、CPU 亲和性、无锁队列等技术,绕过传统 Linux 内核协议栈,大幅减少中断、上下文切换与系统调用开销,显著提升数据包转发性能,单 CPU 核可实现千万级 PPS 的处理能力。​
在 DPDK 模式下,允许将主机网卡通过直通的方式分配至容器,作为 DPDK 高性能数据面网卡使用。 通过 Pod 挂载双网卡,可实现业务面与控制面流量物理隔离,避免带宽争抢与延迟扰动,保障微秒级转发稳定。​
​​​
前提条件​
  • 已安装 vpc-cni 组件,并升级至 v1.9.6 及以上版本。​
  • 在集群的节点中,已启用 VFIO 设备驱动。您可以在节点上执行如下命令,确定 VFIO 驱动是否启用。​
  • ​
    lsmod | grep vfio-pci​
    ​
  • 预期结果示例如下。​
  • ​
    vfio_pci 65536 0​
    vfio_iommu_type1 36864 0​
    vfio 36864 2 vfio_iommu_type1, vfio_pci​
    vfio_virqfd 16384 1 vfio_pci​
    irqbypass 16384 1 vfio_pci​
    ​
使用限制​
  • 仅支持在 VPC-CNI 容器网络模型的集群中使用。​
  • 节点可挂载网卡数量 ≥ 3,即至少包含主网卡,辅助网卡和独占网卡。​
  • 仅支持在新节点开启 DPDK,推荐配置专属的节点池。​
操作步骤​
步骤一:开启 DPDK 功能​
  1. 在左侧导航栏中,选择 集群。单击目标集群名称,进入集群管理页面。​
  1. 在左侧导航栏中,选择 配置管理 > 配置项。​
  1. 在 命名空间 下拉菜单中选择 kube-system,找到 cello-config,单击 操作 栏中的 编辑 Yaml。​
  1. 在data.conf字段中,添加exclusiveENIPoolQuota字段,开启节点的 DPDK 功能。​
说明​
推荐开启节点池级的 DPDK 功能。您可以在节点池的配置项中添加exclusiveENIPoolQuota字段。节点池级别配置项的配置方式,请参见 配置节点池级别 Pod 安全组和子网。​
  • ​
    apiVersion: v1​
    kind: ConfigMap​
    metadata:​
    name: cello-config​
    namespace: kube-system​
    data:​
    conf: |​
    {​
    "exclusiveENIPoolQuota": 2,​
    "subnets": [​
    "subnet-22joc5bb2g***",​
    "subnet-22joc64wj5***"​
    ],​
    ...​
    }​
    ...​
    ​
  • 配置中的参数说明,如下表所示。​
  • ​
    参数​
    说明​
    exclusiveENIPoolQuota​
    单个节点中需要使用 DPDK 网卡的 Pod 数量。​
    ​
注意​
如果您配置完成后需要修改上述配置,修改后请注意需要重启 cello Pod 才能生效。​
  1. 通过 kubectl 连接集群,执行以下命令,滚动重启 Cello Pod,使得配置生效。​
  • ​
    kubectl rollout restart daemonset cello -n kube-system​
    ​
步骤二:开启节点中的 DPDK 依赖​
​
手工配置
通过脚本配置
​
您可以手工配置指定节点中的 HugePages 功能,操作步骤如下:​
  1. 使用 ECS Terminal 登录目标节点。详情请参见 ECS Terminal。​
  1. 执行以下命令,在 sysctl 配置文件中配置节点 HugePages 数量。​
  • ​
    sysctl -w vm.nr_hugepages=1024​
    ​
说明​
  • 本例中以配置 2Mi HugePages 数量为例,实际配置时请按需调整。​
  • 更多节点 HugePages 特性说明,请参见 官方文档。​
  1. 执行以下命令,重启 kubelet。​
  • ​
    systemctl restart kubelet​
    ​
​
配置完成后,您可以 通过 kubectl 连接集群,执行以下命令,查看节点信息。其中${node-ip}为节点 IP 地址,例如 192.168.1.188。​
​
kubectl describe node ${node-ip}​
​
预期结果如下,可以看到节点中允许分配或已分配的 HugePages 和 ENI 数量。​
​
Addresses:​
InternalIP: 192.168.2.188​
Hostname: 192.168.2.188​
Capacity:​
cpu: 4​
ephemeral-storage: 102626232Ki​
hugepages-1Gi: 0​
hugepages-2Mi: 2Gi​
memory: 16122304Ki​
pods: 46​
vke.volcengine.com/eni: 2​
vke.volcengine.com/eni-ip: 10​
Allocatable:​
cpu: 3900m​
ephemeral-storage: 94580335255​
hugepages-1Gi: 0​
hugepages-2Mi: 2Gi​
memory: 11255454105600m​
pods: 46​
vke.volcengine.com/eni: 2​
vke.volcengine.com/eni-ip: 10​
​
步骤三:在 Pod 中使用 DPDK​
  1. (可选)您可以使用如下 Dockerfile 示例,构建 DPDK 测试镜像。并在镜像中安装 testpmd,用于测试。​
  • ​
    FROM ubuntu:20.04​
    ARG DPDK_VERSION=21.11.3​
    ​
    # 安装 DPDK 编译依赖​
    RUN apt-get update && \​
    apt-get install -y build-essential python3 python3-pip pciutils iproute2 libnuma-dev && \​
    pip3 install meson ninja==1.8.2 pyelftools​
    ​
    # 编译安装 DPDK + testpmd​
    RUN mkdir -p /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 && \​
    ldconfig​
    ​
  1. 使用上述镜像创建 Pod,并配置 DPDK。关键配置如下:​
  • 挂载 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 驱动。​
  • ​
    apiVersion: v1​
    kind: Pod​
    metadata:​
    name: pod-demo​
    annotations:​
    k8s.volcengine.com/pod-networks: | # 为 Pod 配置双网卡​
    [​
    {​
    "cniConf":{​
    "name":"eni"​
    }​
    }​
    ]​
    spec:​
    containers:​
    - name: dpdk-demo​
    image: doc-demo-cn-shanghai.cr.volces.com/demo/dpdk-demo:v1.4​
    args: ​
    - "-c"​
    - "sleep infinity &&mount -o remount,rw /sys/ && dpdk-devbind.py --force -b vfio-pci eth1 && dpdk-testpmd -- --forward-mode icmpecho"​
    command:​
    - bash​
    tty: true ​
    resources:​
    limits:​
    vke.volcengine.com/eni: 1​
    hugepages-2Mi: 1Gi # 申请的 HugePages 数量​
    memory: 1Gi​
    requests:​
    hugepages-2Mi: 1Gi # requests 配置需要与 limits 一致​
    memory: 1Gi​
    securityContext:​
    privileged: true # 开启特权容器​
    capabilities:​
    add:​
    - IPC_LOCK​
    volumeMounts: # 挂载 VFIO 设备​
    - 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​
    ​
结果验证​
查看配置​
  1. 配置完成后,系统会自动为 Pod 补全 Annotationk8s.volcengine.com/network-status,展示该 Pod 挂载的网卡信息。例如在本例中,Pod 挂载了 2 块网卡,IP 地址分别为192.168.1.242和192.168.1.244。​
  • ​​​
  1. 执行以下命令,进入对应 Pod。​
  • ​
    kubectl exec -it dpdk-demo -- bash​
    ​
  1. 执行以下命令,查看 Pod 环境中的环境变量。​
  • ​
    env​
    ​
  • 预期结果如下,其中:​
  • RESOURCE_NAME:表示 Pod 中的 PCI 设备名称。​
  • PCIDEVICE_VOLCENGINE_COM_ENI:表示对应 PCI 设备的地址(BDF)。​
  • ​
    KUBERNETES_SERVICE_PORT_HTTPS=443​
    KUBERNETES_SERVICE_PORT=443​
    HOSTNAME=pod-demo​
    PCIDEVICE_VOLCENGINE_COM_ENI=0000:03:02.0​
    PWD=/​
    HOME=/root​
    DPDK_EXPORTER_DIR=/dpdk-telemetry-exporter​
    RTE_SDK=/dpdk​
    DPDK_DIR=/dpdk​
    RESOURCE_NAME=PCIDEVICE_VOLCENGINE_COM_ENI​
    KUBERNETES_PORT_443_TCP_PROTO=tcp​
    ...​
    ​
测试验证​
您可以在 Pod 中安装 testpmd,验证 DPDK 功能。更多详情,请参见 官方文档。​
  1. 执行以下命令,查看 DPDK 版本。​
  • ​
    dpdk-testpmd -v​
    ​
  1. 执行以下命令,查看 DPDK 端口状态。​
  • ​
    show port info all​
    ​
  • 预期结果如下。​
  • ​
    Telling cores to stop...​
    Waiting for lcores to finish...​
    ​
    +++++++++++++++ Accumulated forward statistics for all ports+++++++++++++++​
    RX-packets: 0 RX-dropped: 0 RX-total: 0​
    TX-packets: 0 TX-dropped: 0 TX-total: 0​
    ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++​
    ​
    Done.​
    ​
    Bye...​
    ​
  1. 执行以下命令,启动 testpmd,查看 DPDK 是否工作正常。​
  • ​
    dpdk-testpmd -l0-1 -n4 -- -i​
    ​
  • 预期结果如下,日志显示 DPDK 工作正常。​
  • ​
    EAL: Detected CPU lcores: 4​
    EAL: Detected NUMA nodes: 1​
    EAL: Detected static linkage of DPDK​
    EAL: Multi-process socket /var/run/dpdk/rte/mp_socket​
    EAL: Selected IOVA mode 'PA'​
    EAL: Probe PCI devices: 0000:xx:xx.x ​
    EAL: Probe PCI devices: 0000:xx:xx.x​
    ...​
    Interactive-mode selected ​
    testpmd: create a new mbuf pool <mbuf_pool_socket_0>: size=xxx, nb_mbufs=xxx ​
    Configuring Port 0 (socket 0) ​
    Port 0: xx:xx:xx:xx:xx:xx ​
    Checking link statuses... ​
    Port 0 Link Up - speed 10000 Mbps - full-duplex ​
    Done ​
    ...​
    ​
后续配置​
当 DPDK 程序退出后,请在 Pod 中执行以下命令,手工清除 driver_override。​
​
echo > /sys/bus/pci/devices/<pciaddr>/driver_override​
​
​
最近更新时间:2026.10.23 10:37:21
这个页面对您有帮助吗?
有用
有用
无用
无用