Help us improve your experience.

Let us know what you think.

Do you have time for a two-minute survey?

 
 

部署 DPDK vRouter 实现最佳容器网络

DPDK 概述

云原生 Contrail® 网络 支持数据平面开发套件 (DPDK)。DPDK 是一组开源库和驱动程序,可快速处理数据包。云原生 Contrail 网络借助 DPDK(数据平面开发套件)vRouter 技术加速容器网络。DPDK 允许网络接口卡 (NIC) 将直接存储器访问 (DMA) 数据包直接发送到应用程序的地址空间,从而实现快速数据包处理。此数据包路由方法允许应用程序对数据包进行投票,从而避免 NIC 中断的开销。

利用 DPDK 使云原生 Contrail vRouter 能够处理比作为内核模块 DPDK 接口运行以执行容器服务功能时每秒处理更多的数据包。云原生 Contrail 网络利用 DPDK vRouter 的处理能力来支持高需求容器服务功能。

使用 DPDK 配置 Contrail 计算节点时,相应的 YAML 文件指定用于转发数据包的 CPU 核心数量、为 DPDK 分配的庞大页面数以及用于 DPDK 的 UIO 驱动程序。

DPDK vRouter 支持 DPDK 和非 DPDK 工作负载

当容器或 Pod 需要访问 DPDK vRouter 时,将发生以下工作负载类型:

  1. 非 DPDK 工作负载 (pod):此工作负载包含非 DPDK Pod 应用程序,这些应用程序不了解底层 DPDK vRouter。这些应用程序并非专为 DPDK 而设计,也不使用 DPDK 功能。在云原生 Contrail 网络中,此工作负载类型在支持 DPDK vRouter 的群集中正常工作。
  2. 容器化 DPDK 工作负载:这些工作负载构建在 DPDK 平台上。DPDK 接口使用 vHost 协议建立,vHost 协议用作管理和控制功能的数据路径。Pods 充当 vHost 服务器,底层 DPDK vRouter 充当 vHost 客户端。
  3. 非 DPDK 和 DPDK 工作负载的组合:此 Pod 中的应用程序上的管理或控制通道可能是非 DPDK(Veth 对),而数据路径可能是 DPDK 接口。

非 DPDK Pod 概述

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

DPDK Pod 概述

DPDK Pod 包含 vhost 接口和虚拟机接口。该 Pod 将 vhost 接口用于管理目的,而 virtio 接口用于高吞吐量数据包处理应用。Pod 中的 DPDK 应用程序使用 vhost 协议与主机中的 DPDK vRouter 建立通信。DPDK 应用程序收到为 UNIX 插座建立文件路径的论点。vRouter 使用此插槽来建立控制通道、运行协商,并在用于高速数据路径的巨型页面共享内存上创建 vrings。

混合使用非 DPDK 和 DPDK Pod 概述

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

DPDK vRouter 架构

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

云原生 Contrail vRouter 支持以下封装协议:

  • 通过 UDP 的 MPLS (MPLSoUDP)
  • GRE 上的 MPLS (MPLSoGRE)
  • 虚拟可扩展 LAN (VXLAN)

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

  • 在用户空间中操作的虚拟网络功能 (VNF) 专为 DPDK 而构建,旨在利用 DPDK 的数据包处理能力。
  • DPDK 的轮询模式驱动程序 (PMD) 使用虚拟机主机的物理接口 (NIC),而不是基于 Linux 内核的中断驱动程序。NIC 的寄存器可在用户空间中运行,从而使 DPDK 的 PMD 可访问这些注册。

因此,Linux OS 不需要管理 NIC 的注册。这意味着 DPDK 应用程序管理 NIC 的所有数据包轮询、数据包处理和数据包转发。DPDK 应用程序不会等待 I/O 中断发生,而是会不断轮询数据包,并在收到数据包后立即处理这些数据包。

