This documentation is for a release that is no longer maintained
See documentation for the latest supported version 3 or the latest supported version 4.7.8. 为 SR-IOV 配置额外网络
网络接口卡 (NIC) SR-IOV 硬件只是一个技术预览功能。红帽产品服务等级协议 (SLA) 不支持技术预览功能,且可能无法完成。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。
有关红帽技术预览功能支持范围的详情,请参阅 https://access.redhat.com/support/offerings/techpreview/。
7.8.1. 关于 OpenShift Container Platform 中的 SR-IOV 硬件 复制链接链接已复制到粘贴板!
OpenShift Container Platform 包含在节点上使用 SR-IOV 硬件的功能。您可以将 SR-IOV 虚拟功能 (VF) 接口附加到带有 SR-IOV 硬件的节点上的 Pod。
您可以通过部署 SR-IOV Network Operator,使用 OpenShift Container Platform 控制台来安装 SR-IOV。SR-IOV Network Operator 会创建和管理 SR-IOV 堆栈的组件。Operator 提供以下功能:
- 在集群中发现 SR-IOV 网络设备。
- 在节点上初始化支持的 SR-IOV NIC 模型。
- 在节点上置备 SR-IOV 网络设备插件。
- 在节点上置备 SR-IOV CNI 插件可执行文件。
- 在集群中置备 Network Resources Injector(网络资源注入器)。
- 管理 SR-IOV 网络设备插件的配置。
- 为 SR-IOV CNI 插件生成 NetworkAttachmentDefinition 自定义资源 (CR) 。
以上提到的 SR-IOV 组件的功能。
- SR-IOV 网络设备插件是一个 Kubernetes 设备插件,用于发现、公告和分配 SR-IOV 网络虚拟功能 (VF) 资源。在 Kubernetes 中使用设备插件能够利用有限的资源,这些资源通常为于物理设备中。设备插件可以使 Kubernetes 调度程序了解资源可用性,因此调度程序可以在具有足够资源的节点上调度 Pod。
- SR-IOV CNI 插件探测从 SR-IOV 设备插件中直接分配给 Pod 的 VF 接口。
- Network Resources Injector 是一个 Kubernetes Dynamic Admission Controller Webhook,它提供通过请求和限制为自定义网络资源(如 SR-IOV VF)应用 Kubernetes Pod 规格的功能。
Network Resources Injector 会被默认启用且无法禁用。
7.8.1.1. 支持的设备 复制链接链接已复制到粘贴板!
OpenShift Container Platform 支持以下网络接口卡 (NIC):
-
Intel XXV710-DA2 25G 卡,厂商 ID
0x8086,设备 ID0x158b -
Mellanox MT27710 系列 [ConnectX-4 Lx] 25G 卡,厂商 ID
0x15b3,设备 ID0x1015 -
Mellanox MT27800 系列 [ConnectX-5] 100G 卡,厂商 ID
0x15b3,设备 ID0x1017
7.8.1.2. 自动发现 SR-IOV 网络设备 复制链接链接已复制到粘贴板!
SR-IOV Network Operator 将搜索集群以获取 worker 节点上的 SR-IOV 功能网络设备。Operator 会为每个提供兼容 SR-IOV 网络设备的 worker 节点创建并更新一个 SriovNetworkNodeState 自定义资源 (CR) 。
每个 worker 节点都会创建了一个 CR,并共享与该节点相同的名称。.spec.interfaces 列表提供有关节点上网络设备的信息。
不要修改 SriovNetworkNodeState CR。Operator 会自动创建和管理这些资源。
以下是由 SR-IOV Network Operator 创建的 SriovNetworkNodeState CR 示例:
7.8.1.3. 在 Pod 中使用虚拟功能 (VF) 的示例 复制链接链接已复制到粘贴板!
您可以在附加了 SR-IOV VF 的 Pod 中运行远程直接内存访问 (RDMA) 或 Data Plane Development Kit (DPDK) 应用程序。在以下示例中,Pod 在 RDMA 模式中使用 VF:
以下示例演示了在 DPDK 模式中使用 VF 的 Pod:
7.8.2. 安装 SR-IOV Network Operator 复制链接链接已复制到粘贴板!
作为集群管理员,您可以使用 OpenShift Container Platform CLI 或 Web 控制台安装 SR-IOV Network Operator。
7.8.2.1. 使用 CLI 安装 Operator 复制链接链接已复制到粘贴板!
作为集群管理员,您可以使用 CLI 安装 Operator。
先决条件
- 在裸机环境中安装的集群,其中的节点带有支持 SR-IOV 的硬件。
-
OpenShift Container Platform 命令行界面 (CLI),通常称为
oc。 -
以具有
cluster-admin特权的用户身份登录。
流程
通过完成以下操作,为 SR-IOV Network Operator 创建命名空间:
创建用来定义
sriov-network-operator命名空间的以下 Namespace 自定义资源 (CR) ,然后在sriov-namespace.yaml文件中保存这些 YAML 数据:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令创建命名空间:
oc create -f sriov-namespace.yaml
$ oc create -f sriov-namespace.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
通过创建以下对象,在您上一步创建的命名空间中安装 SR-IOV Network Operator:
创建以下 OperatorGroup CR,并在
sriov-operatorgroup.yaml文件中保存 YAML:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 通过运行以下命令来创建 OperatorGroup CR:
oc create -f sriov-operatorgroup.yaml
$ oc create -f sriov-operatorgroup.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令获取下一步所需的
channel值。oc get packagemanifest sriov-network-operator -n openshift-marketplace -o jsonpath='{.status.defaultChannel}'$ oc get packagemanifest sriov-network-operator -n openshift-marketplace -o jsonpath='{.status.defaultChannel}' 4.2Copy to Clipboard Copied! Toggle word wrap Toggle overflow 创建以下订阅 CR,并将 YAML 保存到
sriov-sub.yaml文件中:订阅示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令创建订阅对象:
oc create -f sriov-sub.yaml
$ oc create -f sriov-sub.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 进入
sriov-network-operator项目:oc project sriov-network-operator
$ oc project sriov-network-operator Now using project "sriov-network-operator"Copy to Clipboard Copied! Toggle word wrap Toggle overflow
7.8.2.2. 使用 Web 控制台安装 Operator 复制链接链接已复制到粘贴板!
作为集群管理员,您可以使用 Web 控制台安装 Operator。
如上一节所述,您必须创建命名空间 CR 和 OperatorGroup CR。
流程
使用 OpenShift Container Platform Web 控制台安装 SR-IOV Network Operator:
-
在 OpenShift Container Platform Web 控制台中,点击 Operators
OperatorHub。 - 从可用的 Operators 列表中选择 SR-IOV Network Operator,然后点 Install。
- 在 Create Operator Subscription 页面中,在集群的一个特定的命名空间中 选择sriov-network-operator。然后,点击 Subscribe。
-
在 OpenShift Container Platform Web 控制台中,点击 Operators
可选:验证 SR-IOV Network Operator 是否已成功安装:
-
切换到 Operators
Installed Operators 页面。 确保 SR-IOV Network Operator 在 sriov-network-operator 项目中列出,状态 为 InstallSucceeded。
注意在安装过程中,Operator 可能会显示 Failed 状态。如果安装过程结束后有 InstallSucceeded 信息,您可以忽略这个 Failed 信息。
如果 Operator 没有被成功安装,请按照以下步骤进行故障排除:
-
进入 Operators
Installed Operators 页面,检查 Operator Subscriptions 和 Install Plans 选项卡中的 Status 项中是否有任何错误。 -
进入 Workloads
Pods 页面,在 sriov-network-operator项目中检查 Pod 的日志。
-
进入 Operators
-
切换到 Operators
7.8.3. 配置 SR-IOV 网络设备 复制链接链接已复制到粘贴板!
SR-IOV Network Operator 把 SriovNetworkNodePolicy.sriovnetwork.openshift.io 自定义资源定义 (CRD) 添加到 OpenShift Container Platform。您可以通过创建一个 SriovNetworkNodePolicy 自定义资源 (CR) 来配置 SR-IOV 网络设备。
当应用由 SriovNetworkNodePolicy CR 指定的配置时,SR-IOV Operator 可能会排空节点,并在某些情况下会重启节点。它可能需要几分钟时间来应用配置更改。确保集群中有足够的可用节点,用以预先处理被驱除的工作负载。
在应用了配置更新后,sriov-network-operator 命名空间中的所有 Pod 都将变为 Running 状态。
先决条件
-
安装 OpenShift 命令行界面 (CLI),通常称为
oc。 -
以具有
cluster-admin特权的用户身份登录。 - 您必须已安装了 SR-IOV Operator。
流程
创建以下 SriovNetworkNodePolicy CR,然后在
<name>-sriov-node-network.yaml文件中保存 YAML。使用配置的实际名称替换<name>。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 为 CR 指定一个名称。
- 2
- 指定 SR-IOV Operator 安装到的命名空间。
- 3
- 指定 SR-IOV 设备插件的资源名称。如果 Pod spec 中引用了,则会添加
openshift.io/前缀。您可以为一个资源名称创建多个 SriovNetworkNodePolicy CR。 - 4
- 指定节点选择器来选择要配置哪些节点。用户可以选择手动标记节点,也可以使用 Kubernetes Node Feature Discovery 等工具进行。只有所选节点上的 SR-IOV 网络设备才会被配置。SR-IOV CNI 插件和设备插件只能部署到所选节点上。
- 5
- 指定一个
0到99之间的整数。大数值的优先级较低,因此优先级99低于优先级10。 - 6
- 为虚拟功能(VF)的最大传输单位 (MTU) 指定一个值。MTU 的值必须是在
1到9000之间。如果您不需要指定 MTU,请指定一个"值。 - 7
- 为 SR-IOV 物理网络设备指定要创建的虚拟功能 (VF) 的数量。对于 Intel 网络接口卡 (NIC) ,VF 的数量不能超过该设备支持的 VF 总数。对于 Mellanox NIC,VF 的数量不能超过
128。 - 8
nicSelector映射为 Operator 选择要配置的以太网设备。您不需要为所有参数指定值。建议您以足够的准确度来识别以太网适配器,以便尽量减小意外选择其他以太网设备的可能性。如果指定了rootDevices,则必须同时为vendor、deviceID或pfNames指定一个值。如果同时指定了pfNames和rootDevices,请确保它们指向同一个设备。- 9
- 指定 SR-IOV 网络设备的厂商十六进制代码。允许的值只能是
8086或15b3。 - 10
- 指定 SR-IOV 网络设备的设备十六进制代码。允许的值只能是
158b、1015、1017。 - 11
- 参数接受包括以太网设备的一个或多个物理功能 (PF) 的数组。
- 12
- 参数接受一个包括一个或多个 PCI 总线地址,用于以太网设备的物理功能的数组。使用以下格式提供地址:
0000:02:00.1。 - 13
- 指定虚拟功能的驱动程序类型。您可以指定以下值之一:
netdevice和vfio-pci。默认值为netdevice。 - 14
- 指定是否启用 RDMA 模式。默认值为
false。在 Mellanox 以太网适配器中只支持 RDMA over Converged Ethernet (RoCE) 模式。
注意如果将
RDMA标记设定为true,您可以继续使用启用了 RDMA 的 VF 作为普通网络设备。设备可在其中的一个模式中使用。运行以下命令来创建 CR:
oc create -f <filename>
$ oc create -f <filename>1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 将
<filename>替换为您在上一步中创建的文件的名称。
7.8.4. 配置 SR-IOV 额外网络 复制链接链接已复制到粘贴板!
您可以通过创建一个 SriovNetwork 自定义资源 (CR) 来配置使用 SR-IOV 硬件的额外网络。当创建 SriovNetwork CR 时,SR-IOV Operator 会自动创建一个 NetworkAttachmentDefinition CR。
如果一个 SriovNetwork 自定义资源 (CR) 已被附件到状态为 running 的 Pod 后,则不能修改或删除它。
先决条件
-
安装 OpenShift 命令行界面 (CLI),通常称为
oc。 -
以具有
cluster-admin特权的用户身份登录。
流程
创建以下 SriovNetwork CR,然后在
<name>-sriov-network.yaml文件中保存 YAML。用这个额外网络的名称替换<name>。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 将
<name>替换为 CR 的名称。Operator 将创建一个具有相同名称的 NetworkAttachmentDefinition CR。 - 2
- 指定 SR-IOV Operator 安装到的命名空间。
- 3
- 将
<target_namespace>替换为创建 NetworkAttachmentDefinition CR 的命名空间。 - 4
- 为 ipam CNI 插件指定一个配置对象做为一个 YAML 块 scalar。该插件管理网络附加定义的 IP 地址分配。
- 5
- 使用额外网络的虚拟 LAN (VLAN) ID 替换
<vlan>。它需要是一个从0到4095范围内的一个整数值。默认值为0。 - 6
- 把
<sriov_resource_name>替换为来自用于为这个额外网络定义 SR-IOV 硬件的 SriovNetworkNodePolicy CR 的.spec.resourceName参数的值。
运行以下命令来创建 CR:
oc create -f <filename>
$ oc create -f <filename>1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 将
<filename>替换为您在上一步中创建的文件的名称。
可选:通过运行以下命令,确认与在上一步中创建的 SriovNetwork CR 关联的 NetworkAttachmentDefinition CR 是否存在。将
<namespace>替换为您在 SriovNetwork CR 中指定的命名空间。oc get net-attach-def -n <namespace>
oc get net-attach-def -n <namespace>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
7.8.4.1. 配置 ipam CNI 插件 复制链接链接已复制到粘贴板!
IP 地址管理 (IPAM) CNI 插件为其他 CNI 插件管理 IP 地址分配。您可以配置 ipam 以进行静态 IP 地址分配或使用 DHCP 进行动态 IP 地址分配。您指定的 DHCP 服务器必须可从额外网络访问。
在 OpenShift Container Platform 4.2.0 中,如果您将 Pod 附加到使用 DHCP 进行 IP 地址管理的额外网络中,则 Pod 将无法启动。OpenShift Container Platform 4.2.1 已修复了这个问题。如需更多信息,请参阅 BZ#1754686。
以下 JSON 配置对象描述了您可以设置的参数。
如果您将 type 参数设置为 DHCP 值,则无法设置任何其他参数。
ipam CNI 插件 JSON 配置对象
- 1
- 指定
static,以配置插件来管理 IP 地址分配。指定DHCP,以允许 DHCP 服务器管理 IP 地址分配。如果指定了DHCP值,则无法指定任何其他参数。 - 2
- 定义分配给虚拟接口的 IP 地址的数组。支持 IPv4 和 IPv6 IP 地址。
- 3
- 您以 CIDR 格式指定的分配给 worker 节点上 Pod 的 IP 地址块,如
10.1.1.0/24。 - 4
- 出口网络流量要路由到的默认网关。
- 5
- 描述要在 Pod 中配置的路由的数组。
- 6
- CIDR 格式的 IP 地址范围。
- 7
- 用于将网络流量路由到的网关。
- 8
- DNS 配置。可选。
- 9
- 用来发送 DNS 查询的一个或多个 IP 地址的数组。
- 10
- 附加到主机名的默认域。例如,如果将域设置为
example.com,对example-host的 DNS 查找查询将被改写为example-host.example.com。 - 11
- 在 DNS 查找查询过程中,附加到非限定主机名(如
example-host)的域名的数组。
7.8.4.1.1. 静态 IP 地址分配配置示例 复制链接链接已复制到粘贴板!
您可以配置 ipam 以进行静态 IP 地址分配:
7.8.4.1.2. 动态 IP 地址分配配置示例 复制链接链接已复制到粘贴板!
您可以配置 ipam 以使用 DHCP:
{
"ipam": {
"type": "DHCP"
}
}
{
"ipam": {
"type": "DHCP"
}
}
7.8.5. 将 Pod 添加到额外网络 复制链接链接已复制到粘贴板!
您可以将 Pod 添加到额外网络。Pod 继续通过默认网络发送与集群相关的普通网络流量。
如果指定了与 SR-IOV CNI 插件关联的 NetworkAttachmentDefinition CR,则 Network Resources Injector 会自动将 resource 参数注入 Pod CR。
先决条件
- Pod 必须与额外网络处于相同的命名空间。
-
安装 OpenShift 命令行界面 (CLI),通常称为
oc。 - 您必须登录集群。
- 您必须安装了 SR-IOV Operator ,并定义了 SriovNetwork CR。
流程
要添加带有额外网络的 Pod,请完成以下步骤:
在 Pod 资源定义中,将
k8s.v1.cni.cncf.io/networks参数添加到 Podmetadata映射中。k8s.v1.cni.cncf.io/networks接受由一个或多个 NetworkAttachmentDefinition 自定义资源 (CR) 名称组成并用逗号分隔的字符串:metadata: annotations: k8s.v1.cni.cncf.io/networks: <network>[,<network>,...]metadata: annotations: k8s.v1.cni.cncf.io/networks: <network>[,<network>,...]1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 将
<network>替换为要与 Pod 关联的额外网络的名称。要指定多个额外网络,请使用逗号分隔各个网络。逗号之间不可包括空格。如果您多次指定同一额外网络,则 Pod 会将多个网络接口附加到该网络。
在以下示例中,两个额外网络附加到 Pod:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令来创建 Pod:
oc create -f pod.yaml
$ oc create -f pod.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 可选:通过运行以下命令,确认 Pod CR 中是否存在注解。将
<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 - 1
k8s.v1.cni.cncf.io/networks-status参数是对象的 JSON 数组。每个对象描述附加到 Pod 的额外网络的状态。注解值保存为纯文本值。