В прошлой статье мы рассматривали начало работы с OpenVSwitch. Сегодня же пойдем дальше и объединим виртуальный коммутатор OpenVSwitch и гипервизор KVM. Начнем с того, что OpenVSwitch это программный коммутатор, дающий значительно большие возможности, по сравнению со стандартами инструментами, как, например, bridge-utils. OVS позволяет настроить политики для каждого интерфейса, поддерживает мониторинг трафика, GRE туннели и VLAN’ы. Чтобы еще раз подтвердить превосходство OVS над обычными Linux bridge (сетевыми мостами), приведу простое сравнение:
Linux bridge:
OpenVSwitch:
OpenVSwitch позволяет не просто создать виртуальный интерфейс для гостевых машин KVM — он дает возможность выстроить виртуальную сеть любых масштабов с огромной инфраструктурой.
Итак, в преимуществах разобрались, пора переходить к настройке.
Для создания сети сначала создадим новый виртуальный коммутатор 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>
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’ами, сначала необходимо создать виртуальный коммутатор как в примере выше, после чего добавить теги на транк и виртуальные интерфейсы.
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, а также шейпинг трафика.
Мы используем файлы cookie, чтобы улучшить работу сайта, обеспечить его функциональность и собирать аналитику. Продолжая использовать сайт, вы подтверждаете свое согласие на использование файлов cookie, а также принимаете условия нашей Политики в отношении обработки персональных данных и даете Согласие на обработку персональных данных.