В Марте этого года было объявлено о доступности 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 LettievInstalled-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-архива по ссылке.
Дополнительны источники информации:
Добавить комментарий