Функционал SR-IOV в OpenStack

Данная документация написана для версии OpenStack Train.

SR-IOV - функционал, позволяющий виртуализировать PCIe Ethernet устройство, представив его в виде множества PCIe устройств. При этом каждое виртуальное PCIe устройство может быть напрямую подключено к виртуальной машине, запущенной в Opensatck. Данный подход позволяет достигать низких задержек трафика и приближает скорость виртуального интерфейса к физическому.

Важно

Для возможности работы с SR-IOV необходимо, чтобы данный функцинал поддерживался оборудованием.

Примечание

В данном описании используется физический интерфейс eth1. Имя данного интерфейса может отличаться в зависимости от настраиваемого окружения.

Настройка виртуальных устройств (выполняется на гипервизоре):

  1. Убедитесь, что функционал SR-IOV и VT-d включены в BIOS.

  2. Включите IOMMU, добавив параметр “intel_iommu=on” к параметрам ядра в файле /etc/default/grub. Пример с включенным параметром:

    GRUB_CMDLINE_LINUX_DEFAULT="quiet splash intel_iommu=on
    vfio_iommu_type1.allow_unsafe_interrupts=1 iommu=pt"
    
  3. На всех гипервизорах создайте виртуальные интерфейсы:

    echo '8' > /sys/class/net/eth1/device/sriov_numvfs
    
  4. Проверьте максимальное количество виртуальных интерфейсов поддерживаемых в вашей системе:

    # cat /sys/class/net/eth3/device/sriov_totalvfs
    
  5. Убедитесь, что виртуальные интерфейсы созданы и находятся в состоянии UP:

    ip link show eth3
    
  6. Добавьте возможность создания виртуальных интерфейсов после перезагрузки:

    # echo "echo '7' > /sys/class/net/eth1/device/sriov_numvfs" >> /etc/rc.local
    

Настройка работы с PCI устройствами в nova-compute (выполняется на гипервизоре):

  1. В файл nova.conf добавьте информацию а том, какие PCI устройства nova-compute сможет использовать:

    [pci]
    passthrough_whitelist = { "devname": "eth1", "physical_network": "physnet1"}
    
  2. Перезапустите службы nova-compute.

Настройка neutron-server (выполняется на контроллере):

  1. Добавьте sriovnicswitch к используемым драйверам. Для этого отредактируйте файл ml2_conf.ini на каждом контроллере:

    [ml2]
    mechanism_drivers = openvswitch,sriovnicswitch
    
  2. Убедитесь, что ваша физическая сеть указана в настройках файла ml2_conf.ini:

    [ml2_type_vlan]
    network_vlan_ranges = physnet1
    
  3. Перезапустите neutron-server.

Настройка nova-scheduler (выполняется на контроллере):

  1. На всех контроллерах с запущенной службой nova-scheduler добавьте новый фильтр PciPassthroughFilter, для этого в nova.conf добавьте следующее:

    [filter_scheduler]
    enabled_filters = AvailabilityZoneFilter, ComputeFilter,
    ComputeCapabilitiesFilter, ImagePropertiesFilter, ServerGroupAntiAffinityFilter,
    ServerGroupAffinityFilter, PciPassthroughFilter
    available_filters = nova.scheduler.filters.all_filters
    
  2. Перезапустите службу nova-scheduler.

Настройка агента sr-iov (выполняется на гипервизоре):

  1. Отредактируйте файл sriov_agent.ini согласно настройкам вашего облака:

    [securitygroup]
    firewall_driver = neutron.agent.firewall.NoopFirewallDriver
    [sriov_nic]
    physical_device_mappings = physnet1:eth1
    exclude_devices =
    
  2. Установите агента sr-iov для neutron и запустите его:

    apt install neutron-sriov-agent
    systemctl enable neutron-sriov-agent
    systemctl start neutron-sriov-agent
    

Запуск виртуальной машины с портами SR-IOV

  1. Создайте внешнюю сеть и подсеть с нужными параметрами:

    openstack network create --provider-physical-network physnet1 \
    --provider-network-type
    sriov-net
    openstack subnet create --network sriov-net \
    --subnet-pool shared-default-subnetpool-v4 \
    sriov-subnet
    
  2. Получите id созданной сети:

    net_id=$(openstack network show sriov-net -c id -f value)
    
  3. Создайте порт в сети с типом direct и получите его id:

    openstack port create --network $net_id --vnic-type direct \
    sriov-port
    port_id=$(openstack port show sriov-port -c id -f value)
    
  4. Запустите виртуальную машину:

    openstack server create --flavor m1.large --image ubuntu_18.04 \
    --nic port-id=$port_id \
    test-sriov