Open vSwitch часть №6. Организовываем виртуальные сети (VLAN)

Open vSwitch — все статьи

Это пожалуй одна из самых актуальных функций коммутатора, как физического, так и виртуального. Я думаю, что объяснять их функциональное предназначение будет лишним, поэтому просто покажу как это реализуется в Open vSwitch.
В скудной документации это предложено делать следующим способом:
Берется конкретный, уже существующий порт и ему, путем внесения изменений в базу, присваивается тег (tag) с номером желаемого VLAN-а (VLAN ID)

# ovs-vsctl set port <имя_порта> tag=10

Все вроде бы просто и логично. Но, у этого способа есть как минимум три серьезных проблемы, делающие его фактически неприменимым.
Во-первых, необходимо знать какие порты принадлежат ВМ. Какого-то  штатного способа сделать это я не нашел. Во-вторых, после выключения ВМ, ее порт и соответствующие ему настройки автоматически удаляются. И в третьих, даже если мы создадим для каждой ВМ статический порт и присвоим нужные теги, способа подключить ВМ к существующему порту при использовании KVM и libvirt, нет.

По большему счету, это проблема libvirt. Судя по списку изменений [1], до версии 0.10.0 он не умел работать с VLAN’ами. Точнее, он мог автоматически создавать интерфейсы при запуске ВМ, но не позволял помещать их в нужные VLAN’ы, тогда как,  например, XenServer, тесно интегрированный с OVS, позволяет указать номер VLAN при настройке сетевого интерфейса ВМ. В дистрибутивах с долгосрочной поддержкой версия libvirt отстает (например, Ubuntu 12.04 LTS это 0.9.8), так что  приходится использовать другой путь.
Мы можем включить в нужный VLAN не отдельный порт а целый коммутатор целиком. По умолчанию коммутатор создается в VLAN-е 0.  Наш главный, родительский(ovs-sw0) мы так и оставим. А вот несколько других, дочерних, мы создадим в нужных нам VLAN-ах и подключим их к главному как порты.
Синтаксис:

# ovs-vsctl add-br <новый_дочерний_мост> <родительский_мост> <VLAN ID>
# ovs-vsctl add-br sw0-vlan10 ovs-sw0 10

Данная команда создает виртуальный коммутатор sw0-vlan10, подключает к основному как порт и помещает его в VLAN с номером 10.
Таким путем, можно создать сколько угодно VLAN-ов. А чтоб поместить ВМ в нужный VLAN, необходимо вместо общего устройства ovs-sw0 указать например sw0-vlan10.
Теперь, команда ovs-vsctl show дополнительно будет показывать теги каждого порта, определяя тем самым его принадлежность к VLAN.

Посмотреть в каком VLAN-е находится конкретный коммутатор:

# ovs-vsctl br-to-vlan <имя_коммутатора>

Посмотреть имя родительского коммутатора:

# ovs-vsctl br-to-parent <имя_коммутатора>

Ссылки

[1]  Лог внесенных изменений в  версиях Libvirt — http://libvirt.org/news.html