第 4 章 配置 SR-IOV InfiniBand 网络附加
您可以为集群中的单根 I/O 虚拟化(SR-IOV)设备配置 InfiniBand(IB)网络附加。
在执行以下文档中的任何任务前,请确保 安装了 SR-IOV Network Operator。
4.1. Infiniband 设备配置对象 复制链接链接已复制到粘贴板!
您可以通过定义 SriovIBNetwork 对象来配置 InfiniBand(IB)网络设备。
以下 YAML 描述了 SriovIBNetwork 对象:
其中:
name-
对象的名称。SR-IOV Network Operator 创建一个名称相同的
NetworkAttachmentDefinition对象。 namespace- 安装 SR-IOV Operator 的命名空间。
resourceName-
用于为这个额外网络定义 SR-IOV 硬件的
SriovNetworkNodePolicy对象中的spec.resourceName参数的值。 networkNamespace-
SriovIBNetwork对象的目标命名空间。只有目标命名空间中的 pod 可以附加到网络设备。 ipam- 可选参数。为 IPAM CNI 插件指定一个配置对象做为一个 YAML 块 scalar。该插件管理附加定义的 IP 地址分配。
linkState-
可选参数。虚拟功能(VF)的链接状态。允许的值是
enable、disable和auto。 功能-
可选参数。为此网络配置功能。您可以指定
'{ "ips": true }'来启用 IP 地址支持,或'{ "infinibandGUID": true }'来启用 IB Global Unique Identifier (GUID)支持。
4.1.1. 为动态分配双栈 IP 地址创建配置 复制链接链接已复制到粘贴板!
您可以动态地将双栈 IP 地址分配给二级网络,以便 pod 可以通过 IPv4 和 IPv6 地址进行通信。
您可以在 ipRanges 参数中配置以下 IP 地址分配类型:
- IPv4 地址
- IPv6 地址
- 多个 IP 地址分配
流程
-
将
type设置为whereabouts。 使用
ipRanges来分配 IP 地址,如下例所示:Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 将二级网络附加到 pod。如需更多信息,请参阅"将 pod 添加到二级网络"。
验证
输入以下命令验证所有 IP 地址是否已分配给 pod 命名空间内的网络接口:
$ oc exec -it <pod_name> -- ip a
$ oc exec -it <pod_name> -- ip aCopy to Clipboard Copied! Toggle word wrap Toggle overflow 其中:
<podname>- pod 的名称。
4.1.2. 配置网络附加的 IP 地址分配 复制链接链接已复制到粘贴板!
对于辅助网络,您可以使用 IP 地址管理(IPAM) CNI 插件分配 IP 地址,该插件支持各种分配方法,包括动态主机配置协议(DHCP)和静态分配。
负责动态分配 IP 地址的 DHCP IPAM CNI 插件与两个不同的组件一起运行:
- CNI 插件:负责与 Kubernetes 网络堆栈集成,以请求和释放 IP 地址。
- DHCP IPAM CNI 守护进程:用于 DHCP 事件的监听程序,该事件与环境中的现有 DHCP 服务器协调,以处理 IP 地址分配请求。这个守护进程本身并不是一个 DHCP 服务器。
对于在其 IPAM 配置中需要 type: dhcp 的网络,请确保 DHCP 服务器满足以下条件:
- DHCP 服务器可用并在环境中运行。
- DHCP 服务器是集群外部的,您希望服务器组成客户的现有网络基础架构的一部分。
- DHCP 服务器被正确配置为为节点提供 IP 地址。
如果在环境中 DHCP 服务器不可用,请考虑使用 Whereabouts IPAM CNI 插件。Whereabouts CNI 提供类似的 IP 地址管理功能,而无需外部 DHCP 服务器。
当没有外部 DHCP 服务器或首选静态 IP 地址管理时,请使用 Whereabouts CNI 插件。Whereabouts 插件包含一个协调器守护进程来管理过时的 IP 地址分配。
通过包含单独的守护进程(DHCP IPAM CNI 守护进程)来确保在容器生命周期内定期续订 DHCP 租期。要部署 DHCP IPAM CNI 守护进程,请更改 Cluster Network Operator (CNO)配置,以触发此守护进程的部署,作为二级网络设置的一部分。
4.1.2.1. 静态 IP 地址分配配置 复制链接链接已复制到粘贴板!
下表描述了静态 IP 地址分配的配置:
| 字段 | 类型 | 描述 |
|---|---|---|
|
|
|
IPAM 地址类型。值必须是 |
|
|
| 指定分配给虚拟接口的 IP 地址的对象数组。支持 IPv4 和 IPv6 IP 地址。 |
|
|
| 指定要在 pod 中配置的路由的一组对象。 |
|
|
| 可选:指定 DNS 配置的对象数组。 |
address 数组需要带有以下字段的对象:
| 字段 | 类型 | 描述 |
|---|---|---|
|
|
|
您指定的 IP 地址和网络前缀。例如,如果您指定了 |
|
|
| 出口网络流量要路由到的默认网关。 |
| 字段 | 类型 | 描述 |
|---|---|---|
|
|
|
CIDR 格式的 IP 地址范围,如 |
|
|
| 路由网络流量的网关。 |
| 字段 | 类型 | 描述 |
|---|---|---|
|
|
| 发送 DNS 查询的一个或多个 IP 地址的数组。 |
|
|
|
要附加到主机名的默认域。例如,如果将域设置为 |
|
|
|
在 DNS 查找查询过程中,附加到非限定主机名(如 |
静态 IP 地址分配配置示例
4.1.2.2. 动态 IP 地址(DHCP)分配配置 复制链接链接已复制到粘贴板!
pod 在创建时获取其原始 DHCP 租期。该租期必须由集群中运行的一个小型的 DHCP 服务器部署定期续订。
对于以太网网络附加,SR-IOV Network Operator 不会创建 DHCP 服务器部署。Cluster Network Operator 负责创建最小 DHCP 服务器部署。
要触发 DHCP 服务器的部署,您必须编辑 Cluster Network Operator 配置来创建 shim 网络附加,如下例所示:
shim 网络附加定义示例
其中:
type- 为集群指定动态 IP 地址分配。
下表描述了使用 DHCP 进行动态 IP 地址地址分配的配置参数。
| 字段 | 类型 | 描述 |
|---|---|---|
|
|
|
IPAM 地址类型。需要值 |
以下 JSON 示例描述了使用 DHCP 进行动态 IP 地址地址分配的配置 p。
动态 IP 地址(DHCP)分配配置示例
{
"ipam": {
"type": "dhcp"
}
}
{
"ipam": {
"type": "dhcp"
}
}
4.1.2.3. 使用 Whereabouts 进行动态 IP 地址分配配置 复制链接链接已复制到粘贴板!
Whereabouts CNI 插件允许在不使用 DHCP 服务器的情况下动态地将 IP 地址分配给二级网络。
Whereabouts CNI 插件还支持在单独的 NetworkAttachmentDefinition CRD 中多次出现同一 CIDR 范围的重叠 IP 地址范围和配置。这在多租户环境中提供了更大的灵活性和管理功能。
4.1.2.3.1. 动态 IP 地址配置对象 复制链接链接已复制到粘贴板!
下表描述了使用 Whereabouts 进行动态 IP 地址分配的配置对象:
| 字段 | 类型 | 描述 |
|---|---|---|
|
|
|
IPAM 地址类型。需要 |
|
|
| CIDR 表示法中的 IP 地址和范围。IP 地址是通过这个地址范围来分配的。 |
|
|
| 可选: CIDR 标记中零个或更多 IP 地址和范围的列表。包含在排除地址范围中的 IP 地址。 |
|
|
| 可选:帮助确保每个 pod 的组或域都有自己的一组 IP 地址,即使它们共享相同的 IP 地址范围。设置此字段对于保持网络独立和组织非常重要,特别是在多租户环境中。 |
4.1.2.3.2. 使用 Whereabouts 的动态 IP 地址分配配置 复制链接链接已复制到粘贴板!
以下示例显示了使用 Whereabouts 的动态地址分配配置:
Whereabouts 动态 IP 地址分配
4.1.2.3.3. 使用 Whereabouts 带有重叠 IP 地址范围的动态 IP 地址分配 复制链接链接已复制到粘贴板!
以下示例显示了一个动态 IP 地址分配,它将重叠的 IP 地址范围用于多租户网络。
NetworkAttachmentDefinition 1
- 1
- 可选。如果设置,必须与
NetworkAttachmentDefinition 2的network_name匹配。
NetworkAttachmentDefinition 2
- 1
- 可选。如果设置,必须与
NetworkAttachmentDefinition 1的network_name匹配。
4.1.2.4. 配置 SR-IOV 额外网络 复制链接链接已复制到粘贴板!
您可以通过创建一个 SriovIBNetwork 对象来配置使用 SR-IOV 硬件的额外网络。创建 SriovIBNetwork 对象时,SR-IOV Network Operator 会自动创建一个 NetworkAttachmentDefinition 对象。
如果一个 SriovIBNetwork 对象已被附加到状态为 running 的 pod,则不要修改或删除它。
先决条件
-
安装 OpenShift CLI(
oc)。 -
以具有
cluster-admin特权的用户身份登录。
流程
创建一个
SriovIBNetwork对象,然后在<name>.yaml文件中保存 YAML,其中<name>是这个额外网络的名称。对象规格可能类似以下示例:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令来创建对象:
oc create -f <name>.yaml
$ oc create -f <name>.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 这里的
<name>指定额外网络的名称。可选: 要确认与您在上一步中创建的
SriovIBNetwork对象关联的NetworkAttachmentDefinition对象是否存在,请输入以下命令。将<namespace>替换为您在SriovIBNetwork对象中指定的 networkNamespace。oc get net-attach-def -n <namespace>
$ oc get net-attach-def -n <namespace>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
4.1.2.5. 基于 InfiniBand 的 SR-IOV 附加的运行时配置 复制链接链接已复制到粘贴板!
将 pod 附加到额外网络时,您可以指定运行时配置来为 pod 进行特定的自定义。例如,,您可以请求特定的 MAC 硬件地址。
您可以通过在 pod 规格中设置注解来指定运行时配置。注解键是 k8s.v1.cni.cncf.io/network,它接受一个 JSON 对象来描述运行时配置。
以下 JSON 描述了基于 InfiniBand 的 SR-IOV 网络附加的运行时配置选项。
其中:
name- SR-IOV 网络附加定义 CR 的名称。
infiniband-guid-
SR-IOV 设备的 InfiniBand GUID。要使用这个功能,还必须在
SriovIBNetwork对象中指定{ "infinibandGUID": true }。 ips-
从 SR-IOV 网络附加定义 CR 中定义的资源类型分配的 SR-IOV 设备的 IP 地址。支持 IPv4 和 IPv6 IP 地址。要使用这个功能,你还必须在
SriovIBNetwork对象中指定{ "ips": true }。
4.1.2.6. 将 pod 添加到二级网络 复制链接链接已复制到粘贴板!
您可以将 pod 添加到二级网络。pod 继续通过默认网络发送与集群相关的普通网络流量。
创建 pod 时,二级网络会附加到 pod。但是,如果 pod 已存在,则无法将二级网络附加到其中。
pod 必须与二级网络位于同一个命名空间中。
先决条件
-
安装 OpenShift CLI(
oc)。 - 登录到集群。
流程
为
Pod对象添加注解。只能使用以下注解格式之一:要在不自定义的情况下附加二级网络,请使用以下格式添加注解。将
<network>替换为要与 pod 关联的二级网络的名称:metadata: annotations: k8s.v1.cni.cncf.io/networks: <network>[,<network>,...]metadata: annotations: k8s.v1.cni.cncf.io/networks: <network>[,<network>,...]Copy to Clipboard Copied! Toggle word wrap Toggle overflow 其中:
k8s.v1.cni.cncf.io/networks- 要指定多个二级网络,请使用逗号分隔每个网络。逗号之间不可包括空格。如果您多次指定相同的二级网络,则该 pod 会将多个网络接口附加到该网络。
要通过自定义来附加二级网络,请添加具有以下格式的注解:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 其中:
name-
指定
NetworkAttachmentDefinition对象定义的二级网络的名称。 namespace-
指定定义
NetworkAttachmentDefinition对象的命名空间。 default-route-
可选参数。为默认路由指定覆盖,如
192.168.17.1。
运行以下命令来创建 pod。将
<name>替换为 pod 的名称。oc create -f <name>.yaml
$ oc create -f <name>.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 可选: 要确认
PodCR 中是否存在注解,请输入以下命令将<name>替换为 pod 的名称。oc get pod <name> -o yaml
$ oc get pod <name> -o yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 在以下示例中,
example-podpod 附加到net1二级网络:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 其中:
k8s.v1.cni.cncf.io/network-status-
k8s.v1.cni.cncf.io/network-status参数是对象的 JSON 数组。每个对象描述附加到 pod 的二级网络的状态。注解值保存为纯文本值。
4.1.2.6.1. 向 pod 公开 vfio-pci SR-IOV 设备的 MTU 复制链接链接已复制到粘贴板!
将 pod 添加到额外网络后,您可以检查 MTU 可供 SR-IOV 网络使用。
流程
运行以下命令,检查 pod 注解是否包含 MTU:
oc describe pod example-pod
$ oc describe pod example-podCopy to Clipboard Copied! Toggle word wrap Toggle overflow 以下示例显示了输出示例:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令,验证 pod 中的
/etc/podnetinfo/中是否有 MTU:oc exec example-pod -n sriov-tests -- cat /etc/podnetinfo/annotations | grep mtu
$ oc exec example-pod -n sriov-tests -- cat /etc/podnetinfo/annotations | grep mtuCopy to Clipboard Copied! Toggle word wrap Toggle overflow 以下示例显示了输出示例:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow