×

单根 I/O 虚拟化 (SR-IOV) 规范是用于一种 PCI 设备分配类型的标准,该标准可以与多个 Pod 共享单个设备。

您可以使用SR-IOV 运算符在集群中配置单根 I/O 虚拟化 (SR-IOV) 设备。

SR-IOV 可以将主机节点上识别为物理功能 (PF) 的兼容网络设备分割成多个虚拟功能 (VF)。VF 的使用方法与任何其他网络设备相同。设备的 SR-IOV 网络设备驱动程序确定 VF 如何在容器中公开。

  • netdevice 驱动程序:容器的 netns 中的常规内核网络设备

  • vfio-pci 驱动程序:在容器中挂载的字符设备

您可以将 SR-IOV 网络设备与安装在裸机或 Red Hat OpenStack Platform (RHOSP) 基础架构上的 OpenShift Container Platform 集群上的其他网络一起使用,用于需要高带宽或低延迟的应用程序。

您可以为 SR-IOV 网络配置多网络策略。对此的支持是技术预览版,SR-IOV 附加网络仅支持内核网卡。它们不支持数据平面开发套件 (DPDK) 应用程序。

在 SR-IOV 网络上创建多网络策略可能无法向应用程序提供与未配置多网络策略的 SR-IOV 网络相同的性能。

SR-IOV 网络的多网络策略仅为技术预览版功能。技术预览版功能不受 Red Hat 生产服务级别协议 (SLA) 的支持,并且可能功能不完整。Red Hat 不建议在生产环境中使用它们。这些功能可让您抢先体验即将推出的产品功能,从而能够在开发过程中测试功能并提供反馈。

有关 Red Hat 技术预览版功能支持范围的更多信息,请参阅技术预览版功能支持范围

您可以使用以下命令在节点上启用 SR-IOV

$ oc label node <node_name> feature.node.kubernetes.io/network-sriov.capable="true"

其他资源

管理 SR-IOV 网络设备的组件

SR-IOV 网络运算符创建和管理 SR-IOV 堆栈的组件。运算符执行以下功能:

  • 协调 SR-IOV 网络设备的发现和管理

  • 为 SR-IOV 容器网络接口 (CNI) 生成 NetworkAttachmentDefinition 自定义资源

  • 创建和更新 SR-IOV 网络设备插件的配置

  • 创建特定于节点的 SriovNetworkNodeState 自定义资源

  • 更新每个 SriovNetworkNodeState 自定义资源中的 spec.interfaces 字段

运算符预配以下组件:

SR-IOV 网络配置守护程序

SR-IOV 网络运算符启动时部署在工作节点上的守护程序集。守护程序负责发现和初始化集群中的 SR-IOV 网络设备。

SR-IOV 网络运算符 Webhook

验证运算符自定义资源并为未设置的字段设置适当的默认值的动态准入控制器 Webhook。

SR-IOV 网络资源注入器

一个动态的准入控制器Webhook,提供用于修补Kubernetes Pod规范的功能,为自定义网络资源(例如SR-IOV VF)添加请求和限制。SR-IOV网络资源注入器会自动仅向Pod中的第一个容器添加resource字段。

SR-IOV网络设备插件

一个发现、通告和分配SR-IOV网络虚拟函数(VF)资源的设备插件。Kubernetes中的设备插件用于启用对有限资源(通常是物理设备)的使用。设备插件使Kubernetes调度器能够感知资源可用性,以便调度器可以在具有足够资源的节点上调度Pod。

SR-IOV CNI插件

一个CNI插件,它将从SR-IOV网络设备插件分配的VF接口直接连接到Pod中。

SR-IOV InfiniBand CNI插件

一个CNI插件,它将从SR-IOV网络设备插件分配的InfiniBand (IB) VF接口直接连接到Pod中。

SR-IOV网络资源注入器和SR-IOV网络操作符Webhook默认启用,可以通过编辑default SriovOperatorConfig CR来禁用。禁用SR-IOV网络操作符准入控制器Webhook时请谨慎操作。在某些情况下,例如故障排除或要使用不受支持的设备时,可以禁用Webhook。

支持的平台

SR-IOV网络操作符支持以下平台:

  • 裸机

  • Red Hat OpenStack Platform (RHOSP)

支持的设备

OpenShift Container Platform支持以下网络接口控制器:

