субота, 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 листопада 2015 р.

Електронна книга: Big Data Explained, Analysed, Solved

Популярно про Big Data від Canonical -- зареєструйтеся та отримайте електронну книгу, автором якої є системний аналітик компанії Canonical, відомої своїм продуктом Ubuntu Linux.

понеділок, 2 листопада 2015 р.

Vagrant: зручний інструмент розробника

Vagrant -- система для автоматизації роботи з віртуальними машинами. Дозволяє оперативно створювати нові віртуальні машини з потрібною конфігурацією та встановленим програмним забезпеченням. Особливо зручна для розробників застосувань та інженерів, які здійснюють моделювання систем. Можливе використання у колективній роботі.
Підтримує багато систем віртуалізації (провайдерів). Має підтримку Virtualbox в базовому комплекті. Підтримка інших провайдерів забезпечується встановленням додатків. Рекомендованим провайдером з точки зору надійності та продуктивності є VMWare.
Для налаштування віртуальних машин можуть використовуватися системи керування конфігураціями на кшталт Chef або Puppet, чи добірка шелл-скриптів.
Повний опис потрібного ПЗ та конфігурація віртуальної машини зберігається в файлі Vagrantfile. Використовуючи один Vagrantfile можна створювати довільну кількість ідентичних віртуальних машин.
Для початкового створення віртуальних машин використовується добірка заздалегідь підготовлених образів -- немає потреби щоразу встановлювати ОС з нуля. Базові образи можуть бути завантажені зі спеціальних репозиторіїв. Так само можливо використовувати свої власні базові образи.
Приклад репозиторію базових образів: https://atlas.hashicorp.com/boxes/search. Наявні образи Ubuntu, Debian, CentOS, CoreOS, Windows. Можливо завантажувати свої образи в публічні репозиторії.
Запуск та налаштування vagrant віртуальної машини забезпечується файлом Vagrantfile для цієї машини. Зокрема, в зазначеному файлі вказується базовий образ, який слід використовувати. Також можна вказати скрипт ініціалізації, в якому будуть встановлені потрібні пакети і запущені необхідні сервіси. Доступ ззовні до сервісів можливий, наприклад за допомогою перенаправлення портів (port forwarding).
Базова директорія для даної віртуальної машини синхронізується з директорією /home/vagrant/sync в файловій системі цієї машини, що дає можливість обмінюватися файлами з машиною.
Мережеві інтерфейси віртуальної машини можуть автоматично отримувати IP-адресу, або мати статичне налаштування. Топологічно вони можуть бути під’єднані через мостове з’єднання (bridge) до інтерфейсів батьківської машини або використовувати батьківську машину у якості NAT-шлюзу.
До створеної віртуальної машини можливо надати доступ з Інтернет. Доступ може здійснюватися за протоколами HTTP, SSH або іншими. Для надання доступа вкористовується обліковий запис на сайті HashiCorp's Atlas.
Активна віртуальна машина може бути поставлена на паузу зі збереженням стану на жорсткому диску (suspended), зупинена з виконанням процедур завершення роботи (halted) або знищена подібно до миттєвого відімкнення живлення (destroyed).

Джерело: