背景描述
SR-IOV (Single Root I/O Virtualization) 是一种允许物理设备如网络接口卡(NIC)在没有软件的情况下将其资源分割成多个虚拟设备的技术。使用SR-IOV可以在性能和资源隔离方面提供显著的优势,因为它减少了网络数据在主机和虚拟机之间传输的开销。安全容器服务支持SR-IOV网络设备插件,用于发现、公告和分配SR-IOV网络虚拟功能 (VF) 资源。本章节通过使用Yaml创建功能,配置SR-IOV网络。
前置条件
为了使用SR-IOV功能,需要满足以下前提条件:
- 服务器BIOS中已开启SR-IOV功能。
- 启用Intel IOMMU功能,并以Pass-Through模式进行配置。
- 已安装NVIDIA MLNX_OFED驱动。
- 网卡固件启用SR-IOV功能。
- 在MLNX_OFED驱动上启用SR-IOV。
详细操作步骤请参见前置条件。这些前提条件的满足将确保系统具备使用SR-IOV功能所需的硬件支持和驱动程序。请确保在使用SR-IOV之前,你的系统已按照要求进行相应的设置和安装。
操作步骤
前置操作完成后,需重启环境中sriov-config-daemon的Pod
因为sriov-config-daemon
是daemonSet
部署,则删除namespace
为eks-managed
,label为app=sriov-network-config-daemon
的Pod即可。
创建SriovNetworkNodePolicy对象:
SriovNetworkNodePolicy是SR-IOV Network Operator的一部分,用于定义如何配置SR-IOV网络。它是一个Kubernetes自定义资源(CR),用于指定SR-IOV网络配置策略。
可以通过定义SriovNetworkNodePolicy对象来指定节点的SR-IOV网络设备配置:
1.查看节点SR-IOV设备信息
节点sriov-config-daemon上报上来的SR-IOV设备情况会更新到节点对应的 sriovnetworknodestates.status
,即查看sriovnetworknodestates.status
内容
# kubectl get sriovnetworknodestates.sriovnetwork.openshift.io <node-name> -n eks-managed -o yaml
status:
interfaces:
- deviceID: "1013"
driver: mlx5_core
linkType: IB
mac: 00:00:07:ff:fe:80:00:00:00:00:00:00:e4:1d:2d:03:00:67:68:fa
mtu: 2048
name: ib0
pciAddress: 0000:61:00.0
totalvfs: 3
vendor: 15b3
syncStatus: Succeeded
2.根据节点SR-IOV设备情况,创建SriovNetworkNodePolicy资源。
apiVersion: sriovnetwork.openshift.io/v1
kind: SriovNetworkNodePolicy
metadata:
name: <name> 1
namespace: eks-managed
spec:
resourceName: <sriov_resource_name> 2
nodeSelector:
<nodeSelector-key>:<nodeSelector_value> 3
priority: <priority> 3
mtu: <mtu> 4
numVfs: <num> 5
nicSelector: 6
vendor: "<vendor_code>" 7
deviceID: "<device_id>" 8
pfNames: ["<pf_name>", ...] 9
rootDevices: ["<pci_bus_id>", "..."] 10
deviceType: vfio-pci
isRdma: false 11
参数 | 说明 |
---|---|
name | CR对象的名称。 |
resourceName | SR-IOV设备插件的资源名称。您可以为一个资源名称创建多个"SriovNetworkNodePolicy"对象。 |
priority(可选) | "0"到"99"之间的整数。较小的数值具有较高的优先权,优先级"10"高于优先级"99" 。默认值为"99"。 |
mtu(可选) | 为虚拟功能(VF)的最大传输单位 (MTU) 指定一个值。MTU的值必须是在"1"到"9000"之间。如果您不需要指定MTU,请指定一个"值。 |
numVfs | 为SR-IOV物理网络设备指定要创建的虚拟功能 (VF) 的数量。对于Intel网络接口卡 (NIC) ,VF的数量不能超过该设备支持的VF总数。对于Mellanox NIC,VF的数量不能超过"128"。 |
nicSelector | nicSelector 映射为Operator选择要配置的设备。您不需要为所有参数指定值。建议您以足够的准确度来识别网络设备,以便尽量减小意外选择其他网络设备的可能性。如果指定了rootDevices,则必须同时为vendor、deviceID或pfNames指定一个值。如果同时指定了"pfNames"和"rootDevices",请确保它们指向同一个设备。 |
vendor(可选) | SR-IOV网络设备的厂商十六进制代码。允许的值只能是"8086"和"15b3"。 |
deviceID(可选) | SR-IOV网络设备的设备十六进制代码。允许的值只能是"158b"、"1015"和"1017 "。 |
pfNames(可选) | 该设备的一个或多个物理功能(PF)名称的数组。 |
rootDevices | 用于该设备的PF的一个或多个PCI总线地址的数组。使用以下格式提供地址: "0000:02:00.1"。 |
isRdma(可选) | 是否启用远程直接访问(RDMA)模式。默认值为"false"。 |
说明:
写sriovNetworkNodePolicy的
spec
的定义,要根据sriovNetworkNodeState.Status.interface
去写。
若sriovNetworkNodePolicy的spec
定义,不在sriovNetworkNodeState.Status.interface
的设备范围内,则生成只有DpConfigVersion
的spec
。
创建 SriovIBNetwork资源:
您可以通过定义对象来配置 InfiniBand (IB) 网络设备”SriovIBNetwork”。
1.下方示例Yaml展示了如何通过 SriovIBNetwork 对象,配置 Infiniband network attachment
apiVersion: sriovnetwork.openshift.io/v1
kind: SriovIBNetwork
metadata:
name: <name> 1
namespace: eks-managed
spec:
resourceName: <sriov_resource_name> 2
networkNamespace: <target_namespace> 3
vlan: <vlan> 4
spoofChk: "<spoof_check>" 5
ipam: |- 6
{}
linkState: <link_state> 7
maxTxRate: <max_tx_rate> 8
minTxRate: <min_tx_rate> 9
vlanQoS: <vlan_qos> 10
trust: "<trust_vf>" 11
capabilities: <capabilities> 12
参数 | 说明 |
---|---|
name | 对象的名称。SR-IOV Network Operator创建一个名称相同的"NetworkAttachmentDefinition"对象。 |
resourceName | 定义附加网络的SR-IOV硬件"SriovNetworkNodePolicy"对象中的"spec.resourceName"参数的值。 |
networkNamespace | SriovIBNetwork对象的目标命名空间。只有目标命名空间中的Pod才能连接到网络设备。 |
vlan(可选) | 额外网络的虚拟LAN(VLAN)ID。它需要是一个从"0"到"4095"范围内的一个整数值。默认值为"0"。 |
spoofChk(可选) | VF的"spoof"检查模式。允许的值是字符串"on"和"off"。 重要:指定的值必须由引号包括,否则SR-IOV Network Operator将拒绝对象。 |
ipam | 为IPAM CNI插件指定一个配置对象做为一个Yaml块scalar。该插件管理网络附加定义的IP地址分配。 |
linkState(可选) | 虚拟功能(VF)的链接状态。允许的值是"enable"、"disable"和"auto"。 |
maxTxRate(可选) | VF的最大传输率(以Mbps为单位)。 |
minTxRate(可选) | VF的最低传输率(以Mbps为单位)。这个值必须小于或等于最大传输率。 说明:Intel NIC不支持minTxRate参数。如需更多信息,请参阅 BZ#1772847 |
vlanQoS(可选) | VF的"IEEE 802.1p"优先级级别。默认值为"0"。 |
trust(可选) | VF的信任模式。允许的值是字符串"on"和"off"。 说明:您必须在引号中包含指定的值,或者SR-IOV Network Operator拒绝对象。 |
capabilities(可选) | 为这个额外网络配置功能。您可以指定 "{ "ips": true }" 来启用IP地址支持,或指定 "{ "mac": true }" 来启用MAC地址支持。 |
2.使用Whereabouts进行动态IP地址分配配置
{
"ipam": {
"type": "whereabouts",
"range": "<range>", 1
"exclude": ["<exclude_part>, ..."], 2
}
}
参数 | 说明 |
---|---|
range | 以CIDR标记指定一个IP地址范围。IP地址是通过这个地址范围来分配的。 |
exclude(可选) | 在CIDR标记中指定IP地址和范围列表。包含在排除地址范围中的IP地址。 |
创建业务容器(Pod)资源:
指定业务容器的规范,包括容器运行时(如runc、rune)、容器镜像、资源需求(如CPU和内存)、环境变量、命令等。
apiVersion: v1
kind: Pod
metadata:
name: sriov-rune-pod
annotations:
io.katacontainers.config.runtime.enable_sriov: "true"
k8s.v1.cni.cncf.io/networks: eks-managed/nics
#v1.multus-cni.io/default-network: eks-managed/kube-ovn
spec:
runtimeClassName: rune
containers:
- name: appcntr1
image: hub.easystack.io/captain/nginx-ingress-controller:v0.49.3
imagePullPolicy: IfNotPresent
command: [ "/bin/bash", "-c", "--" ]
args: [ "while true; do sleep 300000; done;" ]
resources:
requests:
<sriov_resource_name>: '1'
limits:
<sriov_resource_name>: '1'
注意:业务Pod的resources.requests、resources.limits的资源名称必须与sriovNetworkNodePolicy.spec.resourceName、sriovNetwork.spec.resourceName相等。