Замена стандартного Linux Bridge на Open vSwitch

На сегодняшний день Open vSwitch (далее OvS) стандарт де факто при построении SDN. Он используется в таких проектах как OpenStack или Xen Cloud Platform. Возможностей у OvS довольно много. В этой заметке я хочу рассмотреть довольно скромную тему, использование OvS как замену стандартного linux bridge в libvirt.

Для выполнения описанной ниже конфигурации требуется локальное подключение к консоли сервера, так как в процессе конфигурации сетевое подключение будет не доступно. Установка рассмотрена на примере Fedora Linux

Установка осуществляется средствами штатного пакетного менеджера:

 dnf -y install openvswitch
 systemctl enable openvswitch.service
 systemctl start openvswitch.service

К сожалению данная конфигурация является экзотической и не может сосуществовать с NetworkManager, отключаем NetworkManager:

 systemctl disable NetworkManager
 systemctl stop NetworkManager
 systemctl enable network.service
 systemctl start network.service

При условии, что у нашего сервера один физический интерфейс enp0s31f6, базовая конфигурация Open vSwitch выглядит следующим образом:

 ovs-vsctl add-br ovs-br0
 ovs-vsctl add-port ovs-br0 enp0s31f6

Проверяем конфигурацию:

 ovs-vsctl show
5dd118bd-01e5-4f45-9a18-cc90edfc24bf
    Bridge "ovs-br0"
        Port "enp0s31f6"
            Interface "enp0s31f6"
        Port "ovs-br0"
            Interface "ovs-br0"
                type: internal
    ovs_version: "2.5.0"

Изменения в network-scripts не описываю сознательно, так как они достаточно тривиальны.

Настроить libvirt для работы с OvS можно только через редактирование конфигурационного XML виртуальной машины. В GUI такой возможности нет.

 virsh edit <vm>

Необходимо найти секцию конфигурации сетевого интерфейса, которая выглядит примерно так:

   <interface type='bridge'>
      <mac address='52:54:00:c3:5c:6c'/>
      <source bridge='bridge0'/>
      <model type='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
    </interface>

И скорректировать ее к примерно такому виду:

   <interface type='bridge'>
      <mac address='52:54:00:c3:5c:6c'/>
      <source bridge='ovs-br0'/>
      <virtualport type='openvswitch'/>
      <model type='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
    </interface>

После сохранения конфигурации автоматически будет добавлен параметр interfaceid:

 virsh dumpxml vm-puppet  | grep bridge -A3
    <interface type='bridge'>
      <mac address='52:54:00:c3:5c:6c'/>
      <source bridge='ovs-br0'/>
      <virtualport type='openvswitch'>
        <parameters interfaceid='145a28af-80da-4e01-acfb-cfabca568698'/>
      </virtualport>

И после запуска виртуальной машины можно наблюдать успешное добавление порта в конфигурацию OvS:

 ovs-vsctl show
5dd118bd-01e5-4f45-9a18-cc90edfc24bf
    Bridge "ovs-br0"
        Port "vnet0"
            Interface "vnet0"
        Port "enp0s31f6"
            Interface "enp0s31f6"
        Port "ovs-br0"
            Interface "ovs-br0"
                type: internal
    ovs_version: "2.5.0"