На сегодняшний день 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"