Предисловие
В прошлой статье мы рассматривали начало работы с 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, а также шейпинг трафика.