Вступ
OpenVSwitch (OVS) -- це програмне забезпечення з відкритим кодом, яке призначене для створення у системах з віртуалізацією компонента, еквівалентного за функціональністю керованому Ethernet-комутатору. Наразі OVS використовується здебільшого в системах Linux з усіма найпоширенішими гіпервізорами для віртуалізації -- KVM, VirtualBox, Xen.OVS типово встановлюється на фізичному сервері-носії, що використовується для запуску віртуальних машин, та є альтернативою для використання мостів Linux (Linux bridges), маючи значно ширшу функціональність. OVS також є вдалою альтернативою комерційним продуктам на зразок віртуального комутатора Cisco Nexus 1000V.
В даній статті розглядаються базові дії зі встановлення та налаштування OVS в системі CentOS7, що є вільно поширюваним аналогом комерційної системи RHEL7. У якості гіпервізора для віртуалізації використовується KVM та інструментальний пакет libvirt.
Встановлення
Встановити пакунки, необхідні для збірки
# yum install gcc libatomic install make python-devel \
openssl-devel kernel-devel graphviz kernel-debug-devel \
autoconf automake rpm-build redhat-rpm-config libtool
Завантажити архів з кодом пакунку в домашню теку та разархівувати його:
# cd
# wget http://openvswitch.org/releases/openvswitch-2.4.0.tar.gz
# tar xzvf openvswitch-2.4.0.tar.gz
Покласти копію архіва з кодом в теку /root/rpmbuild/SOURCES:
# mkdir -p /root/rpmbuild/SOURCES
# cp openvswitch-2.4.0.tar.gz /root/rpmbuild/SOURCES
Запустити процес збірки:
# cd openvswitch-2.4.0
# rpmbuild -bb rhel/openvswitch.spec
Встановити RPM-пакунок, який був створений внаслідок збірки:
# yum localinstall /root/rpmbuild/RPMS/x86_64/openvswitch-2.4.0-1.x86_64.rpm
Скопіювати скрипти керування сервісами в належні місця та налаштувати автоматичний запуск сервісу:
# cp rhel/usr_lib_systemd_system_openvswitch-nonetwork.service \
/usr/lib/systemd/system/openvswitch-nonetwork.service
# cp rhel/usr_lib_systemd_system_openvswitch.service \
/usr/lib/systemd/system/openvswitch.service
# systemctl enable openvswitch.service
Примітка: для того щоб уникнути проблем з запуском сервісу потрібно відімкнути SELinux.
OVS зберігає свою конфігурацію у власній базі даних, що знаходиться у теці /etc/openvswitch. Щойно встановлений OVS створює пусту базу даних:
# ovs-vsctl show
4a2b3832-7f57-43c8-9e56-b80974d4ea40
ovs_version: "2.4.0"
Створення базового моста
Застосування OVS здійснюється шляхом створення мостів, які можна порівняти з типовим Ethernet-комутатором -- до нього під’єднуються інтерфейси, налаштовуються 802.1Q VLAN, виконуються процеси Spaning-Tree Protocol (STP), тощо. За звичай на сервері-носії достатньо створити єдиний OVS-міст:
# ovs-vsctl add-br ovsbridge0
# ip link set ovsbridge0 up
# ip addr show ovsbridge0
5: ovsbridge0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN
link/ether 96:34:45:9c:6e:4e brd ff:ff:ff:ff:ff:ff
inet6 fe80::9434:45ff:fe9c:6e4e/64 scope link
valid_lft forever preferred_lft forever
# ovs-vsctl show
...
Bridge "ovsbridge0"
Bridge "ovsbridge0"
Port "ovsbridge0"
Interface "ovsbridge0"
type: internal
...
Для коректного поводження системи з мостом ovsbridge0 під час перевантажень системи та перезапусків мережевого сервісу необхідно створення файлу /etc/sysconfig/network-scripts/ifcfg-ovsbridge0 з наступним вмістом:
DEVICE=ovsbridge0
ONBOOT=yes
DEVICETYPE=ovs
TYPE=OVSBridge
BOOTPROTO=static
Під’єднання до OVS-моста фізичних інтерфейсів сервера
Для зв’язку з зовнішньою мережею до OVS-моста потрібно під’єднати фізичні інтерфейси сервера-носія. Гарною практикою є виділення одного фізичного інтерфейсу сервера, який не під’єднується до OVS-моста і слугує виключно для доступу до системи носія (батьківської). В результаті у разі можливих помилок з налаштуванням OVS не буде втрачено зв’язок з батьківською системою.
Під’єднання до OVS-моста фізичного інтерфейсу:
# ovs-vsctl add-port ovsbridge0 enp0s3
# ip link set enp0s3 up
# ovs-vsctl show
Під’єднання до OVS-моста фізичного інтерфейсу:
# ovs-vsctl add-port ovsbridge0 enp0s3
# ip link set enp0s3 up
# ovs-vsctl show
...
Bridge "ovsbridge0"
Port "ovsbridge0"
Interface "ovsbridge0"
type: internal
Port "enp0s3"
Interface "enp0s3"
...
Bridge "ovsbridge0"
Port "ovsbridge0"
Interface "ovsbridge0"
type: internal
Port "enp0s3"
Interface "enp0s3"
...
# ip addr show enp0s3
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master ovs-system state UP qlen 1000
link/ether 08:00:27:5e:db:ba brd ff:ff:ff:ff:ff:ff
Для збереження налаштувань під час перезавантажень сервера та перезапусків мережевого сервісу необхідно створити файл /etc/sysconfig/network-scripts/ifcfg-enp0s3 з наступним вмістом:
NAME=enp0s3
DEVICE=enp0s3
ONBOOT=yes
DEVICETYPE=ovs
TYPE=OVSPort
OVS_BRIDGE=ovsbridge0
BOOTPROTO=none
HWADDR=08:00:27:5e:db:ba
Примітка: якщо ви знехтували порадою про окремий інтерфейс для керування носієм, або на сервері взагалі лише один фізичний інтерфейс, налаштування IP-адреси необхідно перенести з фізичного інтерфейсу на інтерфейс мосту:
# ip addr del 192.168.1.128/24 dev enp0s3
# ip addr add 192.168.1.128/24 dev ovsbridge0
# ip route add default via 192.168.1.1
Відповідно з файлу /etc/sysconfig/network-scripts/ifcfg-enp0s3 до файлу /etc/sysconfig/network-scripts/ifcfg-ovsbridge0 необхідно перенести наступні рядки (чи подібні):
IPADDR=192.168.1.128
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
Зрозуміло, що останні дії виконуються з фізичної консолі носія, оскільки зв’язок з ним через мережу тимчасово буде втрачено.
Під’єднання до OVS інтерфейсів віртуальних машин
У якості посередника між OVS та інтерфейсами віртуальних машин використовуються віртуальні мережі. Для створення вітуальної мережі, пов’язаної з інтерфейсом ovsbridge0, необхідно підготувати, наприклад в своїй домашій теці, XML-файл з іменем, наприклад, mgmt.xml, з наступним вмістом:
<network>
<name>mgmt</name>
<forward mode='bridge'/>
<bridge name='ovsbridge0' />
<virtualport type='openvswitch'/>
</network>
Використовуючи зазначений XML-файл створюється віртуальна мережа mgmt:
# virsh net-define mgmt.xml
# virsh net-start mgmt
# virsh net-autostart mgmt
# virsh net-list
Name State Autostart Persistent
----------------------------------------------------------
mgmt active yes yes
До створеної мережі може бути під’єднано інтерфейс віртуальної машини:
# virsh list --all
Id Name State
----------------------------------------------------
- vhost shut off
# virsh domiflist vhost
Interface Type Source Model MAC
-------------------------------------------------------
# virsh attach-interface vhost network mgmt --model virtio --config
Interface attached successfully
# virsh domiflist vhost
Interface Type Source Model MAC
-------------------------------------------------------
- network mgmt virtio 52:54:00:7a:02:61
# virsh start vhost
Domain vhost started
# virsh domiflist vhost
Interface Type Source Model MAC
-------------------------------------------------------
vnet0 bridge mgmt virtio 52:54:00:7a:02:61
# ip addr show vnet4
8: vnet0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master ovs-system state UNKNOWN qlen 500
link/ether fe:54:00:7a:02:61 brd ff:ff:ff:ff:ff:ff
inet6 fe80::fc54:ff:fe7a:261/64 scope link
valid_lft forever preferred_lft forever
# ovs-vsctl show
...Bridge "ovsbridge0"
Port "ovsbridge0"
Interface "ovsbridge0"
type: internal
...
Port "vnet0"
Interface "vnet0"
...
Примітка: інтерфейс було додано до віртуальної машини, яка знаходилася у вимкненому стані. Після старту віртуальний інтерфейс автоматично з’являється серед пристроїв цієї віртуальної машини.
Використання 802.1Q VLAN
Можливим є використання сервера-носія з віртуальними машинами у мережі, в якій налаштовано віртуальні локальні мережі (VLAN). Наприклад, може виникнути потреба під’єднання інтерфейсів різних віртуальних машин до різних VLAN. В цьому випадку фізичний інтерфейс носія під’єднується до транкового порту зовнішнього комутатора, через який передаються фрейми різних VLAN з відповідними тегами. Розглянемо, як під’єднати до VLAN інтерфейс віртуальної машини.
На OVS-мості створюється підпорядкований псевдо-міст (fake bridge), що пов’язується з потрібною VLAN (в даному випадку VLAN104):
# ovs-vsctl add-br ovsvlan104 ovsbridge0 104
# ip link set ovsvlan104 up
# ovs-vsctl show
Bridge "ovsbridge0"
...
Port "ovsvlan104"
tag: 104
Interface "ovsvlan104"
type: internal
...
# ip addr show ovsvlan104
10: ovsvlan104: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN
link/ether 06:a2:0f:cf:0d:47 brd ff:ff:ff:ff:ff:ff
inet6 fe80::4a2:fff:fecf:d47/64 scope link
valid_lft forever preferred_lft forever
Для збереження налаштувань під час перезавантажень сервера та перезапусків мережевого сервісу необхідно створити файл /etc/sysconfig/network-scripts/ifcfg-ovsvlan104 з наступним вмістом:
DEVICE=ovsvlan104
ONBOOT=yes
DEVICETYPE=ovs
TYPE=OVSBridge
BOOTPROTO=static
OVS_OPTIONS="ovsbridge0 104"
Для створення вітуальної мережі, пов’язаної з VLAN104, підготувати XML-файл vlan104.xml з наступним вмістом:
<network>
<name>vlan104</name>
<forward mode='bridge'/>
<bridge name='ovsvlan104' />
<virtualport type='openvswitch'/>
</network>
Створити віртуальну мережу vlan104:
# virsh net-define vlan104.xml
# virsh net-start vlan104
# virsh net-autostart vlan104
# virsh net-list
Name State Autostart Persistent
----------------------------------------------------------
mgmt active yes yes
vlan104 active yes yes
Для під’єднання до нової віртуальної мережі створимо новий інтерфейс віртуальної машини, яка вже знаходиться в активному стані.
# virsh list
Id Name State
----------------------------------------------------
1 vhost running
# virsh attach-interface vhost network vlan104 --model virtio --live
Interface attached successfully
# virsh attach-interface vhost network vlan104 --model virtio --config
Interface attached successfully
# virsh domiflist vhost
Interface Type Source Model MAC
-------------------------------------------------------
vnet0 bridge mgmt virtio 52:54:00:7a:02:61
vnet1 bridge vlan104 virtio 52:54:00:c6:60:1c
# ovs-vsctl show
...
Bridge "ovsbridge0"
...
Port "ovsvlan104"
tag: 104
Interface "ovsvlan104"
type: internal
Port "vnet1"
tag: 104
Interface "vnet1"
...
Налаштування та використання нового інтерфейсу, який щойно з’явився в віртуальній машині vhost може здійснюватися відразу без перезавантаження машини.
Корисні поради
Під час відлагодження конфігурації мережі замість команди systemctl restart network, яка дає вкрай обмежену інформацію про результат виконання, зручно користуватися командою:
# SYSTEMCTL_SKIP_REDIRECT=1 service network restart
Shutting down interface enp0s3: [ OK ]
Shutting down interface ovsbridge0: [ OK ]
Shutting down loopback interface: [ OK ]
Bringing up loopback interface: [ OK ]
Bringing up interface enp0s3: [ OK ]
Bringing up interface ovsbridge0: [ OK ]
Спасибо очень статья помогла ))
ВідповістиВидалитиВот бы еще настроить так роутинг чтоб он не пересекался с остальными VLAN -- так как Openvswitch настрен в forwardinge- и все машины друг друга видят ( даже если с разных VLAN), а ведь во внутрь виртуалок надо подать ведь еще и Интернет ))
наверное надо править Firewalld )
ВідповістиВидалитиБогдане, за задумом Openvswitch налаштовується таким чином, щоб бути повністю інтегрованим з зовнішніми VLAN на "реальних" комутаторах. Мені не зрозуміло, як машини можуть бачити одна одну з різних VLAN, так не повинно бути. Щодо маршрутизації, можливим рішенням є використання маршрутизатора у вигляді однієї з віртуальних машин, до якої підведено всі VLAN. У якості такого маршрутизатора можу запропонувати VyOS (http://vyos.net).
ВідповістиВидалити