Loading
close

使用Yaml配置SR-IOV网络

time 更新时间:2023-06-16 16:35:02

背景描述

SR-IOV (Single Root I/O Virtualization) 是一种允许物理设备如网络接口卡(NIC)在没有软件的情况下将其资源分割成多个虚拟设备的技术。使用SR-IOV可以在性能和资源隔离方面提供显著的优势,因为它减少了网络数据在主机和虚拟机之间传输的开销。安全容器服务支持SR-IOV网络设备插件,用于发现、公告和分配SR-IOV网络虚拟功能 (VF) 资源。本章节通过使用Yaml创建功能,配置SR-IOV网络。

前置条件

为了使用SR-IOV功能,需要满足以下前提条件:

  1. 服务器BIOS中已开启SR-IOV功能。
  2. 启用Intel IOMMU功能,并以Pass-Through模式进行配置。
  3. 已安装NVIDIA MLNX_OFED驱动。
  4. 网卡固件启用SR-IOV功能。
  5. 在MLNX_OFED驱动上启用SR-IOV。
    详细操作步骤请参见前置条件。这些前提条件的满足将确保系统具备使用SR-IOV功能所需的硬件支持和驱动程序。请确保在使用SR-IOV之前,你的系统已按照要求进行相应的设置和安装。

操作步骤

前置操作完成后,需重启环境中sriov-config-daemon的Pod

因为sriov-config-daemondaemonSet部署,则删除namespaceeks-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"。

说明:

sriovNetworkNodePolicyspec的定义,要根据sriovNetworkNodeState.Status.interface去写。
sriovNetworkNodePolicyspec定义,不在sriovNetworkNodeState.Status.interface的设备范围内,则生成只有DpConfigVersionspec

创建 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相等。

此篇文章对你是否有帮助?
没帮助
locked-file

您暂无权限访问该产品