Help us improve your experience.

Let us know what you think.

Do you have time for a two-minute survey?

 
 

部署 DPDK 虚拟路由器

朝鲜民主主义人民共和国概述

云原生 Contrail® 网络 支持数据平面开发工具包 (DPDK)。DPDK 是一组用于快速数据包处理的开源库和驱动程序。云原生 Contrail 网络利用 DPDK 虚拟路由器技术加速容器联网。DPDK 允许网络接口卡 (NIC) 将直接内存访问 (DMA) 数据包直接发送到应用程序的地址空间,从而实现快速数据包处理。这种数据包路由方法允许应用程序轮询数据包,从而防止来自 NIC 的中断开销。

与作为用于容器服务功能的内核模块 DPDK 接口运行时相比,利用 DPDK 使云原生 Contrail vRouter 每秒处理的数据包更多。CN2 利用 DPDK vRouter 的处理能力,利用处理能力实现高需求的容器服务功能。

使用 DPDK 预配 Contrail 计算节点时,相应的 YAML 文件将指定:

  • 用于转发数据包的 CPU 内核数。

  • 要为 DPDK 分配的大页数。

  • 用于 DPDK 的 UIO 驱动程序。

DPDK 虚拟路由器支持 DPDK 和非 DPDK 工作负载

当容器或 Pod 需要访问 DPDK 虚拟路由器时,会出现以下工作负载类型:

  1. 非 DPDK 工作负载 (Pod):此工作负载包括不知道底层 DPDK 虚拟路由器的非 DPDK 容器应用程序。这些应用程序不是为 DPDK 设计的,也不使用 DPDK 功能。在云原生 Contrail 网络中,此工作负载类型在启用了 DPDK vRouter 的群集中正常运行。

  2. 容器化 DPDK 工作负载:这些工作负载基于 DPDK 平台构建。DPDK 接口使用(虚拟主机)vhost 协议启动,该协议充当管理和控制功能的数据路径。vhost 协议使虚拟化主机设备能够映射到虚拟输入和输出 (virtio) 设备。Pod 充当虚拟主机服务器,底层 DPDK 虚拟路由器充当虚拟主机客户端。

  3. 非 DPDK 和 DPDK 工作负载的混合:此容器中应用程序中应用程序的管理或控制通道是非 DPDK(Veth 对),数据路径是 DPDK 接口。Veth 对是一对连接的虚拟以太网接口。

非 DPDK 容器概述

虚拟以太网 (Veth) 对探测非 DPDK Pod 的网络。Veth 对的一端附加到 Pod 的命名空间。另一端连接到主机的内核。容器网络接口 (CNI) 建立 Veth 对并使用 IP 地址管理 (IPAM) 分配 IP 地址。

DPDK 容器概述

DPDK Pod 包含一个虚拟接口和一个虚拟接口。Pod 将虚拟接口用于管理目的,将 virtio 接口用于高吞吐量数据包处理应用程序。容器中的 DPDK 应用程序使用虚拟主机协议与主机中的 DPDK 虚拟路由器建立通信。DPDK 应用程序接收一个参数,用于为 UNIX 套接字建立文件路径。vRouter 使用此套接字建立控制通道、运行协商,并在高速数据路径的大页共享内存上创建 vring。

非 DPDK 和 DPDK 容器的混合概述

此容器可能包含非 DPDK 和 DPDK 应用程序。非 DPDK 应用程序使用非 DPDK 接口(Veth 对),DPDK 应用程序使用 DPDK 接口(vhost、virtio)。这两个工作负载同时发生。

DPDK 虚拟路由器架构

Contrail DPDK vRouter 是在 Contrail 计算节点内运行的容器。vRouter 作为 Linux 内核模块或用户空间 DPDK 进程运行。vRouter 负责在物理设备上的虚拟工作负载(租户、来宾)之间传输数据包。虚拟路由器还在虚拟接口和物理接口之间传输数据包。

