$ oc label node <node_name> feature.node.kubernetes.io/network-sriov.capable="true"
单根 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 容器网络接口 (CNI) 生成 NetworkAttachmentDefinition
自定义资源
创建和更新 SR-IOV 网络设备插件的配置
创建特定于节点的 SriovNetworkNodeState
自定义资源
更新每个 SriovNetworkNodeState
自定义资源中的 spec.interfaces
字段
运算符预配以下组件:
SR-IOV 网络运算符启动时部署在工作节点上的守护程序集。守护程序负责发现和初始化集群中的 SR-IOV 网络设备。
验证运算符自定义资源并为未设置的字段设置适当的默认值的动态准入控制器 Webhook。
一个动态的准入控制器Webhook,提供用于修补Kubernetes Pod规范的功能,为自定义网络资源(例如SR-IOV VF)添加请求和限制。SR-IOV网络资源注入器会自动仅向Pod中的第一个容器添加resource
字段。
一个发现、通告和分配SR-IOV网络虚拟函数(VF)资源的设备插件。Kubernetes中的设备插件用于启用对有限资源(通常是物理设备)的使用。设备插件使Kubernetes调度器能够感知资源可用性,以便调度器可以在具有足够资源的节点上调度Pod。
一个CNI插件,它将从SR-IOV网络设备插件分配的VF接口直接连接到Pod中。
一个CNI插件,它将从SR-IOV网络设备插件分配的InfiniBand (IB) VF接口直接连接到Pod中。
SR-IOV网络资源注入器和SR-IOV网络操作符Webhook默认启用,可以通过编辑 |
OpenShift Container Platform支持以下网络接口控制器:
制造商 | 型号 | 供应商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 |
支持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网络设备的工作节点创建一个并更新一个SriovNetworkNodeState自定义资源(CR)。
此CR的名称与工作节点的名称相同。status.interfaces
列表提供有关节点上网络设备的信息。
请勿修改 |
以下YAML是SR-IOV网络操作符创建的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设备的列表。 |
您可以在连接了SR-IOV VF的Pod中运行远程直接内存访问(RDMA)或数据平面开发套件(DPDK)应用程序。
此示例显示一个在RDMA模式下使用虚拟函数(VF)的Pod。
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。
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
一个可选库,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规范中的环境变量:l2fwd
、l3wd
或testpmd
。该容器镜像提供了一个将app-netutil
库集成到容器镜像本身的示例。该库还可以集成到init容器中。init容器可以收集所需的数据并将数据传递给现有的DPDK工作负载。
当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
与网络资源注入器可以创建的路径一样,上述列表中的路径可以选择性地以_<容器名称>
后缀结尾。
如果您使用OpenShift虚拟化:将虚拟机连接到SR-IOV网络