使用多 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 网络,本教程都将为您提供入门所需的工具和知识。
注:
- 发布本教程时,作为 OKE 集群一部分的虚拟实例上的云池或容器无法与多 CNI 插件一起使用 SR-IOV CNI。
- 在本教程中,我们将向您展示如何通过移动 OKE 集群中的虚拟实例上的云池或容器上运行的云池内使用启用了 SR-IOV 的接口虚拟网络接口卡 (Virtual Network Interface Card,VNIC)(位于虚拟实例中)放入云池中,可在多 CNI 插件(其中根本不使用 SR-IOV CNI 插件)的帮助下使用。
- SR-IOV CNI 插件在属于 OKE 群集的裸金属实例上以及多 CNI 插件受支持。这超出了本教程的范围。
目标
- 使用 Multus CNI 插件在 OKE 中通过启用了 SR-IOV 的网络接口在虚拟实例 Worker 节点上部署容器应用程序。
任务 1:使用堡垒、操作员、三个 VM Worker 节点和 Flannel CNI 插件部署 OKE
确保使用以下设置部署 OKE:
- 堡垒
- 运算符
- 3 个 VM Worker 节点
- Flannel CNI 插件
此设置详见此处的教程:使用 Oracle Cloud Infrastructure Kubernetes Engine 部署 Kubernetes 集群和 Terraform 。
下图显示了本教程中我们将使用的组件的可视化概览。
任务 2:在每个 Worker 节点上启用 SR-IOV(硬件辅助)网络
注:需要在 OKE 群集中的所有 worker 节点上执行以下步骤。
下图显示了我们在本教程中将使用的 OKE 群集内 worker 节点的直观概览。
在实例上启用 SR-IOV
-
使用 SSH 登录到实例或 worker 节点。
- 运行
lspci
命令以验证当前在所有 VNIC 上使用的网络驱动程序。 - 请注意,使用了
Virtio
网络驱动程序。
- 转到 OCI 控制台中的实例详细信息页面。
- 向下滚动。
- 请注意, NIC 连接类型现在处于 PARAVIRTUALIZED 状态。
- 转到 OCI 控制台中的实例详细信息页面。
- 单击更多操作。
- 单击编辑。
- 运行
-
单击 Show advanced options 。
- 单击 Launch options 并选择 Hardware-assisted (SR-IOV) networking 作为 Networking type 。
- 单击 Save changes 。
-
单击重新引导实例以确认实例重新引导。
-
请注意,实例状态已更改为 STOPPING 。
-
请注意,实例状态已更改为 STARTING 。
-
请注意,实例状态已更改为 RUNNING 。
- 向下滚动。
- 请注意, NIC 附加类型现在为 VFIO 。
-
下图显示了到目前为止我们配置的内容的直观概述。
任务 3:为启用 SR-IOV 的 VNIC 创建新子网
我们将创建启用 SR-IOV 的接口将使用的专用子网。
任务 3.1:创建安全列表
由于我们已经在为其他子网使用安全列表,因此我们还需要为新创建的 SR-IOV 子网提供专用安全列表。
-
转到 OCI 控制台。
- 导航到 Virtual Cloud Networks 。
- 单击现有 VCN。
- 单击安全列表。
- 单击创建安全列表。
-
对于入站规则 1 ,输入以下信息。
- 输入名称。
- 选择 CIDR 作为源类型。
- 在
0.0.0.0/0
中输入 Source CIDR 。 - 选择 All Protocols 作为 IP Protocol 。
- 向下滚动。
- 对于出站规则 1 ,输入以下信息。
- 选择 CIDR 作为源类型。
- 在
0.0.0.0/0
中输入 Source CIDR 。 - 选择 All Protocols 作为 IP Protocol 。
- 单击创建安全列表。
-
请注意,将创建新的安全列表。
任务 3.2:创建子网
-
转到 Virtual Cloud Network Details(虚拟云网络详细信息)页面。
- 单击子网。
- 请注意已为 OKE 环境创建的现有子网。
- 单击创建子网。
- 输入名称。
- 输入 IPv4 CIDR 块。
- 向下滚动。
- 选择专用子网。
- 向下滚动。
- 为 DHCP 选项选择 Default DHCP Options 。
- 选择在任务 3.1 中创建的安全列表。
- 单击创建子网。
-
请注意,已创建网络子网。
注:
- 该子网本身没有任何启用 SR-IOV 的技术组件。
- 在本教程中,我们使用标准 OCI 子网来允许使用 SR-IOV 技术传输流量。
-
下图显示了到目前为止我们配置的内容的直观概述。
任务 4:添加第二个 VNIC 附件
下图直观地显示了在添加第二个 VNIC 之前 Worker 节点如何具有连接到 Worker 节点子网的单个 VNIC。
在将另一个 VNIC 附件添加到 worker 节点之前,请创建一个网络安全组。
任务 4.1:创建网络安全组 (NSG)
我们已将 NSG 用于其他 VNIC,但对于新创建的 VNIC,我们还需要一个专用 NSG。新创建的 VNIC 将添加到 OKE 集群中的现有虚拟实例,并将作为 Kubernetes worker 节点发挥其作用。此接口将是已启用 SR-IOV 的 VNIC。
-
转到 Virtual Cloud Network Details(虚拟云网络详细信息)页面。
- 导航到 Network Security Groups 。
- 单击 Create Network Security Group 。
-
添加以下规则。
- 入站:
- Allow Source Type(允许源类型):选择 CIDR 。
- 来源:输入
0.0.0.0/0
。 - 目标:将目标留空。
- Protocol:允许所有协议。
- 出站:
- Allow Source Type(允许源类型):选择 CIDR 。
- 源:将源留空。
- 目标:输入
0.0.0.0/0
。 - Protocol:允许所有协议。
- 入站:
-
请注意,NSG 已创建。我们将它应用于将要创建的新(辅助)VNIC(在 OKE 群集中的每个 worker 节点上)。
任务 4.2:添加 VNIC
-
导航到每个虚拟 worker 节点实例,并向每个 worker 节点添加第二个 VNIC。
- 导航到每个虚拟 worker 节点实例,然后单击 Attached VNICs 。
- 请注意,已存在 VNIC。
- 单击 Create VNIC 添加另一个 VNIC。
- 输入名称。
- 选择 VCN 。
- 选择在任务 3.2 中创建的子网。
- 选择 Use network security groups to control traffic 。
- 选择在任务 4.1 中创建的 NSG 。
- 向下滚动。
- Select Automatically assign private IPv4 address.
- 单击 Save changes 。
-
请注意,第二个 VNIC 会创建并附加到虚拟 worker 节点实例,还会附加到我们的子网。
-
使用 SSH 登录到实例或 worker 节点。
- 运行
lspci
命令以验证当前在所有 VNIC 上使用的网络驱动程序。 - 请注意,使用了 Mellanox Technologies ConnectX Family mlx5Gen Virtual Function 网络驱动程序。
Mellanox Technologies ConnectX Family mlx5Gen Virtual Function 网络驱动程序是 SR-IOV 使用的虚拟功能 (Virtual Function,VF) 驱动程序。因此,为具有 VF 的 SR-IOV 启用 VNIC。
- 运行
-
下图显示了到目前为止我们配置的内容的直观概述。
任务 5:使用默认网关将 IP 地址分配给新的第二个 VNIC
现在,第二个 VNIC 已在任务 4 中创建并连接,我们需要为其分配 IP 地址。向实例添加第二个接口时,您可以将其分配到与第一个接口相同的子网,也可以选择新的子网。
没有为第二个接口启用 DHCP,因此需要手动分配 IP 地址。
为第二个接口分配 IP 地址的方法有多种。
-
方法 1:使用 Oracle Cloud Infrastructure 命令行界面 (OCI CLI)(
oci-utils
程序包)通过 OCI-network-config 命令将 IP 地址分配给 OCI 计算实例的第二个接口。 -
方法 2:使用 OCI CLI(
oci-utils
程序包)向使用 ocid 守护进程的 OCI 计算实例的第二个接口分配 IP 地址。 -
方法 3:使用 OCI_Multi_VNIC_Setup 脚本。
-
方法 4:为
/etc/sysconfig/network-scripts/
文件夹中的新 VNIC 手动创建接口配置文件。
对于所有 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
)
-
在 OKE 群集中,单击节点。
-
单击第一个节点池 (
np1
)。 -
单击属于此节点池的 Worker 节点。
- 请注意, NIC 附件类型为 VFIO (这意味着已为此虚拟实例 worker 节点启用 SR-IOV)。
- 请注意,将为此 worker 节点创建并附加第二个 VNIC。
任务 5.2:验证节点池 2 中的所有节点 (np2
)
-
单击节点一对一并开始验证。
- 请注意, NIC 附件类型为 VFIO (这意味着已为此虚拟实例 worker 节点启用 SR-IOV)。
- 请注意,将为此 worker 节点创建并附加第二个 VNIC。
-
转到节点池 2 (
np2
) 摘要页。单击节点池中的第二个 worker 节点。- 请注意, NIC 附件类型为 VFIO (这意味着已为此虚拟实例 worker 节点启用 SR-IOV)。
- 请注意,将为此 worker 节点创建并附加第二个 VNIC。
-
转到节点池 2 (
np2
) 摘要页。单击节点池中的第三个 worker 节点。- 请注意, NIC 附件类型为 VFIO (这意味着已为此虚拟实例 worker 节点启用 SR-IOV)。
- 请注意,将为此 worker 节点创建并附加第二个 VNIC。
-
使用 SSH 登录 Kubernetes 操作员。
运行
kubectl get nodes
命令以检索所有 worker 节点的列表和 IP 地址。[opc@o-sqrtga ~]$ kubectl get nodes NAME STATUS ROLES AGE VERSION 10.0.112.134 Ready node 68d v1.30.1 10.0.66.97 Ready node 68d v1.30.1 10.0.73.242 Ready node 68d v1.30.1 10.0.89.50 Ready node 68d v1.30.1 [opc@o-sqrtga ~]$
-
为了便于通过 SSH 访问所有 worker 节点,我们创建了下表。
Worker 节点名称 ens3 IP SSH 命令工作节点 cwe6rhf2leq-n7nwqge3zba-slsqe2jfnpa-0 10.0.112.134 ssh -i id_rsa opc@10.0.112.134
cwe6rhf2leq-ng556bw23ra-slsqe2jfnpa-1 10.0.66.97 ssh -i id_rsa opc@10.0.66.97
cwe6rhf2leq-ng556bw23ra-slsqe2jfnpa-0 10.0.73.242 ssh -i id_rsa opc@10.0.73.242
cwe6rhf2leq-ng556bw23ra-slsqe2jfnpa-2 10.0.89.50 ssh -i id_rsa opc@10.0.89.50
- 在通过 SSH 访问所有虚拟 worker 节点之前,请确保您具有正确的私有密钥。
- 运行
ssh -i <private key> opc@<ip-address>
命令以通过 SSH 访问所有 worker 节点。
-
在
cwe6rhf2leq-n7nwqge3zba-slsqe2jfnpa-0
worker 节点上运行ip a
命令。请注意,成功配置 IP 地址后,
ens5
(第二个 VNIC)的 IP 地址在任务 3.2 中为 SR-IOV 接口创建的子网范围内。[opc@oke-cwe6rhf2leq-n7nwqge3zba-slsqe2jfnpa-0 ~]$ ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc mq state UP group default qlen 1000 link/ether 02:00:17:00:59:58 brd ff:ff:ff:ff:ff:ff altname enp0s3 inet 10.0.112.134/18 brd 10.0.127.255 scope global dynamic ens3 valid_lft 85530sec preferred_lft 85530sec inet6 fe80::17ff:fe00:5958/64 scope link valid_lft forever preferred_lft forever 3: ens5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc mq state UP group default qlen 1000 link/ether 02:00:17:00:d4:a2 brd ff:ff:ff:ff:ff:ff altname enp0s5 inet 10.0.3.30/27 brd 10.0.3.31 scope global noprefixroute ens5 valid_lft forever preferred_lft forever inet6 fe80::8106:c09e:61fa:1d2a/64 scope link noprefixroute valid_lft forever preferred_lft forever 4: flannel.1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8950 qdisc noqueue state UNKNOWN group default link/ether 3a:b7:fb:e6:2e:cf brd ff:ff:ff:ff:ff:ff inet 10.244.1.0/32 scope global flannel.1 valid_lft forever preferred_lft forever inet6 fe80::38b7:fbff:fee6:2ecf/64 scope link valid_lft forever preferred_lft forever 5: cni0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8950 qdisc noqueue state UP group default qlen 1000 link/ether de:35:f5:51:85:5d brd ff:ff:ff:ff:ff:ff inet 10.244.1.1/25 brd 10.244.1.127 scope global cni0 valid_lft forever preferred_lft forever inet6 fe80::dc35:f5ff:fe51:855d/64 scope link valid_lft forever preferred_lft forever 6: veth1cdaac17@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8950 qdisc noqueue master cni0 state UP group default link/ether 76:e2:92:ad:37:40 brd ff:ff:ff:ff:ff:ff link-netns 1935ba66-34cc-4468-8abb-f66add46d08b inet6 fe80::74e2:92ff:fead:3740/64 scope link valid_lft forever preferred_lft forever 7: vethbcd391ab@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8950 qdisc noqueue master cni0 state UP group default link/ether 9a:9a:0f:d6:48:17 brd ff:ff:ff:ff:ff:ff link-netns 3f02d5fd-596e-4b9f-8a35-35f2f946901b inet6 fe80::989a:fff:fed6:4817/64 scope link valid_lft forever preferred_lft forever 8: vethc15fa705@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8950 qdisc noqueue master cni0 state UP group default link/ether 3a:d2:c8:66:d1:0b brd ff:ff:ff:ff:ff:ff link-netns f581b7f2-cfa0-46eb-b0aa-37001a11116d inet6 fe80::38d2:c8ff:fe66:d10b/64 scope link valid_lft forever preferred_lft forever [opc@oke-cwe6rhf2leq-n7nwqge3zba-slsqe2jfnpa-0 ~]$
-
在
cwe6rhf2leq-ng556bw23ra-slsqe2jfnpa-1
worker 节点上运行ip a
命令。请注意,成功配置 IP 地址后,
ens5
(第二个 VNIC)的 IP 地址在任务 3.2 中为 SR-IOV 接口创建的子网范围内。[opc@oke-cwe6rhf2leq-ng556bw23ra-slsqe2jfnpa-1 ~]$ ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc mq state UP group default qlen 1000 link/ether 02:00:17:00:16:ca brd ff:ff:ff:ff:ff:ff altname enp0s3 inet 10.0.66.97/18 brd 10.0.127.255 scope global dynamic ens3 valid_lft 85859sec preferred_lft 85859sec inet6 fe80::17ff:fe00:16ca/64 scope link valid_lft forever preferred_lft forever 3: ens5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc mq state UP group default qlen 1000 link/ether 02:00:17:00:7b:4f brd ff:ff:ff:ff:ff:ff altname enp0s5 inet 10.0.3.15/27 brd 10.0.3.31 scope global noprefixroute ens5 valid_lft forever preferred_lft forever inet6 fe80::87eb:4195:cacf:a6da/64 scope link noprefixroute valid_lft forever preferred_lft forever 4: flannel.1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8950 qdisc noqueue state UNKNOWN group default link/ether 02:92:e7:f5:8e:29 brd ff:ff:ff:ff:ff:ff inet 10.244.1.128/32 scope global flannel.1 valid_lft forever preferred_lft forever inet6 fe80::92:e7ff:fef5:8e29/64 scope link valid_lft forever preferred_lft forever 5: cni0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8950 qdisc noqueue state UP group default qlen 1000 link/ether f6:08:06:e2:bc:9d brd ff:ff:ff:ff:ff:ff inet 10.244.1.129/25 brd 10.244.1.255 scope global cni0 valid_lft forever preferred_lft forever inet6 fe80::f408:6ff:fee2:bc9d/64 scope link valid_lft forever preferred_lft forever 6: veth5db97290@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8950 qdisc noqueue master cni0 state UP group default link/ether c2:e0:b5:7e:ce:ed brd ff:ff:ff:ff:ff:ff link-netns 3682b5cd-9039-4931-aecc-b50d46dabaf1 inet6 fe80::c0e0:b5ff:fe7e:ceed/64 scope link valid_lft forever preferred_lft forever 7: veth6fd818a5@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8950 qdisc noqueue master cni0 state UP group default link/ether 3e:a8:7d:84:d3:b9 brd ff:ff:ff:ff:ff:ff link-netns 08141d6b-5ec0-4f3f-a312-a00b30f82ade inet6 fe80::3ca8:7dff:fe84:d3b9/64 scope link valid_lft forever preferred_lft forever [opc@oke-cwe6rhf2leq-ng556bw23ra-slsqe2jfnpa-1 ~]$
-
在
cwe6rhf2leq-ng556bw23ra-slsqe2jfnpa-0
worker 节点上运行ip a
命令。请注意,成功配置 IP 地址后,
ens5
(第二个 VNIC)的 IP 地址在任务 3.2 中为 SR-IOV 接口创建的子网范围内。[opc@oke-cwe6rhf2leq-ng556bw23ra-slsqe2jfnpa-0 ~]$ ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc mq state UP group default qlen 1000 link/ether 02:00:17:00:49:9c brd ff:ff:ff:ff:ff:ff altname enp0s3 inet 10.0.73.242/18 brd 10.0.127.255 scope global dynamic ens3 valid_lft 86085sec preferred_lft 86085sec inet6 fe80::17ff:fe00:499c/64 scope link valid_lft forever preferred_lft forever 3: ens5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc mq state UP group default qlen 1000 link/ether 02:00:17:00:b7:51 brd ff:ff:ff:ff:ff:ff altname enp0s5 inet 10.0.3.14/27 brd 10.0.3.31 scope global noprefixroute ens5 valid_lft forever preferred_lft forever inet6 fe80::bc31:aa09:4e05:9ab7/64 scope link noprefixroute valid_lft forever preferred_lft forever 4: flannel.1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8950 qdisc noqueue state UNKNOWN group default link/ether 9a:c7:1b:30:e8:9a brd ff:ff:ff:ff:ff:ff inet 10.244.0.0/32 scope global flannel.1 valid_lft forever preferred_lft forever inet6 fe80::98c7:1bff:fe30:e89a/64 scope link valid_lft forever preferred_lft forever 5: cni0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8950 qdisc noqueue state UP group default qlen 1000 link/ether 2a:2b:cb:fb:15:82 brd ff:ff:ff:ff:ff:ff inet 10.244.0.1/25 brd 10.244.0.127 scope global cni0 valid_lft forever preferred_lft forever inet6 fe80::282b:cbff:fefb:1582/64 scope link valid_lft forever preferred_lft forever 6: veth06343057@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8950 qdisc noqueue master cni0 state UP group default link/ether ca:70:83:13:dc:ed brd ff:ff:ff:ff:ff:ff link-netns fb0f181f-7c3a-4fb6-8bf0-5a65d39486c1 inet6 fe80::c870:83ff:fe13:dced/64 scope link valid_lft forever preferred_lft forever 7: veth8af17165@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8950 qdisc noqueue master cni0 state UP group default link/ether c6:a0:be:75:9b:d9 brd ff:ff:ff:ff:ff:ff link-netns c07346e6-33f5-4e80-ba5e-74f7487b5daa inet6 fe80::c4a0:beff:fe75:9bd9/64 scope link valid_lft forever preferred_lft forever [opc@oke-cwe6rhf2leq-ng556bw23ra-slsqe2jfnpa-0 ~]$
-
在
cwe6rhf2leq-ng556bw23ra-slsqe2jfnpa-2
worker 节点上运行ip a
命令。请注意,成功配置 IP 地址后,
ens5
(第二个 VNIC)的 IP 地址在任务 3.2 中为 SR-IOV 接口创建的子网范围内。[opc@oke-cwe6rhf2leq-ng556bw23ra-slsqe2jfnpa-2 ~]$ ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc mq state UP group default qlen 1000 link/ether 02:00:17:00:ac:7c brd ff:ff:ff:ff:ff:ff altname enp0s3 inet 10.0.89.50/18 brd 10.0.127.255 scope global dynamic ens3 valid_lft 86327sec preferred_lft 86327sec inet6 fe80::17ff:fe00:ac7c/64 scope link valid_lft forever preferred_lft forever 3: ens5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc mq state UP group default qlen 1000 link/ether 02:00:17:00:4c:0d brd ff:ff:ff:ff:ff:ff altname enp0s5 inet 10.0.3.16/27 brd 10.0.3.31 scope global noprefixroute ens5 valid_lft forever preferred_lft forever inet6 fe80::91eb:344e:829e:35de/64 scope link noprefixroute valid_lft forever preferred_lft forever 4: flannel.1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8950 qdisc noqueue state UNKNOWN group default link/ether aa:31:9f:d0:b3:3c brd ff:ff:ff:ff:ff:ff inet 10.244.0.128/32 scope global flannel.1 valid_lft forever preferred_lft forever inet6 fe80::a831:9fff:fed0:b33c/64 scope link valid_lft forever preferred_lft forever 5: cni0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8950 qdisc noqueue state UP group default qlen 1000 link/ether b2:0d:c0:de:02:61 brd ff:ff:ff:ff:ff:ff inet 10.244.0.129/25 brd 10.244.0.255 scope global cni0 valid_lft forever preferred_lft forever inet6 fe80::b00d:c0ff:fede:261/64 scope link valid_lft forever preferred_lft forever 6: vethb37e8987@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8950 qdisc noqueue master cni0 state UP group default link/ether 7a:93:1d:2a:33:8c brd ff:ff:ff:ff:ff:ff link-netns ab3262ca-4a80-4b02-a39f-4209d003f148 inet6 fe80::7893:1dff:fe2a:338c/64 scope link valid_lft forever preferred_lft forever 7: veth73a651ce@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8950 qdisc noqueue master cni0 state UP group default link/ether ae:e4:97:89:ba:6e brd ff:ff:ff:ff:ff:ff link-netns 9307bfbd-8165-46bf-916c-e1180b6cbd83 inet6 fe80::ace4:97ff:fe89:ba6e/64 scope link valid_lft forever preferred_lft forever [opc@oke-cwe6rhf2leq-ng556bw23ra-slsqe2jfnpa-2 ~]$
-
我们已验证是否已在第二个 VNIC (
ens5
) 上配置了所有 IP 地址,因此可以创建下表来包含这些信息。ens3 IP ens3 千瓦 ens5 IP ens5 千瓦 10.0.112.134 10.0.64.1 10.0.3.30/27 10.0.3.1 10.0.66.97 10.0.64.1 10.0.3.15/27 10.0.3.1 10.0.73.242 10.0.64.1 10.0.3.14/27 10.0.3.1 10.0.89.50 10.0.64.1 10.0.3.16/27 10.0.3.1 -
下图显示了到目前为止我们配置的内容的直观概述。
任务 6:在 Worker 节点上安装 Meta-Plugin CNI(多 CNI)
Multus CNI 是一个 Kubernetes 容器网络接口 (Container Network Interface,CNI) 插件,可用于将多个网络接口连接到一个云池。
多 CNI 的工作原理
-
充当元插件: Multus 不提供网络本身,而是调用其他 CNI 插件。
-
创建多个网络接口:通过组合多个 CNI 插件(例如 Flannel、Calico、SR-IOV),每个 pod 可以具有多个网络接口。
-
使用配置文件:使用默认 CNI 设置主网络,并基于定制资源定义 (CRD) 附加其他网络。
为什么我们需要多 CNI
-
多网络隔离:适用于需要单独管理和数据层的工作负载。
-
高性能网络:使用 SR-IOV 或 DPDK 启用直接硬件访问。
-
适用于 Pod 的多宿主:支持网络功能虚拟化 (Network Function Virtualization,NFV) 和电信 (Telco) 用例,其中多个网络接口是必不可少的。
任务 6.1:使用瘦安装方法安装 Multus CNI
-
通过 SSH 连接到 Kubernetes Operator。
-
运行以下命令以克隆 Multus Git 库。
git clone https://github.com/k8snetworkplumbingwg/multus-cni.git && cd multus-cni
-
运行以下命令以使用瘦安装方法安装 Multus 守护进程集。
kubectl apply -f deployments/multus-daemonset.yml && cd ..
-
Multus 守护进程集的作用
-
启动 Multus 守护进程集,在每个节点上运行一个 pod,在
/opt/cni/bin
中的每个节点上放置一个 Multus 二进制文件。 -
在
/etc/cni/net.d
中按字典编纂顺序(按字母顺序)读取第一个配置文件,并在每个节点上创建 Multus 的新配置文件/etc/cni/net.d/00-multus.conf
,此配置将自动生成,并基于默认网络配置(假定这是按字母顺序排列的第一个配置)。 -
在每个节点上创建一个名为
/etc/cni/net.d/multus.d
的目录,其中包含用于 Multus 访问 Kubernetes API 的验证信息。
任务 6.2:验证多重安装
-
运行以下命令(在 Kubernetes Operator 中)以验证是否在所有 worker 节点上安装了 Multus 守护进程集。
kubectl get pods --all-namespaces | grep -i multus
-
您还可以验证是否在 worker 节点本身上安装了 Multus 守护进程集。
- 使用以下命令将
ssh -i id_rsa opc@10.0.112.134
命令通过 SSH 运行到 worker 节点。 - 运行
cd /etc/cni/net.d/
命令以使用以下命令更改目录。 - 运行
ls -l
命令以使用以下命令列出目录输出。 - 请注意,列出了
00-multus.conf
和multus.d
文件。
- 运行
sudo more 00-multus.conf
命令以查看00-multus.conf
文件的内容。 - 记下
00-multus.conf
文件的内容。
- 使用以下命令将
任务 7:将网络接口连接到云池
在此任务中,我们将 map 或 attach 容器接口到此 VNIC。
要将其他接口连接到 pod,我们需要配置接口才能连接。
-
这封装在
NetworkAttachmentDefinition
类型的定制资源中。 -
此配置本质上是打包为定制资源的 CNI 配置。
有几个 CNI 插件可以与 Multus 一起使用来实现这一点。有关更多信息,请参阅插件概述。
-
在此处描述的方法中,目标是仅为单个 pod 提供 SR-IOV 虚拟功能 (Virtual Function,VF),以便 pod 可以利用这些功能而不会受到干扰,也无需中间任何层。
-
要授予 pod 对 VF 的独占访问权限,我们可以利用 host-device 插件,使您能够将接口移动到 pod 的名称空间中,使其具有独占访问权限。有关更多信息,请参见 host-device 。
以下示例显示了配置添加到节点的辅助 ens5
接口的 NetworkAttachmentDefinition
对象。
-
ipam
插件配置确定如何为这些接口管理 IP 地址。 -
在此示例中,由于我们希望使用 OCI 分配给辅助接口的相同 IP 地址,因此我们使用具有相应路由的静态
ipam
配置。 -
ipam
配置还支持其他方法(如host-local
或dhcp
),以实现更灵活的配置。
任务 7.1:创建网络附件定义
NetworkAttachmentDefinition
用于设置网络连接,例如 pod 的辅助接口。
下面是配置 NetworkAttachmentDefinition
的两种方式:
NetworkAttachmentDefinition
,带有 JSON CNI 配置。- 包含 CNI 配置文件的
NetworkAttachmentDefinition
。
注:在本教程中,我们将使用该方法使用 CNI 配置文件。
我们有 4 个 Worker 节点,每个 Worker 节点都有一个将映射到容器(云池)上的接口的第二个 VNIC。
-
运行以下命令为所有 worker 节点和相应的 VNIC 创建 CNI 配置文件。
ens3 ens5 name 网络 nano 命令 10.0.112.134 10.0.3.30/27 sriov-vnic-1 10.0.3.0/27 sudo nano sriov-vnic-1.yaml
10.0.66.97 10.0.3.15/27 sriov-vnic-2 10.0.3.0/27 sudo nano sriov-vnic-2.yaml
10.0.73.242 10.0.3.14/27 sriov-vnic-3 10.0.3.0/27 sudo nano sriov-vnic-3.yaml
10.0.89.50 10.0.3.16/27 sriov-vnic-4 10.0.3.0/27 sudo nano sriov-vnic-4.yaml
-
对 Kubernetes Operator 执行以下步骤。使用
sudo nano sriov-vnic-1.yaml
命令为第一个 worker 节点创建新的 YAML 文件。-
确保名称具有唯一性和说明性。在本示例中,我们使用的是
sriov-vnic-1
。 -
使用刚刚添加的第二个适配器的 IP 地址 (
ens5
)。 -
请确保
dst network
也正确,这与在任务 3.2 中创建的子网相同。
sriov-vnic-1.yaml
:apiVersion: "k8s.cni.cncf.io/v1" kind: NetworkAttachmentDefinition metadata: name: sriov-vnic-1 spec: config: '{ "cniVersion": "0.3.1", "type": "host-device", "device": "ens5", "ipam": { "type": "static", "addresses": [ { "address": "10.0.3.30/27", "gateway": "0.0.0.0" } ], "routes": [ { "dst": "10.0.3.0/27", "gw": "0.0.0.0" } ] } }'
-
-
使用
sudo nano sriov-vnic-2.yaml
命令为第二个 worker 节点创建新的 YAML 文件。sriov-vnic-2.yaml
:apiVersion: "k8s.cni.cncf.io/v1" kind: NetworkAttachmentDefinition metadata: name: sriov-vnic-2 spec: config: '{ "cniVersion": "0.3.1", "type": "host-device", "device": "ens5", "ipam": { "type": "static", "addresses": [ { "address": "10.0.3.15/27", "gateway": "0.0.0.0" } ], "routes": [ { "dst": "10.0.3.0/27", "gw": "0.0.0.0" } ] } }'
-
使用
sudo nano sriov-vnic-3.yaml
命令为第三个 worker 节点创建新的 YAML 文件。sriov-vnic-3.yaml
:apiVersion: "k8s.cni.cncf.io/v1" kind: NetworkAttachmentDefinition metadata: name: sriov-vnic-3 spec: config: '{ "cniVersion": "0.3.1", "type": "host-device", "device": "ens5", "ipam": { "type": "static", "addresses": [ { "address": "10.0.3.14/27", "gateway": "0.0.0.0" } ], "routes": [ { "dst": "10.0.3.0/27", "gw": "0.0.0.0" } ] } }'
-
使用
sudo nano sriov-vnic-4.yaml
命令为第四个 worker 节点创建新的 YAML 文件。sriov-vnic-4.yaml
:apiVersion: "k8s.cni.cncf.io/v1" kind: NetworkAttachmentDefinition metadata: name: sriov-vnic-4 spec: config: '{ "cniVersion": "0.3.1", "type": "host-device", "device": "ens5", "ipam": { "type": "static", "addresses": [ { "address": "10.0.3.16/27", "gateway": "0.0.0.0" } ], "routes": [ { "dst": "10.0.3.0/27", "gw": "0.0.0.0" } ] } }'
-
将
NetworkAttachmentDefinition
应用于 worker 节点。- 对第一个节点运行
kubectl apply -f sriov-vnic-1.yaml
命令。 - 对第二个节点运行
kubectl apply -f sriov-vnic-2.yaml
命令。 - 对第三个节点运行
kubectl apply -f sriov-vnic-3.yaml
命令。 - 对第四个节点运行
kubectl apply -f sriov-vnic-4.yaml
命令。
如果正确应用了
NetworkAttachmentDefinition
,您将看到与输出类似的内容。[opc@o-sqrtga ~]$ kubectl apply -f sriov-vnic-1.yaml networkattachmentdefinition.k8s.cni.cncf.io/sriov-vnic-1 created [opc@o-sqrtga ~]$ kubectl apply -f sriov-vnic-2.yaml networkattachmentdefinition.k8s.cni.cncf.io/sriov-vnic-2 created [opc@o-sqrtga ~]$ kubectl apply -f sriov-vnic-3.yaml networkattachmentdefinition.k8s.cni.cncf.io/sriov-vnic-3 created [opc@o-sqrtga ~]$ kubectl apply -f sriov-vnic-4.yaml networkattachmentdefinition.k8s.cni.cncf.io/sriov-vnic-4 created [opc@o-sqrtga ~]$
- 对第一个节点运行
-
运行
kubectl get network-attachment-definitions.k8s.cni.cncf.io
命令以验证是否正确应用了NetworkAttachmentDefinitions
。[opc@o-sqrtga ~]$ kubectl get network-attachment-definitions.k8s.cni.cncf.io NAME AGE sriov-vnic-1 96s sriov-vnic-2 72s sriov-vnic-3 60s sriov-vnic-4 48s [opc@o-sqrtga ~]$
-
运行
kubectl get networkattachmentdefinition.k8s.cni.cncf.io/sriov-vnic-1 -o yaml
命令以获取第一个 worker 节点所应用的NetworkAttachmentDefinition
。[opc@o-sqrtga ~]$ kubectl get networkattachmentdefinition.k8s.cni.cncf.io/sriov-vnic-1 -o yaml apiVersion: k8s.cni.cncf.io/v1 kind: NetworkAttachmentDefinition metadata: annotations: kubectl.kubernetes.io/last-applied-configuration: | {"apiVersion":"k8s.cni.cncf.io/v1","kind":"NetworkAttachmentDefinition","metadata":{"annotations":{},"name":"sriov-vnic-1","namespace":"default"},"spec":{"config":"{ \"cniVersion\": \"0.3.1\", \"type\": \"host-device\", \"device\": \"ens5\", \"ipam\": { \"type\": \"static\", \"addresses\": [ { \"address\": \"10.0.3.30/27\", \"gateway\": \"0.0.0.0\" } ], \"routes\": [ { \"dst\": \"10.0.3.0/27\", \"gw\": \"0.0.0.0\" } ] } }"}} creationTimestamp: "2024-12-18T09:03:55Z" generation: 1 name: sriov-vnic-1 namespace: default resourceVersion: "22915413" uid: 2d529130-2147-4f49-9d78-4e5aa12aea62 spec: config: '{ "cniVersion": "0.3.1", "type": "host-device", "device": "ens5", "ipam": { "type": "static", "addresses": [ { "address": "10.0.3.30/27", "gateway": "0.0.0.0" } ], "routes": [ { "dst": "10.0.3.0/27", "gw": "0.0.0.0" } ] } }'
-
运行
kubectl get networkattachmentdefinition.k8s.cni.cncf.io/sriov-vnic-2 -o yaml
命令以获取第二个 worker 节点的已应用NetworkAttachmentDefinition
。[opc@o-sqrtga ~]$ kubectl get networkattachmentdefinition.k8s.cni.cncf.io/sriov-vnic-2 -o yaml apiVersion: k8s.cni.cncf.io/v1 kind: NetworkAttachmentDefinition metadata: annotations: kubectl.kubernetes.io/last-applied-configuration: | {"apiVersion":"k8s.cni.cncf.io/v1","kind":"NetworkAttachmentDefinition","metadata":{"annotations":{},"name":"sriov-vnic-2","namespace":"default"},"spec":{"config":"{ \"cniVersion\": \"0.3.1\", \"type\": \"host-device\", \"device\": \"ens5\", \"ipam\": { \"type\": \"static\", \"addresses\": [ { \"address\": \"10.0.3.15/27\", \"gateway\": \"0.0.0.0\" } ], \"routes\": [ { \"dst\": \"10.0.3.0/27\", \"gw\": \"0.0.0.0\" } ] } }"}} creationTimestamp: "2024-12-18T09:04:19Z" generation: 1 name: sriov-vnic-2 namespace: default resourceVersion: "22915508" uid: aec5740c-a093-43d3-bd6a-2209ee9e5c96 spec: config: '{ "cniVersion": "0.3.1", "type": "host-device", "device": "ens5", "ipam": { "type": "static", "addresses": [ { "address": "10.0.3.15/27", "gateway": "0.0.0.0" } ], "routes": [ { "dst": "10.0.3.0/27", "gw": "0.0.0.0" } ] } }'
-
运行
kubectl get networkattachmentdefinition.k8s.cni.cncf.io/sriov-vnic-3 -o yaml
命令以获取第三个 worker 节点所应用的NetworkAttachmentDefinition
。[opc@o-sqrtga ~]$ kubectl get networkattachmentdefinition.k8s.cni.cncf.io/sriov-vnic-3 -o yaml apiVersion: k8s.cni.cncf.io/v1 kind: NetworkAttachmentDefinition metadata: annotations: kubectl.kubernetes.io/last-applied-configuration: | {"apiVersion":"k8s.cni.cncf.io/v1","kind":"NetworkAttachmentDefinition","metadata":{"annotations":{},"name":"sriov-vnic-3","namespace":"default"},"spec":{"config":"{ \"cniVersion\": \"0.3.1\", \"type\": \"host-device\", \"device\": \"ens5\", \"ipam\": { \"type\": \"static\", \"addresses\": [ { \"address\": \"10.0.3.14/27\", \"gateway\": \"0.0.0.0\" } ], \"routes\": [ { \"dst\": \"10.0.3.0/27\", \"gw\": \"0.0.0.0\" } ] } }"}} creationTimestamp: "2024-12-18T09:04:31Z" generation: 1 name: sriov-vnic-3 namespace: default resourceVersion: "22915558" uid: 91b970ff-328f-4b6b-a0d8-7cdd07d7bca3 spec: config: '{ "cniVersion": "0.3.1", "type": "host-device", "device": "ens5", "ipam": { "type": "static", "addresses": [ { "address": "10.0.3.14/27", "gateway": "0.0.0.0" } ], "routes": [ { "dst": "10.0.3.0/27", "gw": "0.0.0.0" } ] } }'
-
运行
kubectl get networkattachmentdefinition.k8s.cni.cncf.io/sriov-vnic-4 -o yaml
命令以获取对第四个 worker 节点应用的NetworkAttachmentDefinition
。[opc@o-sqrtga ~]$ kubectl get networkattachmentdefinition.k8s.cni.cncf.io/sriov-vnic-4 -o yaml apiVersion: k8s.cni.cncf.io/v1 kind: NetworkAttachmentDefinition metadata: annotations: kubectl.kubernetes.io/last-applied-configuration: | {"apiVersion":"k8s.cni.cncf.io/v1","kind":"NetworkAttachmentDefinition","metadata":{"annotations":{},"name":"sriov-vnic-4","namespace":"default"},"spec":{"config":"{ \"cniVersion\": \"0.3.1\", \"type\": \"host-device\", \"device\": \"ens5\", \"ipam\": { \"type\": \"static\", \"addresses\": [ { \"address\": \"10.0.3.16/27\", \"gateway\": \"0.0.0.0\" } ], \"routes\": [ { \"dst\": \"10.0.3.0/27\", \"gw\": \"0.0.0.0\" } ] } }"}} creationTimestamp: "2024-12-18T09:04:43Z" generation: 1 name: sriov-vnic-4 namespace: default resourceVersion: "22915607" uid: 383fd3f0-7e5e-46ec-9997-29cbc9a2dcea spec: config: '{ "cniVersion": "0.3.1", "type": "host-device", "device": "ens5", "ipam": { "type": "static", "addresses": [ { "address": "10.0.3.16/27", "gateway": "0.0.0.0" } ], "routes": [ { "dst": "10.0.3.0/27", "gw": "0.0.0.0" } ] } }' [opc@o-sqrtga ~]$
-
下图显示了到目前为止我们配置的内容的直观概述。
任务 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 的接口进行通信。
-
使用
kubectl get nodes
命令获取所有可用节点。[opc@o-sqrtga ~]$ kubectl get nodes NAME STATUS ROLES AGE VERSION 10.0.112.134 Ready node 68d v1.30.1 10.0.66.97 Ready node 68d v1.30.1 10.0.73.242 Ready node 68d v1.30.1 10.0.89.50 Ready node 68d v1.30.1 [opc@o-sqrtga ~]$
- 使用
kubectl label node 10.0.112.134 node_type=testpod1
命令为 Worker 节点 1 分配标签。 - 使用
kubectl label node 10.0.66.97 node_type=testpod2
命令为 Worker 节点 2 分配标签。 - 使用
kubectl label node 10.0.73.242 node_type=testpod3
命令为 Worker 节点 3 分配标签。 - 使用
kubectl label node 10.0.89.50 node_type=testpod4
命令为 Worker 节点 4 分配标签。
[opc@o-sqrtga ~]$ kubectl label node 10.0.112.134 node_type=testpod1 node/10.0.112.134 labeled [opc@o-sqrtga ~]$ kubectl label node 10.0.73.242 node_type=testpod3 node/10.0.73.242 labeled [opc@o-sqrtga ~]$ kubectl label node 10.0.66.97 node_type=testpod2 node/10.0.66.97 labeled [opc@o-sqrtga ~]$ kubectl label node 10.0.89.50 node_type=testpod4 node/10.0.89.50 labeled [opc@o-sqrtga ~]$
- 使用
-
下图显示了到目前为止我们配置的内容的直观概述。
-
使用
sudo nano testpod1-v2.yaml
命令为testpod1
创建 YAML 文件。-
请注意
annotations
部分,其中将之前创建的NetworkAttachmentDefinition
(sriov-vnic-1
) 绑定到此测试云池。 -
请注意
spec:affinity:nodeAffinity
部分,其中将测试云池绑定到标签为testpod1
的特定 worker 节点。
sudo nano testpod1-v2.yaml apiVersion: v1 kind: Pod metadata: name: testpod1 annotations: k8s.v1.cni.cncf.io/networks: sriov-vnic-1 spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: node_type operator: In values: - testpod1 containers: - name: appcntr1 image: centos/tools imagePullPolicy: IfNotPresent command: [ "/bin/bash", "-c", "--" ] args: [ "while true; do sleep 300000; done;" ]
-
-
使用
sudo nano testpod2-v2.yaml
命令为testpod2
创建 YAML 文件。-
请注意
annotations
部分,其中将之前创建的NetworkAttachmentDefinition
(sriov-vnic-2
) 绑定到此测试云池。 -
请注意
spec:affinity:nodeAffinity
部分,其中将测试云池绑定到标签为testpod2
的特定 worker 节点。
sudo nano testpod2-v2.yaml apiVersion: v1 kind: Pod metadata: name: testpod2 annotations: k8s.v1.cni.cncf.io/networks: sriov-vnic-2 spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: node_type operator: In values: - testpod2 containers: - name: appcntr1 image: centos/tools imagePullPolicy: IfNotPresent command: [ "/bin/bash", "-c", "--" ] args: [ "while true; do sleep 300000; done;" ]
-
-
使用
sudo nano testpod3-v2.yaml
命令为testpod3
创建 YAML 文件。-
请注意
annotations
部分,其中将之前创建的NetworkAttachmentDefinition
(sriov-vnic-3
) 绑定到此测试云池。 -
请注意
spec:affinity:nodeAffinity
部分,其中将测试云池绑定到标签为testpod3
的特定 worker 节点。
sudo nano testpod3-v2.yaml apiVersion: v1 kind: Pod metadata: name: testpod3 annotations: k8s.v1.cni.cncf.io/networks: sriov-vnic-3 spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: node_type operator: In values: - testpod3 containers: - name: appcntr1 image: centos/tools imagePullPolicy: IfNotPresent command: [ "/bin/bash", "-c", "--" ] args: [ "while true; do sleep 300000; done;" ]
-
-
使用
sudo nano testpod4-v2.yaml
命令为testpod4
创建 YAML 文件。-
请注意
annotations
部分,其中将之前创建的NetworkAttachmentDefinition
(sriov-vnic-4
) 绑定到此测试云池。 -
请注意
spec:affinity:nodeAffinity
部分,其中将测试云池绑定到标签为testpod4
的特定 worker 节点
sudo nano testpod4-v2.yaml apiVersion: v1 kind: Pod metadata: name: testpod4 annotations: k8s.v1.cni.cncf.io/networks: sriov-vnic-4 spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: node_type operator: In values: - testpod4 containers: - name: appcntr1 image: centos/tools imagePullPolicy: IfNotPresent command: [ "/bin/bash", "-c", "--" ] args: [ "while true; do sleep 300000; done;" ]
- 使用
kubectl apply -f testpod1-v2.yaml
命令应用 YAML 文件来创建testpod1
。 - 使用
kubectl apply -f testpod2-v2.yaml
命令应用 YAML 文件来创建testpod2
。 - 使用
kubectl apply -f testpod3-v2.yaml
命令应用 YAML 文件来创建testpod3
。 - 使用
kubectl apply -f testpod4-v2.yaml
命令应用 YAML 文件来创建testpod4
。
[opc@o-sqrtga ~]$ kubectl apply -f testpod1-v2.yaml pod/testpod1 created [opc@o-sqrtga ~]$ kubectl apply -f testpod2-v2.yaml pod/testpod2 created [opc@o-sqrtga ~]$ kubectl apply -f testpod3-v2.yaml pod/testpod3 created [opc@o-sqrtga ~]$ kubectl apply -f testpod4-v2.yaml pod/testpod4 created [opc@o-sqrtga ~]$
-
-
验证是否使用
kubectl get pod
命令创建了测试云池。请注意,所有测试云池均已创建且处于Running
STATUS 状态。[opc@o-sqrtga ~]$ kubectl get pod NAME READY STATUS RESTARTS AGE my-nginx-576c6b7b6-6fn6f 1/1 Running 3 40d my-nginx-576c6b7b6-k9wwc 1/1 Running 3 40d my-nginx-576c6b7b6-z8xkd 1/1 Running 6 40d mysql-6d7f5d5944-dlm78 1/1 Running 12 35d testpod1 1/1 Running 0 2m29s testpod2 1/1 Running 0 2m17s testpod3 1/1 Running 0 2m5s testpod4 1/1 Running 0 111s [opc@o-sqrtga ~]$
-
使用
kubectl get pod testpod1 -o wide
命令验证testpod1
是否在标签为testpod1
的 worker 节点10.0.112.134
上运行。[opc@o-sqrtga ~]$ kubectl get pod testpod1 -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES testpod1 1/1 Running 0 3m41s 10.244.1.6 10.0.112.134 <none> <none>
-
使用
kubectl get pod testpod2 -o wide
命令验证testpod2
是否在标签为testpod2
的 worker 节点10.0.66.97
上运行。[opc@o-sqrtga ~]$ kubectl get pod testpod2 -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES testpod2 1/1 Running 0 3m33s 10.244.1.133 10.0.66.97 <none> <none>
-
使用
kubectl get pod testpod3 -o wide
命令验证testpod3
是否在标签为testpod3
的 worker 节点10.0.73.242
上运行。[opc@o-sqrtga ~]$ kubectl get pod testpod3 -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES testpod3 1/1 Running 0 3m25s 10.244.0.5 10.0.73.242 <none> <none>
-
使用
kubectl get pod testpod4 -o wide
命令验证testpod4
是否在标签为testpod4
的 worker 节点10.0.89.50
上运行。[opc@o-sqrtga ~]$ kubectl get pod testpod4 -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES testpod4 1/1 Running 0 3m22s 10.244.0.133 10.0.89.50 <none> <none>
-
下图显示了到目前为止我们配置的内容的直观概述。
任务 7.4:验证测试云池上的 IP 地址
-
使用
kubectl exec -it testpod1 -- ip addr show
命令验证net1
pod 接口的 IP 地址testpod1
。请注意,
net1
接口的 IP 地址为10.0.3.30/27
。[opc@o-sqrtga ~]$ kubectl exec -it testpod1 -- ip addr show 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0@if8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8950 qdisc noqueue state UP group default link/ether ca:28:e4:5f:66:c4 brd ff:ff:ff:ff:ff:ff link-netnsid 0 inet 10.244.0.132/25 brd 10.244.0.255 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::c828:e4ff:fe5f:66c4/64 scope link valid_lft forever preferred_lft forever 3: net1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc mq state UP group default qlen 1000 link/ether 02:00:17:00:4c:0d brd ff:ff:ff:ff:ff:ff inet 10.0.3.30/27 brd 10.0.3.31 scope global net1 valid_lft forever preferred_lft forever inet6 fe80::17ff:fe00:4c0d/64 scope link valid_lft forever preferred_lft forever
-
使用
kubectl exec -it testpod2 -- ip addr show
命令验证net1
pod 接口的 IP 地址testpod2
。请注意,
net1
接口的 IP 地址为10.0.3.15/27
。[opc@o-sqrtga ~]$ kubectl exec -it testpod2 -- ip addr show 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0@if8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8950 qdisc noqueue state UP group default link/ether da:ce:84:22:fc:29 brd ff:ff:ff:ff:ff:ff link-netnsid 0 inet 10.244.1.132/25 brd 10.244.1.255 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::d8ce:84ff:fe22:fc29/64 scope link valid_lft forever preferred_lft forever 3: net1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc mq state UP group default qlen 1000 link/ether 02:00:17:00:7b:4f brd ff:ff:ff:ff:ff:ff inet 10.0.3.15/27 brd 10.0.3.31 scope global net1 valid_lft forever preferred_lft forever inet6 fe80::17ff:fe00:7b4f/64 scope link valid_lft forever preferred_lft forever
-
使用
kubectl exec -it testpod3 -- ip addr show
命令验证net1
pod 接口的 IP 地址testpod3
。请注意,
net1
接口的 IP 地址为10.0.3.14/27
。[opc@o-sqrtga ~]$ kubectl exec -it testpod3 -- ip addr show 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0@if8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8950 qdisc noqueue state UP group default link/ether de:f2:81:10:04:b2 brd ff:ff:ff:ff:ff:ff link-netnsid 0 inet 10.244.0.4/25 brd 10.244.0.127 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::dcf2:81ff:fe10:4b2/64 scope link valid_lft forever preferred_lft forever 3: net1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc mq state UP group default qlen 1000 link/ether 02:00:17:00:b7:51 brd ff:ff:ff:ff:ff:ff inet 10.0.3.14/27 brd 10.0.3.31 scope global net1 valid_lft forever preferred_lft forever inet6 fe80::17ff:fe00:b751/64 scope link valid_lft forever preferred_lft forever
-
使用
kubectl exec -it testpod4 -- ip addr show
命令验证net1
pod 接口的 IP 地址testpod4
。请注意,
net1
接口的 IP 地址为10.0.3.16/27
。[opc@o-sqrtga ~]$ kubectl exec -it testpod4 -- ip addr show 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0@if9: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8950 qdisc noqueue state UP group default link/ether ea:63:eb:57:9c:99 brd ff:ff:ff:ff:ff:ff link-netnsid 0 inet 10.244.1.5/25 brd 10.244.1.127 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::e863:ebff:fe57:9c99/64 scope link valid_lft forever preferred_lft forever 3: net1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc mq state UP group default qlen 1000 link/ether 02:00:17:00:d4:a2 brd ff:ff:ff:ff:ff:ff inet 10.0.3.16/27 brd 10.0.3.31 scope global net1 valid_lft forever preferred_lft forever inet6 fe80::17ff:fe00:d4a2/64 scope link valid_lft forever preferred_lft forever [opc@o-sqrtga ~]$
-
下表显示了所有测试云池的
net1
接口的所有 IP 地址的概述。云池名 net1 IP testpod1 10.0.3.30/27 testpod2 10.0.3.15/27 testpod3 10.0.3.14/27 testpod4 10.0.3.16/27 注:这些 IP 地址与在任务 3 中创建的 OCI 子网位于同一范围内,用于放置启用了 SR-IOV 的 VNIC。
任务 7.5:验证 Worker 节点上的 IP 地址
-
现在,测试云池
net1
接口具有 IP 地址,请注意,此 IP 地址以前是 worker 节点上ens5
接口的 IP 地址。此 IP 地址现在已从ens5
Worker 节点接口移至net1
测试云池接口。 -
使用
ssh -i id_rsa opc@10.0.112.134
命令通过 SSH 连接到第一个 worker 节点。-
使用
ip a
命令获取所有接口的 IP 地址。 -
请注意,
ens5
接口已从 worker 节点中删除。
[opc@o-sqrtga ~]$ ssh -i id_rsa opc@10.0.112.134 Activate the web console with: systemctl enable --now cockpit.socket Last login: Wed Dec 18 20:42:19 2024 from 10.0.0.11 [opc@oke-cwe6rhf2leq-n7nwqge3zba-slsqe2jfnpa-0 ~]$ ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc mq state UP group default qlen 1000 link/ether 02:00:17:00:59:58 brd ff:ff:ff:ff:ff:ff altname enp0s3 inet 10.0.112.134/18 brd 10.0.127.255 scope global dynamic ens3 valid_lft 82180sec preferred_lft 82180sec inet6 fe80::17ff:fe00:5958/64 scope link valid_lft forever preferred_lft forever 4: flannel.1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8950 qdisc noqueue state UNKNOWN group default link/ether 3a:b7:fb:e6:2e:cf brd ff:ff:ff:ff:ff:ff inet 10.244.1.0/32 scope global flannel.1 valid_lft forever preferred_lft forever inet6 fe80::38b7:fbff:fee6:2ecf/64 scope link valid_lft forever preferred_lft forever 5: cni0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8950 qdisc noqueue state UP group default qlen 1000 link/ether de:35:f5:51:85:5d brd ff:ff:ff:ff:ff:ff inet 10.244.1.1/25 brd 10.244.1.127 scope global cni0 valid_lft forever preferred_lft forever inet6 fe80::dc35:f5ff:fe51:855d/64 scope link valid_lft forever preferred_lft forever 6: veth1cdaac17@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8950 qdisc noqueue master cni0 state UP group default link/ether 76:e2:92:ad:37:40 brd ff:ff:ff:ff:ff:ff link-netns 1935ba66-34cc-4468-8abb-f66add46d08b inet6 fe80::74e2:92ff:fead:3740/64 scope link valid_lft forever preferred_lft forever 7: vethbcd391ab@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8950 qdisc noqueue master cni0 state UP group default link/ether 9a:9a:0f:d6:48:17 brd ff:ff:ff:ff:ff:ff link-netns 3f02d5fd-596e-4b9f-8a35-35f2f946901b inet6 fe80::989a:fff:fed6:4817/64 scope link valid_lft forever preferred_lft forever 8: vethc15fa705@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8950 qdisc noqueue master cni0 state UP group default link/ether 3a:d2:c8:66:d1:0b brd ff:ff:ff:ff:ff:ff link-netns f581b7f2-cfa0-46eb-b0aa-37001a11116d inet6 fe80::38d2:c8ff:fe66:d10b/64 scope link valid_lft forever preferred_lft forever 9: vethc663e496@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8950 qdisc noqueue master cni0 state UP group default link/ether 7e:0b:bb:5d:49:8c brd ff:ff:ff:ff:ff:ff link-netns d3993135-0f2f-4b06-b16d-31d659f8230d inet6 fe80::7c0b:bbff:fe5d:498c/64 scope link valid_lft forever preferred_lft forever [opc@oke-cwe6rhf2leq-n7nwqge3zba-slsqe2jfnpa-0 ~]$ exit logout Connection to 10.0.112.134 closed.
-
-
使用
ssh -i id_rsa opc@10.0.66.97
命令通过 SSH 连接到第二个 worker 节点。-
使用
ip a
命令获取所有接口的 IP 地址。 -
请注意,
ens5
接口已从 worker 节点中删除。
[opc@o-sqrtga ~]$ ssh -i id_rsa opc@10.0.66.97 Activate the web console with: systemctl enable --now cockpit.socket Last login: Wed Dec 18 19:47:55 2024 from 10.0.0.11 [opc@oke-cwe6rhf2leq-ng556bw23ra-slsqe2jfnpa-1 ~]$ ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc mq state UP group default qlen 1000 link/ether 02:00:17:00:16:ca brd ff:ff:ff:ff:ff:ff altname enp0s3 inet 10.0.66.97/18 brd 10.0.127.255 scope global dynamic ens3 valid_lft 82502sec preferred_lft 82502sec inet6 fe80::17ff:fe00:16ca/64 scope link valid_lft forever preferred_lft forever 4: flannel.1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8950 qdisc noqueue state UNKNOWN group default link/ether 02:92:e7:f5:8e:29 brd ff:ff:ff:ff:ff:ff inet 10.244.1.128/32 scope global flannel.1 valid_lft forever preferred_lft forever inet6 fe80::92:e7ff:fef5:8e29/64 scope link valid_lft forever preferred_lft forever 5: cni0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8950 qdisc noqueue state UP group default qlen 1000 link/ether f6:08:06:e2:bc:9d brd ff:ff:ff:ff:ff:ff inet 10.244.1.129/25 brd 10.244.1.255 scope global cni0 valid_lft forever preferred_lft forever inet6 fe80::f408:6ff:fee2:bc9d/64 scope link valid_lft forever preferred_lft forever 6: veth5db97290@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8950 qdisc noqueue master cni0 state UP group default link/ether c2:e0:b5:7e:ce:ed brd ff:ff:ff:ff:ff:ff link-netns 3682b5cd-9039-4931-aecc-b50d46dabaf1 inet6 fe80::c0e0:b5ff:fe7e:ceed/64 scope link valid_lft forever preferred_lft forever 7: veth6fd818a5@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8950 qdisc noqueue master cni0 state UP group default link/ether 3e:a8:7d:84:d3:b9 brd ff:ff:ff:ff:ff:ff link-netns 08141d6b-5ec0-4f3f-a312-a00b30f82ade inet6 fe80::3ca8:7dff:fe84:d3b9/64 scope link valid_lft forever preferred_lft forever 8: veth26f6b686@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8950 qdisc noqueue master cni0 state UP group default link/ether ae:bf:36:ca:52:cf brd ff:ff:ff:ff:ff:ff link-netns f533714a-69be-4b20-be30-30ba71494f7a inet6 fe80::acbf:36ff:feca:52cf/64 scope link valid_lft forever preferred_lft forever [opc@oke-cwe6rhf2leq-ng556bw23ra-slsqe2jfnpa-1 ~]$ exit logout Connection to 10.0.66.97 closed.
-
-
使用
ssh -i id_rsa opc@10.0.73.242
命令通过 SSH 连接到第三个 worker 节点。-
使用
ip a
命令获取所有接口的 IP 地址。 -
请注意,
ens5
接口已从 worker 节点中删除。
[opc@o-sqrtga ~]$ ssh -i id_rsa opc@10.0.73.242 Activate the web console with: systemctl enable --now cockpit.socket Last login: Wed Dec 18 20:08:31 2024 from 10.0.0.11 [opc@oke-cwe6rhf2leq-ng556bw23ra-slsqe2jfnpa-0 ~]$ ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc mq state UP group default qlen 1000 link/ether 02:00:17:00:49:9c brd ff:ff:ff:ff:ff:ff altname enp0s3 inet 10.0.73.242/18 brd 10.0.127.255 scope global dynamic ens3 valid_lft 82733sec preferred_lft 82733sec inet6 fe80::17ff:fe00:499c/64 scope link valid_lft forever preferred_lft forever 4: flannel.1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8950 qdisc noqueue state UNKNOWN group default link/ether 9a:c7:1b:30:e8:9a brd ff:ff:ff:ff:ff:ff inet 10.244.0.0/32 scope global flannel.1 valid_lft forever preferred_lft forever inet6 fe80::98c7:1bff:fe30:e89a/64 scope link valid_lft forever preferred_lft forever 5: cni0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8950 qdisc noqueue state UP group default qlen 1000 link/ether 2a:2b:cb:fb:15:82 brd ff:ff:ff:ff:ff:ff inet 10.244.0.1/25 brd 10.244.0.127 scope global cni0 valid_lft forever preferred_lft forever inet6 fe80::282b:cbff:fefb:1582/64 scope link valid_lft forever preferred_lft forever 6: veth06343057@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8950 qdisc noqueue master cni0 state UP group default link/ether ca:70:83:13:dc:ed brd ff:ff:ff:ff:ff:ff link-netns fb0f181f-7c3a-4fb6-8bf0-5a65d39486c1 inet6 fe80::c870:83ff:fe13:dced/64 scope link valid_lft forever preferred_lft forever 7: veth8af17165@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8950 qdisc noqueue master cni0 state UP group default link/ether c6:a0:be:75:9b:d9 brd ff:ff:ff:ff:ff:ff link-netns c07346e6-33f5-4e80-ba5e-74f7487b5daa inet6 fe80::c4a0:beff:fe75:9bd9/64 scope link valid_lft forever preferred_lft forever 8: veth170b8774@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8950 qdisc noqueue master cni0 state UP group default link/ether e6:c9:42:60:8f:e7 brd ff:ff:ff:ff:ff:ff link-netns edef0c81-0477-43fa-b260-6b81626e7d87 inet6 fe80::e4c9:42ff:fe60:8fe7/64 scope link valid_lft forever preferred_lft forever [opc@oke-cwe6rhf2leq-ng556bw23ra-slsqe2jfnpa-0 ~]$ exit logout Connection to 10.0.73.242 closed.
-
-
使用
ssh -i id_rsa opc@10.0.89.50
命令通过 SSH 连接到第四个 worker 节点。-
使用
ip a
命令获取所有接口的 IP 地址。 -
请注意,
ens5
接口已从 worker 节点中删除。
[opc@o-sqrtga ~]$ ssh -i id_rsa opc@10.0.89.50 Activate the web console with: systemctl enable --now cockpit.socket Last login: Wed Dec 18 19:49:27 2024 from 10.0.0.11 [opc@oke-cwe6rhf2leq-ng556bw23ra-slsqe2jfnpa-2 ~]$ ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc mq state UP group default qlen 1000 link/ether 02:00:17:00:ac:7c brd ff:ff:ff:ff:ff:ff altname enp0s3 inet 10.0.89.50/18 brd 10.0.127.255 scope global dynamic ens3 valid_lft 82976sec preferred_lft 82976sec inet6 fe80::17ff:fe00:ac7c/64 scope link valid_lft forever preferred_lft forever 4: flannel.1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8950 qdisc noqueue state UNKNOWN group default link/ether aa:31:9f:d0:b3:3c brd ff:ff:ff:ff:ff:ff inet 10.244.0.128/32 scope global flannel.1 valid_lft forever preferred_lft forever inet6 fe80::a831:9fff:fed0:b33c/64 scope link valid_lft forever preferred_lft forever 5: cni0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8950 qdisc noqueue state UP group default qlen 1000 link/ether b2:0d:c0:de:02:61 brd ff:ff:ff:ff:ff:ff inet 10.244.0.129/25 brd 10.244.0.255 scope global cni0 valid_lft forever preferred_lft forever inet6 fe80::b00d:c0ff:fede:261/64 scope link valid_lft forever preferred_lft forever 6: vethb37e8987@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8950 qdisc noqueue master cni0 state UP group default link/ether 7a:93:1d:2a:33:8c brd ff:ff:ff:ff:ff:ff link-netns ab3262ca-4a80-4b02-a39f-4209d003f148 inet6 fe80::7893:1dff:fe2a:338c/64 scope link valid_lft forever preferred_lft forever 7: veth73a651ce@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8950 qdisc noqueue master cni0 state UP group default link/ether ae:e4:97:89:ba:6e brd ff:ff:ff:ff:ff:ff link-netns 9307bfbd-8165-46bf-916c-e1180b6cbd83 inet6 fe80::ace4:97ff:fe89:ba6e/64 scope link valid_lft forever preferred_lft forever 8: veth42c3a604@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8950 qdisc noqueue master cni0 state UP group default link/ether f2:e6:ba:72:8f:b2 brd ff:ff:ff:ff:ff:ff link-netns a7eb561c-8182-49b2-9e43-7c52845620a7 inet6 fe80::f0e6:baff:fe72:8fb2/64 scope link valid_lft forever preferred_lft forever [opc@oke-cwe6rhf2leq-ng556bw23ra-slsqe2jfnpa-2 ~]$ exit logout Connection to 10.0.89.50 closed. [opc@o-sqrtga ~]$
-
-
下图显示了到目前为止我们配置的内容的直观概述。
任务 8:在多个云池之间执行试通测试
所有云池都有一个 OCI 子网(连接启用了 SR-IOV 的 VNIC)中的 IP 地址,我们可以执行一些 ping 测试来验证网络连接是否正常工作。
-
下表提供了用于从 Kubernetes Operator 连接到测试云池的命令。
我们需要在每个 pod 中使用
exec
来执行 ping 测试或查看路由表。ens3 net1 name 云池名 命令 10.0.112.134 10.0.3.30/27 sriov-vnic-1 testpod1 kubectl exec -it testpod1 -- /bin/bash
10.0.66.97 10.0.3.15/27 sriov-vnic-2 testpod2 kubectl exec -it testpod2 -- /bin/bash
10.0.73.242 10.0.3.14/27 sriov-vnic-3 testpod3 kubectl exec -it testpod3 -- /bin/bash
10.0.89.50 10.0.3.16/27 sriov-vnic-4 testpod4 kubectl exec -it testpod4 -- /bin/bash
-
运行
kubectl exec -it testpod1 -- route -n
命令可直接从testpod1
的 Kubernetes Operator 终端查看路由表。Note that the routing table of
testpod1
has a default gateway foreth0
and fornet1
which is our SR-IOV enabled interface.[opc@o-sqrtga ~]$ kubectl exec -it testpod1 -- route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 10.244.0.129 0.0.0.0 UG 0 0 0 eth0 10.0.3.0 0.0.0.0 255.255.255.224 U 0 0 0 net1 10.0.3.0 0.0.0.0 255.255.255.224 U 0 0 0 net1 10.244.0.0 10.244.0.129 255.255.0.0 UG 0 0 0 eth0 10.244.0.128 0.0.0.0 255.255.255.128 U 0 0 0 eth0
-
运行
kubectl exec -it testpod2 -- route -n
命令可直接从testpod2
的 Kubernetes Operator 终端查看路由表。Note that the routing table of
testpod2
has a default gateway foreth0
and fornet1
which is our SR-IOV enabled interface.[opc@o-sqrtga ~]$ kubectl exec -it testpod2 -- route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 10.244.1.129 0.0.0.0 UG 0 0 0 eth0 10.0.3.0 0.0.0.0 255.255.255.224 U 0 0 0 net1 10.0.3.0 0.0.0.0 255.255.255.224 U 0 0 0 net1 10.244.0.0 10.244.1.129 255.255.0.0 UG 0 0 0 eth0 10.244.1.128 0.0.0.0 255.255.255.128 U 0 0 0 eth0
-
运行
kubectl exec -it testpod3 -- route -n
命令可直接从testpod3
的 Kubernetes Operator 终端查看路由表。Note that the routing table of
testpod3
has a default gateway foreth0
and fornet1
which is our SR-IOV enabled interface.[opc@o-sqrtga ~]$ kubectl exec -it testpod3 -- route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 10.244.0.1 0.0.0.0 UG 0 0 0 eth0 10.0.3.0 0.0.0.0 255.255.255.224 U 0 0 0 net1 10.0.3.0 0.0.0.0 255.255.255.224 U 0 0 0 net1 10.244.0.0 0.0.0.0 255.255.255.128 U 0 0 0 eth0 10.244.0.0 10.244.0.1 255.255.0.0 UG 0 0 0 eth0
-
运行
kubectl exec -it testpod4 -- route -n
命令可直接从testpod4
的 Kubernetes Operator 终端查看路由表。Note that the routing table of
testpod4
has a default gateway foreth0
and fornet1
which is our SR-IOV enabled interface.[opc@o-sqrtga ~]$ kubectl exec -it testpod4 -- route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 10.244.1.1 0.0.0.0 UG 0 0 0 eth0 10.0.3.0 0.0.0.0 255.255.255.224 U 0 0 0 net1 10.0.3.0 0.0.0.0 255.255.255.224 U 0 0 0 net1 10.244.0.0 10.244.1.1 255.255.0.0 UG 0 0 0 eth0 10.244.1.0 0.0.0.0 255.255.255.128 U 0 0 0 eth0 [opc@o-sqrtga ~]$
-
要直接从测试 pod 中从 Kubernetes Operator 执行 ping 测试,我们需要 ping 命令。
在下表中,我们为所有测试 pod 提供了所有 ping 命令。该命令将从特定的测试 pod ping 到所有其他测试 pod,包括其
net1
IP 地址。源云池名称 命令 testpod1 kubectl exec -it testpod1 -- ping -I net1 10.0.3.30 -c 4
kubectl exec -it testpod1 -- ping -I net1 10.0.3.15 -c 4
kubectl exec -it testpod1 -- ping -I net1 10.0.3.14 -c 4
kubectl exec -it testpod1 -- ping -I net1 10.0.3.16 -c 4
testpod2 kubectl exec -it testpod2 -- ping -I net1 10.0.3.15 -c 4
kubectl exec -it testpod2 -- ping -I net1 10.0.3.30 -c 4
kubectl exec -it testpod2 -- ping -I net1 10.0.3.14 -c 4
kubectl exec -it testpod2 -- ping -I net1 10.0.3.16 -c 4
testpod3 kubectl exec -it testpod3 -- ping -I net1 10.0.3.14 -c 4
kubectl exec -it testpod3 -- ping -I net1 10.0.3.30 -c 4
kubectl exec -it testpod3 -- ping -I net1 10.0.3.15 -c 4
kubectl exec -it testpod3 -- ping -I net1 10.0.3.16 -c 4
testpod4 kubectl exec -it testpod4 -- ping -I net1 10.0.3.16 -c 4
kubectl exec -it testpod4 -- ping -I net1 10.0.3.30 -c 4
kubectl exec -it testpod4 -- ping -I net1 10.0.3.15 -c 4
kubectl exec -it testpod4 -- ping -I net1 10.0.3.14 -c 4
注:在此示例中,我们使用
testpod1
对所有其他测试云池net1
IP 地址执行 ping 操作。
-
运行
kubectl exec -it testpod1 -- ping -I net1 10.0.3.30 -c 4
命令以从testpod1
ping 到testpod1
ping。请注意,ping 具有
4 packets transmitted, 4 received, 0% packet loss
。ping 是成功的。[opc@o-sqrtga ~]$ kubectl exec -it testpod1 -- ping -I net1 10.0.3.30 -c 4 PING 10.0.3.30 (10.0.3.30) from 10.0.3.30 net1: 56(84) bytes of data. 64 bytes from 10.0.3.30: icmp_seq=1 ttl=64 time=0.043 ms 64 bytes from 10.0.3.30: icmp_seq=2 ttl=64 time=0.024 ms 64 bytes from 10.0.3.30: icmp_seq=3 ttl=64 time=0.037 ms 64 bytes from 10.0.3.30: icmp_seq=4 ttl=64 time=0.026 ms --- 10.0.3.30 ping statistics --- 4 packets transmitted, 4 received, 0% packet loss, time 3087ms rtt min/avg/max/mdev = 0.024/0.032/0.043/0.009 ms
-
运行
kubectl exec -it testpod1 -- ping -I net1 10.0.3.15 -c 4
命令以从testpod1
ping 到testpod2
ping。请注意,ping 具有
4 packets transmitted, 4 received, 0% packet loss
。ping 是成功的。[opc@o-sqrtga ~]$ kubectl exec -it testpod1 -- ping -I net1 10.0.3.15 -c 4 PING 10.0.3.15 (10.0.3.15) from 10.0.3.30 net1: 56(84) bytes of data. 64 bytes from 10.0.3.15: icmp_seq=1 ttl=64 time=0.383 ms 64 bytes from 10.0.3.15: icmp_seq=2 ttl=64 time=0.113 ms 64 bytes from 10.0.3.15: icmp_seq=3 ttl=64 time=0.114 ms 64 bytes from 10.0.3.15: icmp_seq=4 ttl=64 time=0.101 ms --- 10.0.3.15 ping statistics --- 4 packets transmitted, 4 received, 0% packet loss, time 3109ms rtt min/avg/max/mdev = 0.101/0.177/0.383/0.119 ms
-
运行
kubectl exec -it testpod1 -- ping -I net1 10.0.3.14 -c 4
命令以从testpod1
ping 到testpod3
ping。请注意,ping 具有
4 packets transmitted, 4 received, 0% packet loss
。ping 是成功的。[opc@o-sqrtga ~]$ kubectl exec -it testpod1 -- ping -I net1 10.0.3.14 -c 4 PING 10.0.3.14 (10.0.3.14) from 10.0.3.30 net1: 56(84) bytes of data. 64 bytes from 10.0.3.14: icmp_seq=1 ttl=64 time=0.399 ms 64 bytes from 10.0.3.14: icmp_seq=2 ttl=64 time=0.100 ms 64 bytes from 10.0.3.14: icmp_seq=3 ttl=64 time=0.130 ms 64 bytes from 10.0.3.14: icmp_seq=4 ttl=64 time=0.124 ms --- 10.0.3.14 ping statistics --- 4 packets transmitted, 4 received, 0% packet loss, time 3057ms rtt min/avg/max/mdev = 0.100/0.188/0.399/0.122 ms
-
运行
kubectl exec -it testpod1 -- ping -I net1 10.0.3.16 -c 4
命令以从testpod1
ping 到testpod4
ping。请注意,ping 具有
4 packets transmitted, 4 received, 0% packet loss
。ping 是成功的。[opc@o-sqrtga ~]$ kubectl exec -it testpod1 -- ping -I net1 10.0.3.16 -c 4 PING 10.0.3.16 (10.0.3.16) from 10.0.3.30 net1: 56(84) bytes of data. 64 bytes from 10.0.3.16: icmp_seq=1 ttl=64 time=0.369 ms 64 bytes from 10.0.3.16: icmp_seq=2 ttl=64 time=0.154 ms 64 bytes from 10.0.3.16: icmp_seq=3 ttl=64 time=0.155 ms 64 bytes from 10.0.3.16: icmp_seq=4 ttl=64 time=0.163 ms --- 10.0.3.16 ping statistics --- 4 packets transmitted, 4 received, 0% packet loss, time 3110ms rtt min/avg/max/mdev = 0.154/0.210/0.369/0.092 ms [opc@o-sqrtga ~]$
注:我们尚未包括所有其他测试云池的所有其他 ping 输出,但您已了解相关想法。
-
下图显示了到目前为止我们配置的内容的直观概述。
任务 9:(可选)部署具有多个接口的云池
到目前为止,我们仅准备了一个 VNIC(恰好支持 SR-IOV),并将此 VNIC 移至云池中。我们已经为四个不同的测试舱做到了这一点。
现在,如果要将更多 VNIC 添加到特定云池中,该怎么办?您必须重复以下步骤:
- 创建新的 OCI 子网。
- 创建新的 VNIC 并分配 IP 地址。
- 创建新的
NetworkAttachmentDefinitions
。 - 通过添加新注释更新测试池 YAML 文件。
在此任务中,您将找到一个示例,我们将在其中创建其他子网 VNIC、分配 IP 地址、NetworkAttachmentDefinition
并将其添加到 testpod1
的 pod 创建 YAML 文件中。
-
这是网络
10.0.4.0/27
上 IP 地址为10.0.4.29/27
的新接口ens6
的NetworkAttachmentDefinition
。请注意,对于网络
10.0.3.0/27
上 IP 地址为10.0.3.30/27
的接口ens5
,这是另一个NetworkAttachmentDefinition
。sriov-vnic-2-new.yaml
:apiVersion: "k8s.cni.cncf.io/v1" kind: NetworkAttachmentDefinition metadata: name: sriov-vnic-2-new spec: config: '{ "cniVersion": "0.3.1", "type": "host-device", "device": "ens6", "ipam": { "type": "static", "addresses": [ { "address": "10.0.4.29/27", "gateway": "0.0.0.0" } ], "routes": [ { "dst": "10.0.4.0/27", "gw": "0.0.0.0" } ] } }'
-
这是
testpod1
的(更新)YAML 文件。请注意
annotations
中的附加行,其中引用了新NetworkAttachmentDefinition
;sriov-vnic-2-new
。sudo nano testpod1-v3.yaml apiVersion: v1 kind: Pod metadata: name: testpod1 annotations: k8s.v1.cni.cncf.io/networks: sriov-vnic-1 k8s.v1.cni.cncf.io/networks: sriov-vnic-2-new spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: node_type operator: In values: - testpod1 containers: - name: appcntr1 image: centos/tools imagePullPolicy: IfNotPresent command: [ "/bin/bash", "-c", "--" ] args: [ "while true; do sleep 300000; done;" ]
任务 10:删除所有云池部署和 NetworkAttachmentDefinitions
如果要使用 NetworkAttachmentDefinitions
重新启动或清除容器,请执行以下步骤:
-
使用
kubectl get pod
命令获取所有 pod。[opc@o-sqrtga ~]$ kubectl get pod NAME READY STATUS RESTARTS AGE my-nginx-576c6b7b6-6fn6f 1/1 Running 3 105d my-nginx-576c6b7b6-k9wwc 1/1 Running 3 105d my-nginx-576c6b7b6-z8xkd 1/1 Running 6 105d mysql-6d7f5d5944-dlm78 1/1 Running 12 100d testpod1 1/1 Running 0 64d testpod2 1/1 Running 0 64d testpod3 1/1 Running 0 64d testpod4 1/1 Running 0 64d [opc@o-sqrtga ~]$
-
使用以下命令删除测试云池。
kubectl delete -f testpod1-v2.yaml kubectl delete -f testpod2-v2.yaml kubectl delete -f testpod3-v2.yaml kubectl delete -f testpod4-v2.yaml
-
使用
kubectl get network-attachment-definitions.k8s.cni.cncf.io
命令获取所有NetworkAttachmentDefinitions
。[opc@o-sqrtga ~]$ kubectl get network-attachment-definitions.k8s.cni.cncf.io NAME AGE sriov-vnic-1 64d sriov-vnic-2 64d sriov-vnic-3 64d sriov-vnic-4 64d [opc@o-sqrtga ~]$
-
使用以下命令删除
NetworkAttachmentDefinitions
。kubectl delete networkattachmentdefinition.k8s.cni.cncf.io/sriov-vnic-1 kubectl delete networkattachmentdefinition.k8s.cni.cncf.io/sriov-vnic-2 kubectl delete networkattachmentdefinition.k8s.cni.cncf.io/sriov-vnic-3 kubectl delete networkattachmentdefinition.k8s.cni.cncf.io/sriov-vnic-4
相关链接
确认
- 作者 -Iwan Hoogendoorn(OCI 网络专家)
更多学习资源
通过 docs.oracle.com/learn 浏览其他实验室,或者通过 Oracle Learning YouTube 频道访问更多免费学习内容。此外,请访问 education.oracle.com/learning-explorer 以成为 Oracle Learning Explorer。
有关产品文档,请访问 Oracle 帮助中心。
Deploy SR-IOV Enabled Network Interfaces Container Apps on OKE Using Multus CNI Plugin
G28061-02
Copyright ©2025, Oracle and/or its affiliates.