使用多 CNI 插件在 OKE 上部署启用 SR-IOV 的网络接口容器应用程序

简介

在本教程中,我们将探讨如何利用高级网络功能在 Oracle Cloud Infrastructure Kubernetes Engine (OKE) 中的虚拟实例 worker 节点上部署容器化应用。具体而言,我们将为容器网络接口启用单根 I/O 虚拟化 (Single Root I/O Virtualization,SR-IOV) 并配置 Multus CNI 插件,以便为您的容器启用多宿主网络。

通过将 SR-IOV 与 Multus 相结合,您可以为 AI、机器学习和实时数据处理等专业工作负载实现高性能、低延迟的网络。本教程将提供以下分步说明:配置 OKE 环境、部署启用了 SR-IOV 的接口的 worker 节点,以及使用 Multus CNI 管理云池中的多个网络接口。无论您是希望实现高速数据包处理,还是需要微调 Kubernetes 网络,本教程都将为您提供入门所需的工具和知识。

注:

图像

目标

任务 1:使用堡垒、操作员、三个 VM Worker 节点和 Flannel CNI 插件部署 OKE

确保使用以下设置部署 OKE:

此设置详见此处的教程:使用 Oracle Cloud Infrastructure Kubernetes Engine 部署 Kubernetes 集群和 Terraform

下图显示了本教程中我们将使用的组件的可视化概览。

图像

任务 2:在每个 Worker 节点上启用 SR-IOV(硬件辅助)网络

注:需要在 OKE 群集中的所有 worker 节点上执行以下步骤。

下图显示了我们在本教程中将使用的 OKE 群集内 worker 节点的直观概览。

图像

在实例上启用 SR-IOV

任务 3:为启用 SR-IOV 的 VNIC 创建新子网

我们将创建启用 SR-IOV 的接口将使用的专用子网。

任务 3.1:创建安全列表

由于我们已经在为其他子网使用安全列表,因此我们还需要为新创建的 SR-IOV 子网提供专用安全列表。

任务 3.2:创建子网

任务 4:添加第二个 VNIC 附件

下图直观地显示了在添加第二个 VNIC 之前 Worker 节点如何具有连接到 Worker 节点子网的单个 VNIC。

图像

在将另一个 VNIC 附件添加到 worker 节点之前,请创建一个网络安全组。

任务 4.1:创建网络安全组 (NSG)

我们已将 NSG 用于其他 VNIC,但对于新创建的 VNIC,我们还需要一个专用 NSG。新创建的 VNIC 将添加到 OKE 集群中的现有虚拟实例,并将作为 Kubernetes worker 节点发挥其作用。此接口将是已启用 SR-IOV 的 VNIC。

任务 4.2:添加 VNIC

任务 5:使用默认网关将 IP 地址分配给新的第二个 VNIC

现在,第二个 VNIC 已在任务 4 中创建并连接,我们需要为其分配 IP 地址。向实例添加第二个接口时,您可以将其分配到与第一个接口相同的子网,也可以选择新的子网。

没有为第二个接口启用 DHCP,因此需要手动分配 IP 地址。

为第二个接口分配 IP 地址的方法有多种。

对于所有 worker 节点,我们为辅助 vNIC (ens5) 分配了一个 IP 地址。我们使用方法 3 将 IP 地址分配给辅助 vNIC (ens5)。有关将 IP 地址分配给第二个 VNIC 的更多信息,请参见 Assign an IP Address to a Second Interface on an Oracle Linux Instance

将 IP 地址分配给 VNIC 后,我们需要验证是否已正确配置第二个 VNIC 上的 IP 地址。我们还可以在所有节点池 worker 节点上验证是否启用了 SR-IOV。

OKE 集群包括:

节点池  
NP1 1 个 Worker 节点
NP2 3 个 Worker 节点

我们将验证所有节点池中的所有 worker 节点。

任务 5.1:验证节点池 1 中的所有节点 (np1)

任务 5.2:验证节点池 2 中的所有节点 (np2)

任务 6:在 Worker 节点上安装 Meta-Plugin CNI(多 CNI)

