SR-IOV

本页的目的是描述如何在 Kuryr-libnetwork 中启用 SR-IOV 功能。本页旨在作为配置 OpenStack Networking 和 Kuryr-libnetwork 以创建 SR-IOV 端口并将其用于容器的指南。

基础知识

自 Juno 版本以来,PCI-SIG 单根 I/O 虚拟化和共享 (SR-IOV) 功能在 OpenStack 中可用。SR-IOV 规范定义了一种标准化机制来虚拟化 PCIe 设备。该机制可以将单个 PCIe 以太网控制器虚拟化为多个 PCIe 设备。每个设备都可以直接分配给实例,绕过虚拟交换机层。因此,用户能够实现低延迟和接近线路速率的性能。

本文档中使用了以下术语

术语

定义

PF

物理功能。支持 SR-IOV 的物理以太网控制器。

VF

虚拟功能。从物理以太网控制器创建的虚拟 PCIe 设备。

使用 SR-IOV 接口

为了启用 SR-IOV,需要执行以下步骤

  1. 创建虚拟功能 (计算节点)

  2. 配置 neutron-server (控制器节点)

  3. 启用 neutron sriov-agent (计算节点)

  4. 配置 kuryr-libnetwork (计算节点)

创建虚拟功能 (计算节点)

请遵循 网络指南 中的 ‘创建虚拟功能’ 部分。

配置 neutron-server (控制器节点)

请遵循 网络指南 中的 ‘配置 neutron-server’ 部分。

启用 neutron sriov-agent (计算节点)

请遵循 网络指南 中的 ‘启用 neutron sriov-agent’ 部分。

配置 kuryr-libnetwork (计算节点)

  1. 在运行 kuryr-libnetwork 服务的每个计算节点上,编辑 kuryr-libnetwork 配置文件 (例如 /etc/kuryr/kuryr.conf)。在 [DEFAULT] 下,将 kuryr_libnetwork.port_driver.drivers.sriov 添加到 enabled_port_drivers 中,并在 [binding] 下,将 kuryr.lib.binding.drivers.hw_veb 添加到 enabled_drivers 中。

    [DEFAULT]
    enabled_port_drivers = kuryr_libnetwork.port_driver.drivers.veth, kuryr_libnetwork.port_driver.drivers.sriov
    
    [binding]
    enabled_drivers = kuryr.lib.binding.drivers.veth, kuryr.lib.binding.drivers.hw_veb
    
  2. 重启 kuryr-libnetwork 服务。

使用 SR-IOV 端口启动容器

配置完成后,您可以使用 SR-IOV 端口启动容器。

  1. 获取要在其中创建 SR-IOV 端口的网络 id

    $ net_id=`neutron net-show net04 | grep "\ id\ " | awk '{ print $4 }'`
    
  2. 通过指定 neutron 网络的名称来创建 kuryr 网络。将 10.10.0.0/2410.10.0.1 替换为要在其中创建 SR-IOV 端口的子网的 CIDR 和网关

    $ docker network create -d kuryr --ipam-driver=kuryr --subnet=10.10.0.0/24 --gateway=10.10.0.1 \
        -o neutron.net.uuid=$net_id kuryr_net
    
  3. 创建 SR-IOV 端口。这里使用 vnic_type=direct,但其他选项包括 normaldirect-physicalmacvtapbinding-profile 由 Neutron SR-IOV 驱动程序使用 [1]。将 physnet21137:00470000:0a:00.1 替换为 VF 设备的正确值

    $ neutron port-create $net_id --name sriov_port --binding:vnic_type direct \
        --binding-profile '{"physical_network": "physnet2", "pci_vendor_info": "1137:0047", "pci_slot": "0000:0a:00.1"}'
    
  4. 创建容器。指定在步骤二中创建的 SR-IOV 端口的 IP 地址

    $ docker run -it --net=kuryr_net --ip=10.0.0.5 ubuntu
    

参考

[1] https://specs.openstack.org/openstack/neutron-specs/specs/2025.2/ml2-sriov-nic-switch.html