CN2 虚拟路由器支持以下封装协议:

  • MPLS over UDP (MPLSoUDP)

  • MPLS over GRE (MPLSoGRE)

  • 虚拟可扩展局域网 (VXLAN)

与传统的Linux内核部署相比,将vRouter部署为用户空间DPDK进程,大大提高了vRouter应用程序的性能和处理速度。这种性能的提高是以下因素的结果:

  • 在用户空间中运行的虚拟网络功能 (VNF) 专为 DPDK 构建,旨在充分利用 DPDK 的数据包处理能力。

  • DPDK 的轮询模式驱动程序 (PMD) 使用 VM 主机的物理接口 (NIC),而不是 Linux 内核的基于中断的驱动程序。NIC 的寄存器在用户空间中运行,这使得 DPDK 的 PMD 可以访问它们。

因此,Linux 操作系统不需要管理 NIC 的寄存器。这意味着 DPDK 应用程序管理 NIC 的所有数据包轮询、数据包处理和数据包转发。DPDK 应用程序不会等待 I/O 中断发生,而是不断轮询数据包,并在收到数据包后立即进行处理。

容器的 DPDK 接口支持

DPDK 的优势和架构通常会优化虚拟机网络。云原生 Contrail 网络可让您的 Kubernetes 容器充分利用这些功能。在 Kubernetes 中,容器化的 DPDK Pod 通常包含两个或更多接口。以下接口构成 DPDK Pod 的主干:

  • 虚拟主机用户协议(用于管理): 虚拟主机用户协议是与主机接口的后端组件。在云原生 Contrail 网络中,虚拟主机接口充当容器与虚拟路由器之间管理和控制功能的数据路径。该协议包括以下两个平面:
    • 控制平面通过 Unix 套接字在 Pod 和 vRouter 之间交换信息(DMA 的内存映射、用于建立和终止数据平面的功能协商)。

    • 数据平面通过直接内存访问实现,并在 Pod 和 vRouter 之间传输数据包。

  • Virtio 接口(用于高通量应用): 从高层次上讲,virtio 是在 Pod 和 vRouter 之间传输数据包的虚拟设备。virtio 接口是一种共享内存 (shm) 解决方案,允许 Pod 访问 DPDK 库和功能。

这些接口使 DPDK 虚拟路由器能够在 Pod 之间传输数据包。这些接口使 Pod 能够访问 vRouter 提供的高级网络功能(大页面、无锁环形缓冲区、轮询模式驱动程序)。有关这些功能的更多信息,请访问 虚拟用户领域之旅

应用程序使用 DPDK 创建虚拟接口和虚拟接口。然后,应用程序或 pod 直接使用 DPDK 库来建立使用 Unix 域套接字的控制通道。这些接口使用共享内存 vring 在 Pod 和 vRouter 之间建立数据路径。

DPDK 虚拟路由器主机先决条件