表1. 支持的网络接口控制器
制造商 型号 供应商ID 设备ID

博通

BCM57414

14e4

16d7

博通

BCM57508

14e4

1750

博通

BCM57504

14e4

1751

英特尔

X710

8086

1572

英特尔

X710 背板

8086

1581

英特尔

X710 Base T

8086

15ff

英特尔

XL710

8086

1583

英特尔

XXV710

8086

158b

英特尔

E810-CQDA2

8086

1592

英特尔

E810-2CQDA2

8086

1592

英特尔

E810-XXVDA2

8086

159b

英特尔

E810-XXVDA4

8086

1593

英特尔

E810-XXVDA4T

8086

1593

Mellanox

MT27700系列 [ConnectX‑4]

15b3

1013

Mellanox

MT27710系列 [ConnectX‑4 Lx]

15b3

1015

Mellanox

MT27800系列 [ConnectX‑5]

15b3

1017

Mellanox

MT28880系列 [ConnectX‑5 Ex]

15b3

1019

Mellanox

MT28908系列 [ConnectX‑6]

15b3

101b

Mellanox

MT2892系列 [ConnectX‑6 Dx]

15b3

101d

Mellanox

MT2894系列 [ConnectX‑6 Lx]

15b3

101f

Mellanox

Mellanox MT2910系列 [ConnectX‑7]

15b3

1021

Mellanox

MT42822 BlueField‑2 在ConnectX‑6网卡模式下

15b3

a2d6

Pensando [1]

用于离子驱动器的DSC-25双端口25G分布式服务卡

0x1dd8

0x1002

Pensando [1]

用于离子驱动器的DSC-100双端口100G分布式服务卡

0x1dd8

0x1003

Silicom

STS系列

8086

1591

  1. 支持OpenShift SR-IOV,但在使用SR-IOV时,必须使用SR-IOV CNI配置文件设置静态虚拟函数(VF)媒体访问控制(MAC)地址。

有关支持的网卡和兼容的OpenShift Container Platform版本的最新列表,请参阅Openshift 单根I/O虚拟化(SR-IOV)和PTP硬件网络支持矩阵

SR-IOV网络设备的自动发现

SR-IOV网络操作符会在您的集群中搜索工作节点上支持SR-IOV的网络设备。操作符会为每个具有兼容SR-IOV网络设备的工作节点创建一个并更新一个SriovNetworkNodeState自定义资源(CR)。

此CR的名称与工作节点的名称相同。status.interfaces列表提供有关节点上网络设备的信息。

请勿修改SriovNetworkNodeState对象。操作符会自动创建和管理这些资源。

SriovNetworkNodeState对象示例

以下YAML是SR-IOV网络操作符创建的SriovNetworkNodeState对象的示例。

一个SriovNetworkNodeState对象
apiVersion: sriovnetwork.openshift.io/v1
kind: SriovNetworkNodeState
metadata:
  name: node-25 (1)
  namespace: openshift-sriov-network-operator
  ownerReferences:
  - apiVersion: sriovnetwork.openshift.io/v1
    blockOwnerDeletion: true
    controller: true
    kind: SriovNetworkNodePolicy
    name: default
spec:
  dpConfigVersion: "39824"
status:
  interfaces: (2)
  - deviceID: "1017"
    driver: mlx5_core
    mtu: 1500
    name: ens785f0
    pciAddress: "0000:18:00.0"
    totalvfs: 8
    vendor: 15b3
  - deviceID: "1017"
    driver: mlx5_core
    mtu: 1500
    name: ens785f1
    pciAddress: "0000:18:00.1"
    totalvfs: 8
    vendor: 15b3
  - deviceID: 158b
    driver: i40e
    mtu: 1500
    name: ens817f0
    pciAddress: 0000:81:00.0
    totalvfs: 64
    vendor: "8086"
  - deviceID: 158b
    driver: i40e
    mtu: 1500
    name: ens817f1
    pciAddress: 0000:81:00.1
    totalvfs: 64
    vendor: "8086"
  - deviceID: 158b
    driver: i40e
    mtu: 1500
    name: ens803f0
    pciAddress: 0000:86:00.0
    totalvfs: 64
    vendor: "8086"
  syncStatus: Succeeded
1 name字段的值与工作节点的名称相同。
2 interfaces部分包含操作符在工作节点上发现的所有SR-IOV设备的列表。

