О чем вообще речь
Keepalived — это сервис, предназначенный для обеспечения безаварийной работы других служб. Нужно понимать, что это не самодостаточная сущность, и для предоставления доступа к «целевому» контенту необходим также или сервис-балансировщик. Далее в этой статье я покажу, как настроить связку «keepalived + HAProxy + webserver» на Ubuntu 20.04 LTS.
Подготовка
Перед установкой собственно keepalived необходимо провести ряд работ по подготовке инфраструктуры. Потребуются:
- Два идентичных сервера для размещения контента проекта и два сервера, также одинаковых по характеристикам, для балансировщика haproxy и демона keepalived;
- ОС Ubuntu 20.04 и привилегированные права на всех этих серверах;
- Две подсети, одна общая и одна приватная. Контент-серверы из соображений безопасности не будут доступны через общедоступную подсеть, серверы балансировки должны быть подключены к обеим сетям;
- Один дополнительный публичный IP-адрес в публичной подсети, не закрепленный явно за каким-либо из серверов;
- Доменное имя, «направленное» на этот «дополнительный» IP.
Приступим к подготовке:
- Создайте четыре сервера через личный кабинет ServerSpace. Все они должны быть размещены в одной локации;
- Создайте две подсети в соответствии с описанием выше;
- Подключите все серверы к созданным сетям. Затем переустановите на них ОС, это самый быстрый способ применить сетевые настройки без анализа и редактирования конфигурационных файлов;
- Когда переустановка завершится, перейдите в личном кабинете в раздел Networks и кликните по названию каждой подсети. Вы увидите, какому серверу какой IP был назначен. Запомните эти данные, они понадобятся при дальнейшей настройке. Также держите в уме, что один неиспользуемый IP-адрес (45.14.48.134 в моем примере) будет использоваться как «плавающий» адрес для обеспечения отказоустойчивости;
- Создайте набор правил брандмауэра, блокирующих любой трафик, поступающий на «конетент-серверы» через «публичный» интерфейс, кроме трафика из вашей подсети. Также стоит внести в белый список «внешний» IP вашего компьютера, это сделает управление серверами более комфортным. Самый простой способ достичь цели - кликнуть по имени первого сервера с контентом вашего проекта в панели ServerSpace, добавить правила файрволла и нажать кнопку SAVE. Помните, что «разрешающие» правила нужно ставить выше, чем правила блокировки;
- Повторите те же действия для второго сервера, обслуживающего ваш проект
- Добавьте в конец файла /etc/hosts на каждом из четырех серверов следующие строки:
<backend_server_one_IP> content1 content1.your.domain
<backend_server_two_IP> content2 content2.your.domain
<balancer_server_one_IP> haproxy1 haproxy1.your.domain
<balancer_server_two_IP> haproxy2 haproxy2.your.domain
<1st_floating_IP_for_keepalived> your.domain
<2nd_floating_IP_for_keepalived> your.domain
Настройка связки «веб-сервер, балансировщик и демон keepalived»
- Разверните два идентичных экземпляра данных вашего проекта на оба контент-сервера. Так как моя статья создается в «учебных» целях, я просто установлю веб-сервер nginx с «тестовой страницей». Индексные файлы будут отличаться, просто чтобы проиллюстрировать работу программ и показать, что сервисы балансировки реально работают;
apt-get update; apt install -y nginx
echo $(hostname) > /var/www/html/index.nginx-debian.html # именно у вас путь может быть другим, тут указывается каталог сайта и индексный файл
- Авторизуйтесь на первом сервере балансировки и установите пакет haproxy.
apt -y install haproxy
Отредактируйте файл конфигурации /etc/haproxy/haproxy.cfg, добавив следующие строки;
#frontend
#---------
frontend my_haproxy
bind *:80
stats uri /haproxy?stats
default_backend my_haproxy
# backend
#---------
backend my_haproxy
balance roundrobin
mode http
server content1 <1st_backend_server_private_IP>:80 check
server content2 <2nd_backend_server_private_IP>:80 check
- Перезапустите службы haproxy
service haproxy restart
- Одновременно запустите два сеанса терминала на вашем локальном компьютере и выполните следующие команды (по одной на окно):
while sleep 3; do curl http://<1st_balancer_public_IP>; done
while sleep 3; do curl http://<2nd_balancer_public_IP>; done
Если вы видите чередующиеся "ответы" в обоих окнах терминала - обе службы haproxy работают, можете переходить к следующему шагу;
- Установите на оба сервера-балансировщика программный пакет keepalived:
apt install -y keepalived
- Уточните имена «публичных» сетевых интерфейсов на обоих серверах;
ip a | grep <публичный_IP_сервера>
- Вставьте в файл параметров конфигурации для демона keepalived на первом балансировщике следующий код:
nano /etc/keepalived/keepalived.conf
vrrp_instance MY_KEEPALIVED1 {
state MASTER
interface ens192
virtual_router_id 1
priority 11
virtual_ipaddress {
45.14.48.134/29 dev ens192 label ens192:1
}
}
Кратко опишу что они означают:
vrrp_instance - имя инстанса, любые символы без пробелов,
state - роль сервера, ведомый или ведущий
interface - имя сетевого интерфейса, вы уточнили его на предыдущем шаге,
virtual_router_id - идентификатор «виртуального роутера», должен быть одинаковым на всех серверах-балансировщиках,
priority - приоритет балансировщиков, чем выше цифра тем больше приоритет, самый высокий следует выставлять для «ведущего» сервера,
virtual_ipaddress - один IP в подсети, не назначенный ни одному из серверов. Именно на этот адрес нужно «направить» А-записи вашего домена.
- По аналогии создайте файл конфигурации для второго сервера-балансировщика:
vrrp_instance MY_KEEPALIVED1 {
state SLAVE
interface ens192
virtual_router_id 1
priority 10
virtual_ipaddress {
45.14.48.134/29 dev ens192 label ens192:1
}
}
Обратите внимание на текст, в нем параметры «priority» и «state» поменялись местами, а всё остальное идентично.
- Разрешите автозапуск и перезапустите сконфигурированные службы на обоих серверах балансировки;
systemctl enable haproxy && service haproxy restart; systemctl enable keepalived && service keepalived start
- Проверьте статус. Запущенные службы отображаются так:
systemctl status haproxy && service keepalived status
Проверка работы балансировки и имитация аварии
- Снова откройте терминал на своем компьютере и дайте следующую команду:
while sleep 5; do curl http://<ваш_домен>; done
Как видно, оба сервера контента работают и отвечают по очереди:
- Остановите «главный» балансировщик;
systemctl stop haproxy && service keepalived stop
- Видно, что «резервный» балансировщик повысил статус до ведущего, а контент продолжает доставляться без перебоев с обоих «контентных» серверов;
- Теперь отключим один из серверов, содержащих контент;
service nginx stop
На скриншоте видно, что был буквально секундный обрыв связи, проект остался работоспособным, контент поступает со второй ноды;
- Когда «сбойный» сервер возвращается в строй, его контент также «возвращается» незаметно для пользователей проекта;
- И, наконец, если вернуть в строй «упавший» балансировщик, он снова берет на себя ведущую роль:
systemctl start haproxy && service keepalived start
Выводы
Прочитав этот материал, вы узнали, как построить отказоустойчивую инфраструктуру на базе nginx, haproxy и keepalived в Ubuntu 20 LTS.