容器的 DPDK 接口支持

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

  • Vhost 用户协议(用于管理): vhost 用户协议是与主机接口的后端组件。在云原生 Contrail 网络中,vhost 接口充当 Pod 和 vRouter 之间管理和控制功能的数据路径。此协议包含以下两个平面:
    • 控制平面通过 Unix 插槽在 Pod 和 vRouter 之间交换信息(用于 DMA 的内存映射,用于建立和终止数据平面的功能协商)。
    • 数据平面通过直接内存访问实施,并在 Pod 和 vRouter 之间传输数据包。
  • Virtio 接口(适用于高吞吐量应用): 在较高级别,virtio 是一种虚拟设备,可在 Pod 和 vRouter 之间传输数据包。Virtio 接口是一种共享内存 (shm) 解决方案,允许 POD 访问 DPDK 库和功能。

这些接口使 DPDK vRouter 能够在 POD 之间传输数据包。这些接口使 pod 能够访问 vRouter 提供的高级网络功能(大页面、无锁环缓冲区、投票模式驱动程序)。有关这些功能的详细信息,请访问 vhost 用户领域之旅

应用程序使用 DPDK 创建 vhost 和 virtio 接口。然后,应用程序或 Pod 直接使用 DPDK 库使用 Unix 域插座建立控制通道。这些接口使用共享内存接线在 Pod 和 vRouter 之间建立数据路径。

DPDK vRouter 主机先决条件

要部署 DPDK vRouter,必须在主机节点上执行以下巨大页面和 NIC 配置:

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

    下面的示例分配了四个 1GB 巨页和 1024 个 2MB 的巨型页面:

    注意:

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

  • 启用 IOMMU(输入输出内存管理单元):DPDK 应用程序需要 IOMMU 支持。配置 IOMMU 设置并从 BIOS 启用 IOMMU。将以下标记应用为启动参数以启用 IOMMU:
  • 确保内核驱动程序已加载到主机 NIC 的端口转发 0(端口 0)上。确保 DPDK PMD 驱动程序装载到主机 NIC 的端口转发 1(端口 1)上。
    注意:

    在 DPDK 和内核驱动程序都使用通用 NIC 不同端口的环境中,我们强烈建议您部署一个 DPDK 节点,其中内核驱动程序绑定在 NIC 上的端口 0,而 DPDK PMD 驱动程序绑定在该 NIC 的端口 1。其他端口分配配置可能会导致性能问题。有关详细信息,请参阅以下 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 vRouter 的自定义资源 (CR) 是部署器的子集。CR 包含以下内容:

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

  • vRouter 的内置控制器逻辑

使用以下命令应用 DPDK 部署器 YAML 并部署 DPDK vRouter CR agentModeType: dpdk

应用 CR YAML 后,部署器会为 vRouter 创建 守护程序 。此 deamonset 使用 DPDK 容器启动 Pod。

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

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

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

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

验证新 Pod 是否运行最新映像后,请使用以下命令验证 vRouter 的 CRD 是否存在:

验证 vRouter 的 CRD 是否存在后,使用以下命令应用 vRouter CR:

DPDK vRouter 自定义资源设置

您能够配置 vRouter 的 CR 的以下设置:

  • service_core_mask:指定服务核心掩码。借助服务核心掩码,您可以为服务动态分配 CPU 核心。

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

    • Hexadecimal(例如0xf)

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

    • 用仪表隔开的 CPU 范围(例如 1-4)

    注意:

    PMD 需要将大部分可用 CPU 核心用于数据包处理。因此,我们建议您为 service_core_maskdpdk_ctrl_thread_mask。这两个核心具有共同的 CPU 功率。

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

    以下为支持的输入格式:

    • Hexadecimal(例如0xf)

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

    • 用仪表隔开的 CPU 范围(例如 1-4)

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

    以下为支持的输入格式:

    • Hexadecimal(例如0xf)

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

    • 用仪表隔开的 CPU 范围(例如 1-4)

    注意:

    PMD 需要将大部分可用 CPU 核心用于数据包处理。因此,我们建议您为 service_core_maskdpdk_ctrl_thread_mask。这两个核心具有共同的 CPU 功率。

  • dpdk_command_additional_args: 指定非默认设置的 DPDK vRouter 设置。在此处输入的参数会附加到 DPDK PMD 命令行。

    下面是一个示例论点:--yield_option 0

    .