субота, 28 листопада 2015 р.

OpenVSwitch в системі CentOS7: базові налаштування

Вступ

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"
        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
...
    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  ]

Джерела

3 коментарі:

  1. Спасибо очень статья помогла ))
    Вот бы еще настроить так роутинг чтоб он не пересекался с остальными VLAN -- так как Openvswitch настрен в forwardinge- и все машины друг друга видят ( даже если с разных VLAN), а ведь во внутрь виртуалок надо подать ведь еще и Интернет ))

    ВідповістиВидалити
  2. Богдане, за задумом Openvswitch налаштовується таким чином, щоб бути повністю інтегрованим з зовнішніми VLAN на "реальних" комутаторах. Мені не зрозуміло, як машини можуть бачити одна одну з різних VLAN, так не повинно бути. Щодо маршрутизації, можливим рішенням є використання маршрутизатора у вигляді однієї з віртуальних машин, до якої підведено всі VLAN. У якості такого маршрутизатора можу запропонувати VyOS (http://vyos.net).

    ВідповістиВидалити