Высоко-доступный балансировщик ZEVENET Load Balancer Community Edition 3.10.1 на базе виртуальных машин oVirt c 64-битной ОС Debian GNU/Linux 8.6

В Марте этого года было объявлено о доступности Zen Load Balancer Community Edition 3.10, где была добавлена поддержка Debian Jessie, удалена поддержка профилей GSLB и TCP (вместо этого предлагается использовать L4xNAT), исправлены некоторые ошибки. Полный список изменений можно посмотреть в Changelog. Однако не узрев для себя существенных изменений, мы решили не связываться с обновлением ранее описанного форка ZenLB, адаптированного под 64-битную OC Ubuntu Server 14.04.

В Ноябре разработчики ZenLB объявили о доступности репозитория на GitHub, где появилась информация о новом имени ZenLB — ZEVENET Load Balancer Community Edition (будем называть его ZLB для краткости). Здесь по старой «доброй» традиции друзья из Sofintel выложили исходные коды основного пакета ZLB с hard-coded зависимостями от сторонних 32-битных приложений и библиотек, которые в бинарном виде заботливо собраны и бережливо уложены чуткими разработчиками в подкаталоге /app.  И так получилось, что как раз примерно в это время назрела задача переноса всех виртуальных машин на базе Linux в среду виртуализации под управлением oVirt. А параллельно с переносом Linux систем в другую среду виртуализации, я задумал перебраться с Ubuntu на Debian, там где это возможно.

Как и в прошлый раз, я обратился за помощью к своему коллеге Владимиру Леттиеву, который любезно согласился адаптировать имеющиеся исходники ZLB под 64-битную Debian GNU/Linux 8.6 с последующей сборкой собственных deb-пакетов.

В конечном итоге было собрано четыре пакета:

  • zenloadbalancer_3.10.1-2_all.deb
  • mini-httpd_1.23-1.1_amd64.deb
  • libnet-ssh-expect-perl_1.09-1_all.deb
  • libgd-3dbargrapher-perl_0.9.6-1_all.deb

Остальные пакеты, требуемые для ZLB, могут быть подтянуты из официальных репозиториев Debian в ходе установки перечисленных четырёх пакетов.

Собранные deb-пакеты для удобства последующего развёртывания были размещены на локальном apt-репозитории, который, кстати говоря, к этому времени я уже тоже успел перенести на ВМ oVirt с Debian GNU/Linux.

# reprepro -b /srv/reprepro/debian -C main includedeb jessie ~/ZLB/*.deb

 

Подготовка виртуальных машин oVirt

В прошлый раз для развёртывания ZenLB я использовал виртуальные машины Hyper-V, в этот раз развёртывание проводилось на виртуальных машинах под управлением oVirt. И как мы помним, для сетевого интерфейса виртуальных машин обязательно нужно включить опцию разрешающую спуфинг MAC-адресов, в противном случае ZLB не будет работать корректно. В oVirt для того, чтобы разрешить спуфинг, необходимо создать отдельный профиль виртуального сетевого интерфейса vNIC в свойствах виртуальной сети. В конфигурации по умолчанию в профиле vNIC задействован сетевой фильтр (Network Filter) — vdsm-no-mac-spoofing.

Поэтому, специально для виртуальных машин ZLB нам потребуется создать дополнительный профиль vNIC, в котором никаких фильтров использоваться не будет:

После создания профиля vNIC, нужно выполнить его привязку к виртуальной машине, на которой будет работать ZLB, то есть к тому виртуальному интерфейсу ВМ, который будет членом кластера ZLB.

Для вступления изменений свойств виртуального сетевого адаптера в силу, потребуется выполнить перезагрузку гостевой ОС.

На виртуальные машины в самой простой конфигурации с одним виртуальным диском в 30GB, двумя vCPU и 2GB ОЗУ, была установлена 64-битная версия ОС Debian GNU/Linux 8.6.

 

Установка ZEVENET Load Balancer

Процедура установки пакетов ZLB будет идентична для обоих виртуальных серверов. Обратите внимание на то, что ZLB в процессе установки и последующей настройки бесцеремонно  модифицирует некоторые системные файлы, например вычищает всё содержимое файла /etc/network/interfaces. Поэтому крайне не рекомендуется разворачивать ZLB на уже работающей продуктивной системе с какими-либо сетевыми сервисами, а выделять под эту задачу отдельные системы.

На обоих наших виртуальных серверах выполним команду добавления локального репозитория с пакетами для установки ZLB:

# echo "deb http://kom-apt-repo.holding.com/debian/ jessie main" > /etc/apt/sources.list.d/KOM-APT-REPO.holding.com.list

Обновим кэш apt и посмотрим какая информация нам доступна о пакете zenloadbalancer из локального apt-репозитория

# apt-cache show zenloadbalancer

Package: zenloadbalancer
Version: 3.10.1-2
Architecture: all
Maintainer: Vladimir Lettiev 
Installed-Size: 2123
Depends: mini-httpd, gdnsd, pen, pound, nagios-plugins-basic, ucarp, rrdtool, libnet-netmask-perl, libnet-ssh-perl, libexpect-perl, expect, libnet-ssh-expect-perl, libproc-daemon-perl, libnetwork-ipv4addr-perl, librrds-perl, libio-interface-perl, libgd-3dbargrapher-perl, libfile-grep-perl, libdata-validate-ip-perl, libpcap0.8, ntpdate, liblinux-inotify2-perl, iputils-arping, openssl, netstat-nat, libev4, snmpd, conntrack, rsync
Homepage: https://github.com/zevenet/zlb
Priority: optional
Section: net
Filename: pool/main/z/zenloadbalancer/zenloadbalancer_3.10.1-2_all.deb
Size: 673952
SHA256: 7fe33875541e399fb6e2cd0f570a1a608f345e9a2c10008a571ab44d0312293f
SHA1: 5bf9f208e419ed9ab3e67039aee273b20bbff0c9
MD5sum: be6ee5816fbbed204c135b9540dc0b50
Description: Multilayered load balancer with web GUI
ZEVENET Load Balancer is a multilayered and high performance load balancer whith an easy configuration, usability and user-friendly web GUI.
Description-md5: 68481f44d75838ee9197516b43081551

Устанавливаем:

# apt-get install zenloadbalancer

В ходе установки мы получим запрос об установке ряда новых пакетов, а затем предупреждение о том, что пакеты не могут быть аутентифицированы, так ка не имеют цифровой подписи. Соглашаемся с их установкой.

...
0 upgraded, 95 newly installed, 0 to remove and 0 not upgraded.
Need to get 25.1 MB/25.2 MB of archives.
After this operation, 82.2 MB of additional disk space will be used.
Do you want to continue? [Y/n] Y
WARNING: The following packages cannot be authenticated!
  libgd-3dbargrapher-perl libnet-ssh-expect-perl mini-httpd zenloadbalancer
Install these packages without verification? [y/N] Y
Get:1 http://kom-apt-repo.holding.com/debian/ jessie/main libgd-3dbargrapher-perl all 0.9.6-1 [12.4 kB]
Get:2 http://kom-apt-repo.holding.com/debian/ jessie/main libnet-ssh-expect-perl all 1.09-1 [26.4 kB]
Get:3 http://kom-apt-repo.holding.com/debian/ jessie/main mini-httpd amd64 1.23-1.1 [39.5 kB]
Get:4 http://kom-apt-repo.holding.com/debian/ jessie/main zenloadbalancer all 3.10.1-2 [674 kB]
...

Проверим, что создался TCP-прослушиватель для 444 порта веб-сервера, через который мы будем управлять ZLB:

# ss -lnptu | grep 444

tcp    LISTEN     0      1024           :::444        :::*      users:(("mini-httpd",937,5))

Добавим в iptables правило, разрешающее подключаться на соответствующий TCP порт для доступа к веб-консоли управления ZLB:

# iptables -A INPUT -i eth0 -p tcp --dport 444 -m comment --comment "ZLB Web UI" -j ACCEPT
# iptables-save > /etc/iptables.conf

Попробуем открыть в браузере ссылку https://{имя сервера ZLB}:444, и при получении запроса аутентификации, указываем учётные данные по умолчанию – пользователь admin, пароль admin.

Если веб-интерфейс доступен, перезагрузим сервер и убедимся в том, что ZLB успешно автоматически стартует при запуске системы.

 

Послеустановочная настройка ZEVENET Load Balancer

Вся последующая настройка ZLB, в том числе процедуры создания кластера и ферм балансировки принципиально не отличаются от ранее описанных примеров. Дополнительно хочется сделать только одно небольшое замечание. Если вы разворачиваете новый кластер ZLB, и при этом в этом же сегменте сети у вас используются другой ранее развёрнутый кластер, например предыдущей версии ZenLB, то в процессе создания нового кластера нужно указывать уникальный идентификатор Cluster ID, который не пересекается с идентификаторами других действующих кластеров

Если не соблюсти это условие, то при сборке кластера могут возникнуть проблемы.

 

ZEVENET Load Balancer и iptables

Дополнительно к материалам прошлой статьи можно добавить информацию про настройку iptables, так как в прошлый раз этому совсем не уделялось внимания.