在Pod中使用虚拟函数的示例

您可以在连接了SR-IOV VF的Pod中运行远程直接内存访问(RDMA)或数据平面开发套件(DPDK)应用程序。

此示例显示一个在RDMA模式下使用虚拟函数(VF)的Pod。

使用RDMA模式的Pod规范
apiVersion: v1
kind: Pod
metadata:
  name: rdma-app
  annotations:
    k8s.v1.cni.cncf.io/networks: sriov-rdma-mlnx
spec:
  containers:
  - name: testpmd
    image: <RDMA_image>
    imagePullPolicy: IfNotPresent
    securityContext:
      runAsUser: 0
      capabilities:
        add: ["IPC_LOCK","SYS_RESOURCE","NET_RAW"]
    command: ["sleep", "infinity"]

以下示例显示一个在DPDK模式下使用VF的Pod。

使用DPDK模式的Pod规范
apiVersion: v1
kind: Pod
metadata:
  name: dpdk-app
  annotations:
    k8s.v1.cni.cncf.io/networks: sriov-dpdk-net
spec:
  containers:
  - name: testpmd
    image: <DPDK_image>
    securityContext:
      runAsUser: 0
      capabilities:
        add: ["IPC_LOCK","SYS_RESOURCE","NET_RAW"]
    volumeMounts:
    - mountPath: /dev/hugepages
      name: hugepage
    resources:
      limits:
        memory: "1Gi"
        cpu: "2"
        hugepages-1Gi: "4Gi"
      requests:
        memory: "1Gi"
        cpu: "2"
        hugepages-1Gi: "4Gi"
    command: ["sleep", "infinity"]
  volumes:
  - name: hugepage
    emptyDir:
      medium: HugePages

用于容器应用程序的DPDK库

一个可选库app-netutil,提供了一些API方法,用于从运行在该Pod内的容器中收集有关Pod的网络信息。

此库可以帮助将数据平面开发套件(DPDK)模式下的SR-IOV虚拟函数(VF)集成到容器中。该库提供Golang API和C API。

目前已实现三种API方法:

GetCPUInfo()

此函数确定容器可用的CPU,并返回列表。

GetHugepages()

此函数确定每个容器的Pod规范中请求的大页内存量,并返回这些值。

GetInterfaces()

此函数确定容器中的一组接口并返回列表。返回值包括每个接口的接口类型和特定于类型的數據。

该库的存储库包含一个用于构建容器镜像dpdk-app-centos的示例Dockerfile。此容器镜像可以运行以下DPDK示例应用程序之一,具体取决于Pod规范中的环境变量:l2fwdl3wdtestpmd。该容器镜像提供了一个将app-netutil库集成到容器镜像本身的示例。该库还可以集成到init容器中。init容器可以收集所需的数据并将数据传递给现有的DPDK工作负载。

用于向下API的大页资源注入

当Pod规范包含对大页的资源请求或限制时,网络资源注入器会自动将向下API字段添加到Pod规范中,以便为容器提供大页信息。

网络资源注入器会为Pod中的每个容器添加一个名为podnetinfo并安装在/etc/podnetinfo下的卷。该卷使用向下API,并包含大页请求和限制的文件。文件命名约定如下:

  • /etc/podnetinfo/hugepages_1G_request_<容器名称>

  • /etc/podnetinfo/hugepages_1G_limit_<容器名称>

  • /etc/podnetinfo/hugepages_2M_request_<容器名称>

  • /etc/podnetinfo/hugepages_2M_limit_<容器名称>

前面列表中指定的路径与app-netutil库兼容。默认情况下,该库配置为搜索/etc/podnetinfo目录中的资源信息。如果您选择手动自行指定向下API路径项,则app-netutil库除了搜索前面列表中的路径外,还会搜索以下路径:

  • /etc/podnetinfo/hugepages_request

  • /etc/podnetinfo/hugepages_limit

  • /etc/podnetinfo/hugepages_1G_request

  • /etc/podnetinfo/hugepages_1G_limit

  • /etc/podnetinfo/hugepages_2M_request

  • /etc/podnetinfo/hugepages_2M_limit

与网络资源注入器可以创建的路径一样,上述列表中的路径可以选择性地以_<容器名称>后缀结尾。

其他资源