Предисловие

В прошлой статье мы рассматривали начало работы с OpenVSwitch. Сегодня же пойдем дальше и объединим виртуальный коммутатор OpenVSwitch и гипервизор KVM. Начнем с того, что OpenVSwitch это программный коммутатор, дающий значительно большие возможности, по сравнению со стандартами инструментами, как, например, bridge-utils. OVS позволяет настроить политики для каждого интерфейса, поддерживает мониторинг трафика, GRE туннели и VLAN’ы. Чтобы еще раз подтвердить превосходство OVS над обычными Linux bridge (сетевыми мостами), приведу простое сравнение:

Linux bridge:

  • Изначально не предназначен для виртуальных сетей
  • Работает как простое L2 устройство
  • Масштабирование ограничено
  • Использует простое перенаправление пакетов
  • Не подходит для создания облачной инфраструктуры
  • Не поддерживает тунелирование

OpenVSwitch:

  • Разработан специально для создания виртуальных и облачных сетей
  • Полная поддержка возможностей L2-L4
  • Работает в пользовательском пространстве
  • ACLs,QoS и бондинга
  • Возможность управления используя OpenFlow
  • Поддержка sFlow и Netflow

OpenVSwitch позволяет не просто создать виртуальный интерфейс для гостевых машин KVM — он дает возможность выстроить виртуальную сеть любых масштабов с огромной инфраструктурой. Очень часто OVS используют VDS провайдеры, предоставляющие услуги аренды качественных выделенных серверов с высокой доступностью и отказоустойчивостью в 99,9% . А еще и по низким ценам. Очень рекомендую перейти по этой ссылке и лично ознакомиться с тарифами одного из таких провайдеров.
Итак, в преимуществах разобрались, пора переходить к настройке.

Создаем простую сеть с OVS

Для создания сети сначала создадим новый виртуальный коммутатор OpenVSwitch:

sudo ovs-vsctl add-br kvmnetwork

Добавим к коммутатору реальный сетевой интерфейс:

sudo ovs-vsctl add-port kvmnetwork eth0

Теперь создадим виртуальный сетевой интерфейс, который будем пробрасывать в виртуальную машину:

sudo ovs-vsctl add-port kvmnetwork virtnet0 -- set interface virtnet0 type=internal

Важный момент. На момент написания статьи не было возможности пробросить виртуальный интерфейс OpenVSwitch в виртуальную машину при ее создании, если для этого использовался virt-install. Однако есть два обходных варианта. Во-первых, если вы для создания виртуальных машин используете virt-install, то рекомендую создать виртуальную машину с ключом —nonetworks. А уже после создания виртуальной машины отредактировать конфигурацию и перезагрузить гостя. Во-вторых, и что более предпочтительно, создать виртуальную машину из файла конфигурации .xml, куда без проблем можно включить конфигурацию OpenVSwitch.

Описанные выше методы применяются только в том случае, если необходим именно проброс виртуального интерфейса в гостевую машину. Если же для вывода гостей в интернет создается отдельная сеть (virsh net-define), то с этими проблемами вы не столкнетесь.

Отредактируем конфигурацию виртуальной машины,

virsh edit *имя виртуальной машины*

и добавим в нее конфигурацию сетевого интерфейса:

<interface type='bridge'>
 <source bridge='kvmnetwork'/>
<virtualport type='openvswitch'>
</virtualport>
<model type='e1000'/>
  </interface>

Тем самым мы пробросили виртуальный интерфейс OpenVSwitch в гостевую машину. Но есть одна проблема. Если выполнить:

ovs-vsctl show

То рядом с созданным нами ранее интерфейсом появился непонятный vnet0. Именно этот интерфейс привязался к виртуальной машине. И причем имя интерфейса может вообще поменяться, если интерфейсов несколько, а виртуальные машины по какой-то причине загрузились не в том порядке, в котором создавались.

Подобное поведение обосновано тем, что мы не указали KVM явно, какой интерфейс хотим использовать. Если этого не сделать, то мы не сможем использовать функционал OpenVSwitch в полной мере, так как не сможем создать правила для сетевых интерфейсов. Чтобы исправить подобное недоразумение, еще раз откроем конфигурацию гостевой машины и приведем ее к следующему виду:

<interface type='bridge'>
  <source bridge='kvmnetwork'/>
        <virtualport type='openvswitch'>
        </virtualport>
        <target dev= virtnet0'/>
        <model type='e1000'/>
      </interface>

На это раз мы добавим только одну строку “target dev”, в которой укажем имя интерфейса, созданного ранее.

Осталось только перезагрузить виртуальную машину и настроить внутри нее сетевой интерфейс.

Еще одно замечание. Все имена интерфейсов в этой статье взяты “из головы”. Это не значит, что примеры выше не будут из-за этого работать, но я настоятельно рекомендую использовать осмысленные имена как для создаваемых виртуальных коммутаторов, так и для виртуальных сетевых интерфейсов. Если этого не делать, то вы сами лишаете себя огромного удобства от использования OVS и обрекаете себя на боль и страдания, когда в будущем будете разбираться какой из интерфейсов к какой виртуальной машине привязан.

Добавление VLAN для гостей KVM

Для того, чтобы иметь возможность работать с VLAN’ами, сначала необходимо создать виртуальный коммутатор как в примере выше, после чего добавить теги на транк и виртуальные интерфейсы.

sudo ovs-vsctl add-br kvmvlannetwork
sudo ovs-vsctl add-port kvmvlannetwork eth0
sudo ovs-vsctl set port eth0 trunks=10,20,300,400,1000
sudo ovs-vsctl add-port kvmvlannetwork guest_vlan20 tag=20 -- set interface guest_vlan20 type=internal

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

<interface type='bridge'>
  <source bridge='kvmvlannetwork'/>
 <vlan>
<tag id='20'/>
  </vlan>
  <virtualport type='openvswitch'>
  </virtualport>
  <target dev='guest_vlan20'/>
  <model type='e1000'/>
</interface>

Из изменений здесь только новая секция vlan, в которой указа тег VLAN’а.

Заключение

В этой и предыдущей статье мы рассмотрели начало работы с OpenVSwitch и его интеграцию с гипервизором KVM. В следующей статье мы разберем настройку QoS для виртуальных интерфейсов OVS, а также шейпинг трафика.