Перед тем, как собирать кластер ZLB, необходимо снять ограничения на сетевой обмен для будущих участников кластера. Для этого можно полезть в дебри и изучить весь меж-узловой обмен, чтобы настроить точные правила iptables. А можно пойти по пути наименьшего сопротивления и полностью открыть доступ будущих узлов кластера друг к другу. Например, на первом сервере ZLB добавим правило разрешающее весь входящий трафик со второго сервера ZLB:

# iptables -A INPUT -s 10.1.0.202/32 -m comment --comment "ZLB Cluster Node KOM-AD01-NLB32" -j ACCEPT
# iptables-save > /etc/iptables.conf

Ну и соответственно на втором сервере ZLB разрешаем весь входящий трафик с первого узла ZLB:

# iptables -A INPUT -s 10.1.0.201/32 -m comment --comment "ZLB Cluster Node KOM-AD01-NLB31" -j ACCEPT
# iptables-save > /etc/iptables.conf

***

Вообще ZLB так устроен, что самостоятельно хозяйничает в таблицах iptables «nat» и «mangle«, добавляя туда нужные правила. Однако, в случае, если в iptables используется блокировка всего явно не разрешённого правилами трафика (политика по умолчанию «DROP» для цепочек INPUT и FORWARD), то для того, чтобы разрешить трафик от фронт-энда к бак-энду ферм балансировки ZLB, в общих правилах iptables нам потребуется самостоятельно добавлять нужные правила в цепочку FORWARD (для ферм балансировки «L4xNAT«) и INPUT (для ферм балансировки «HTTP«).

Например, если в ZLB мы создаём ферму балансировки с типом «L4xNAT«, где в фронт-энде выступает порт TCP 25, то на обоих узлах балансировщика нам потребуется добавить пару соответствующих правил для каждого бак-энд сервера, чтобы разрешить проброс трафика:

# iptables -A FORWARD -s 10.0.0.0/8 -d 10.1.0.29/32 -i eth0 -p tcp -m tcp --dport 25 -m state --state NEW,ESTABLISHED -m comment --comment "ZLB L4xNAT Farm - Internal-SMTP - BackEnd 1" -j ACCEPT
# iptables -A FORWARD -s 10.1.0.29/32 -d 10.0.0.0/8 -i eth0 -p tcp -m tcp --sport 25 -m state --state ESTABLISHED -m comment --comment "ZLB L4xNAT Farm - Internal-SMTP - BackEnd 1" -j ACCEPT

# iptables -A FORWARD -s 10.0.0.0/8 -d 10.2.0.22/32 -i eth0 -p tcp -m tcp --dport 25 -m state --state NEW,ESTABLISHED -m comment --comment "ZLB L4xNAT Farm - Internal-SMTP - BackEnd 2" -j ACCEPT
# iptables -A FORWARD -s 10.2.0.22/32 -d 10.0.0.0/8 -i eth0 -p tcp -m tcp --sport 25 -m state --state ESTABLISHED -m comment --comment "ZLB L4xNAT Farm - Internal-SMTP - BackEnd 2" -j ACCEPT

# iptables-save > /etc/iptables.conf

В этом примере клиентские запросы на балансировщик приходят из клиентской сети 10.0.0.0/8 на фронт-энд адрес фермы балансировки 10.1.0.16:25 (он не фигурирует в правилах), а оттуда в свою очередь перенаправляются на 2 бак-энд сервера (10.1.0.29:25 и 10.2.0.22:25).

Другой пример — когда в ZLB мы создаём ферму балансировки с типом «HTTP«, где в фронт-энде выступает, например, порт TCP 443 (HTTP). В этом случае на обоих узлах балансировщика нам потребуется добавить правило, разрешающее входящий трафик на этот порт (правила форвардинга в этом случае уже не нужны):

# iptables -A INPUT -s 10.0.0.0/8 -d 10.1.0.15/32 -i eth0 -p tcp -m tcp --dport 443 -m comment --comment "ZLB HTTP Farm - MyWebService" -j ACCEPT
# iptables-save > /etc/iptables.conf

В этом примере клиентские запросы на балансировщик приходят из сети 10.0.0.0/8 на фронт-энд адрес фермы балансировки 10.1.0.15:443

 

Где взять?

Ссылки на оригинальные исходные тексты ZEVENET Load Balancer Community Edition приведены в начале этой заметки.

Исходные коды форка Zenloadbalancer 3.10.1 for Debian Jessie можно найти на GitHub

Скомпилированный deb-пакет ZLB с зависимостями, которых нет в официальных apt-репозиториях можно загрузить в виде zip-архива по ссылке.

 

Дополнительны источники информации:

Добавить комментарий