Multus CNI 是一个 Kubernetes 容器网络接口 (Container Network Interface,CNI) 插件,可用于将多个网络接口连接到一个云池。

多 CNI 的工作原理

为什么我们需要多 CNI

任务 6.1:使用瘦安装方法安装 Multus CNI

Multus 守护进程集的作用

任务 6.2:验证多重安装

任务 7:将网络接口连接到云池

在此任务中,我们将 mapattach 容器接口到此 VNIC。

要将其他接口连接到 pod,我们需要配置接口才能连接。

有几个 CNI 插件可以与 Multus 一起使用来实现这一点。有关更多信息,请参阅插件概述

以下示例显示了配置添加到节点的辅助 ens5 接口的 NetworkAttachmentDefinition 对象。

任务 7.1:创建网络附件定义

NetworkAttachmentDefinition 用于设置网络连接,例如 pod 的辅助接口。

下面是配置 NetworkAttachmentDefinition 的两种方式:

注:在本教程中,我们将使用该方法使用 CNI 配置文件

我们有 4 个 Worker 节点,每个 Worker 节点都有一个将映射到容器(云池)上的接口的第二个 VNIC。

任务 7.2:使用附加的 NetworkDefinitionAttachment 创建云池

在此任务中,我们将 NetworkAttachmentDefinitions 绑定到实际的容器或 pod。

在下表中,我们创建了一个关于要托管在哪个 worker 节点上的 pod 的映射。

Worker(主节点)IP ens5 name 云池名 已完成
10.0.112.134 10.0.3.30/27 sriov-vnic-1 testpod1
10.0.66.97 10.0.3.15/27 sriov-vnic-2 testpod2
10.0.73.242 10.0.3.14/27 sriov-vnic-3 testpod3
10.0.89.50 10.0.3.16/27 sriov-vnic-4 testpod4

任务 7.3:创建具有节点亲和力的云池

默认情况下,Kubernetes 将决定 pod 的放置位置(worker 节点)。在此示例中,这是不可能的,因为 NetworkAttachmentDefinition 已绑定到 IP 地址,并且此 IP 地址已绑定到 VNIC,并且此 VNIC 已绑定到特定的 worker 节点。因此,我们需要确保我们创建的 pod 最终会出现在我们想要的 worker 节点上,当我们将 NetworkAttachmentDefinition 连接到 pod 时,这是必需的。

如果我们不这样做,可能会发生 pod 最终会出现在可用于 pod 的 IP 地址的其他位置。因此,云池将无法使用启用 SR-IOV 的接口进行通信。

任务 7.4:验证测试云池上的 IP 地址

任务 7.5:验证 Worker 节点上的 IP 地址

任务 8:在多个云池之间执行试通测试

所有云池都有一个 OCI 子网(连接启用了 SR-IOV 的 VNIC)中的 IP 地址,我们可以执行一些 ping 测试来验证网络连接是否正常工作。

注:在此示例中,我们使用 testpod1 对所有其他测试云池 net1 IP 地址执行 ping 操作。

任务 9:(可选)部署具有多个接口的云池

到目前为止,我们仅准备了一个 VNIC(恰好支持 SR-IOV),并将此 VNIC 移至云池中。我们已经为四个不同的测试舱做到了这一点。

现在,如果要将更多 VNIC 添加到特定云池中,该怎么办?您必须重复以下步骤:

在此任务中,您将找到一个示例,我们将在其中创建其他子网 VNIC、分配 IP 地址、NetworkAttachmentDefinition 并将其添加到 testpod1 的 pod 创建 YAML 文件中。

任务 10:删除所有云池部署和 NetworkAttachmentDefinitions

如果要使用 NetworkAttachmentDefinitions 重新启动或清除容器,请执行以下步骤:

确认

更多学习资源

通过 docs.oracle.com/learn 浏览其他实验室,或者通过 Oracle Learning YouTube 频道访问更多免费学习内容。此外,请访问 education.oracle.com/learning-explorer 以成为 Oracle Learning Explorer。

有关产品文档,请访问 Oracle 帮助中心