要部署 DPDK 虚拟路由器,必须在主机节点上配置以下大页面和网卡。大页面使操作系统能够使用大于默认 4KB 的内存页面:

  • 大页面配置:指定要为 DPDK 大页面保留的主机内存百分比。以下命令行显示了设置为 2MB 的大页面:

    以下示例分配四个 1GB 大页面和 1024 个 2MB 大页面:

    注意:

    我们建议您为巨大的页面大小分配 1GB。

  • 巨大页面z=1G 巨大页面=4 巨大页面z=2M 巨大页面=1024”
  • 启用(输入输出内存管理单元 (IOMMU):DPDK 应用程序需要 IOMMU 支持。配置 IOMMU 设置并从 BIOS 启用 IOMMU。应用以下标志作为引导参数以启用 IOMMU:

  • 确保将内核驱动程序加载到主机 NIC 的端口转发 0(端口 0)上。确保将 DPDK PMD 驱动程序加载到主机网卡的端口转发 1(端口 1)上。

    注意:在 DPDK 和内核驱动程序使用通用 NIC 的不同端口的环境中,我们强烈建议您部署一个 DPDK 节点,其中内核驱动程序绑定到 NIC 上的端口 0。我们进一步建议您部署绑定到该 NIC 的端口 1 的 DPDK PMD 驱动程序。其他端口分配配置可能会导致性能问题。有关详细信息,请参阅以下 DPDK 文档的第 24.9.11 节: I40E 轮询模式驱动程序
  • PCI 驱动程序(vfio-pci,uio_pci_generic):根据 NIC 类型指定要使用的 PCI 驱动程序。

    注意:

    vfio-pci 是内置的。

    • 如果需要,请手动安装 uio_pci_generic 模块:

    • 验证是否已安装 uio_pci_generic 模块:

在计算节点中使用 DPDK vRouter 部署 Kubernetes 群集

云原生 Contrail 网络利用 DPDK 部署程序启动与 DPDK 兼容的 Kubernetes 集群。此部署人员执行生命周期管理功能并应用 DPDK vRouter 先决条件。DPDK 虚拟路由器的自定义资源 (CR) 是部署程序的子集。CR 包含以下内容:

  • 用于部署云原生 Contrail 网络资源的控制器

  • 虚拟路由器的内置控制器逻辑

应用 DPDK 部署程序 YAML 文件,并使用以下命令部署 DPDK 虚拟路由器 CR agentModeType: dpdk

应用 CR YAML 文件后,部署程序会为虚拟路由器创建 守护程序集 。这个 deamonset 使用一个 DPDK 容器启动一个 pod。

如果收到错误消息,请使用以下命令确保您的集群具有适用于 vRouter 的自定义资源定义 (CRD):

以下是您收到的输出的示例:

如果集群中不存在 CRD,请使用以下命令检查部署程序:

检查容器使用的 contrail-k8s-crdloader 映像。此映像应该是部署程序使用的最新映像。更新映像并确保新容器使用此映像。

验证新容器是否正在运行最新映像后,请使用以下命令验证虚拟路由器的 CRD 是否存在:

验证虚拟路由器的 CRD 是否存在后,请使用以下命令应用虚拟路由器 CR:

DPDK 虚拟路由器自定义资源设置

您可以配置虚拟路由器 CR 的以下设置:

  • service_core_mask:指定服务核心掩码。服务核心掩码使您能够为服务动态分配 CPU 核心。

  • 您可以输入以下输入格式:

    • 十六进制(例如,0xf)

    • 以逗号分隔的 CPU 列表(例如,1,2,4)

    • 用短划线分隔的 CPU 范围(例如,1-4)

    注意:

    PMD 需要大量可用 CPU 内核来进行数据包处理。因此,我们建议您为 service_core_maskdpdk_ctrl_thread_mask保留最多 1 到 2 个 CPU 内核。这两个内核共享 CPU 能力。

  • cpu_core_mask:指定 CPU 核心掩码。DPDK 的 PMD 将这些内核用于高吞吐量数据包处理应用。

    以下是受支持的输入格式:

    • 十六进制(例如,0xf)

    • 以逗号分隔的 CPU 列表(例如,1,2,4)

    • 用短划线分隔的 CPU 范围(例如,1-4)

  • dpdk_ctrl_thread_mask:指定控制线程掩码。DPDK 使用这些核心线程进行内部处理。

    以下是受支持的输入格式:

    • 十六进制(例如,0xf)

    • 以逗号分隔的 CPU 列表(例如,1,2,4)

    • 用短划线分隔的 CPU 范围(例如,1-4)

    注意:

    PMD 需要大量可用 CPU 内核来进行数据包处理。因此,我们建议您为 service_core_maskdpdk_ctrl_thread_mask保留最多 1 到 2 个 CPU 内核。这两个内核共享 CPU 能力。

  • dpdk_command_additional_args:指定非默认设置的 DPDK 虚拟路由器设置。您在此处输入的参数将追加到 DPDK PMD 命令行中。

    下面是一个示例参数:--yield_option 0