Развёртывание отказоустойчивого Web-приложения в Yandex Cloud с помощью сетевого балансировщика нагрузки (NLB)
Оглавление:
- Введение
- Принципы балансировки NLB
- Развёртывание Web-приложения
- Результаты развёртывания Web-приложения
- Тестирование отказоустойчивости Web-приложения с помощью SG
- Тестирование отказоустойчивости Web-приложения с помощью iptables
- Удаление развертывания
При развертывании отказоустойчивых приложений рекомендуется использовать балансировщики нагрузки. В Yandex Cloud балансировщики нагрузки являются ключевыми элементами, позволяющими снижать или полностью исключать влияние отказов в инфраструктуре на работу приложений.
В Yandex Cloud есть два типа балансировщиков сетевого трафика:
- Сетевой балансировщик нагрузки (Network Load Balancer,
NLB
). Обеспечивает балансировку на 4-ом уровне сетевой модели OSI. - Балансировщик нагрузки уровня приложений или L7-балансировщик (Application Load Balancer,
ALB
). Обеспечивает балансировку на 7-ом уровне сетевой модели OSI, в основном работает с протоколамиHTTP
иHTTPS
.
Подробнее ознакомиться с описанием балансировщиков нагрузки можно в документации, по ссылкам которые приведены выше.
В данном решении показано развертывание Web-приложения в отказоустойчивой конфигурации с помощью сетевого балансировщика нагрузки.
Сетевой балансировщик нагрузки NLB
состоит из двух основных частей:
- Обработчик трафика (
Listener
):- принимает трафик от клиентов приложения.
- распределяет принятый трафик в группы целевых ресурсов. При распределении трафика используется алгоритм 5-tuple hash. Трафик распределяется только к целевым ресурсам, которые находятся в рабочем состоянии.
- Группы целевых ресурсов (Target Group,
TG
). Подресурсом
здесь понимается IP-адрес сетевого интерфейса виртуальной машины, которая будет обрабатывать распределяемый балансировщиком трафик. У балансировщика может быть одна или несколько групп ресурсов.
Представим себе Web-приложение, которое развернуто в Yandex Cloud в трёх зонах доступности:
В нормальном состоянии NLB
будет распределять входящий трафик к Web-приложению по целевым ресурсам в группе примерно равномерно. Неравномерность распределения связана с особенностями работы алгоритма распределения 5-tuple hash.
При отказе в одной из зон доступности, механизм проверки состояния целевых ресурсов NLB
обнаружит потерю ресурса в отказавшей зоне и переключит входящий трафик к приложению на доступные целевые ресурсы в других зонах доступности.
Для работы в отказоустойчивом режиме каждый из целевых ресурсов приложения должен иметь запас по мощности для обработки дополнительной нагрузки при возможных отказах.
Развёртывание Web-приложения в Yandex Cloud предполагается из ОС Linux
или MacOS
.
- Перед началом развертывания необходимо убедиться, что необходимые инструменты установлены и настроены:
yc CLI
- установлен и настроенTerraform
- установлен и настроен
-
Загрузить развёртывание из репозитория на github.com:
git clone https://github.com/yandex-cloud-examples/yc-deploy-ha-app-with-nlb.git
-
Перейти в папку с развёртыванием:
cd yc-deploy-ha-app-with-nlb
-
Заполнить значения переменных в файле terraform.tfvars. Краткое описание входных переменных:
zone_list
- список зон доступности в которых будет разворачиваться Web-приложение, а также префиксов IP-подсетей для каждой из зон. Рекомендуется использовать не менее двух зон доступности при развёртывании.app_name
- имя приложения, например,app
. Используется для генерации Let's Encrypt (LE) сертификата.app_fqdn
- FQDN имя приложения, например,app.mydom.net
. Используется для генерации LE сертификата.user_name
- имя пользователя - администратора для подключения по SSH к виртуальным машинам с Web-приложением, например,admin
.dns_folder_id
- идентификатор каталога, в котором уже существует публичный DNS-домен в котором будет запрашиваться LE сертификат.dns_zone_name
- имя публичного домена в сервисе Cloud DNS в каталогеdns_folder_id
, например,mydom-net
.
-
Подготовить среду для развёртывания:
terraform init source env-yc.sh
-
Создать запрос на LE сертификат:
terraform apply -target yandex_dns_recordset.app_validation_dns_rec
-
Дождаться перехода статуса сертификата из состояния
VALIDATING
в состояниеISSUED
. Обработка запроса на выдачу сертификата в сервисе Let's Encrypt может выполнятьсядо 30 минут
!DNS_FOLDER_ID=$(grep dns_folder_id terraform.tfvars | cut -d '"' -f 2) yc cm certificate list --folder-id $DNS_FOLDER_ID
Ожидаемый результат:
+----------------------+-------+---------------+---------------------+---------+--------+ | ID | NAME | DOMAINS | NOT AFTER | TYPE | STATUS | +----------------------+-------+---------------+---------------------+---------+--------+ | fpqke**********bcue4 | app | app.mydom.net | 2025-06-07 07:30:46 | MANAGED | ISSUED | +----------------------+-------+---------------+---------------------+---------+--------+
-
Выполнить развёртывание Web-приложения:
terraform apply
-
Проверить работоспособность Web-приложения:
- В браузере открыть URL приложения
https://app.mydom.net
- Приложение должно отвечать именем ВМ куда пришел запрос и текущим временем.
Ожидаемый результат:
app-vm-d Friday, 07-Mar-2025 15:26:52 MSK
- В браузере открыть URL приложения
В процессе развертывания Web-приложения в Yandex Cloud будут созданы следующие ресурсы:
- Виртуальная сеть VPC
app-net
. - От одной до трех подсетей в сети
app-net
(в зависимости от значения переменнойzone_list
). - NAT-шлюз и таблица маршрутизации для обеспечения загрузки внешних пакетов при развертывании виртуальных машин.
- Две группы безопасности (SG) -
permit-nlb-hc-sg
иblock-nlb-hc-sg
для тестирования отказоустойчивости Web-приложения. - От одной до трех виртуальных машин с Web сервером NGINX (в зависимости от значения переменной
zone_list
). - Сетевой балансировщик нагрузки (NLB) и группа целевых ресурсов.
- Зарезервированный публичный IP-адрес для обработчика NLB.
- Запрос на LE-сертификат и проверочные записи в DNS для прохождения проверок при выдаче LE-сертификата.
Группы безопасности (Security Groups, SG
) предназначены для контроля за сетевым трафиком на интерфейсах виртуальных машин.
-
Обратиться к Web-приложению. Для этого нужно открыть в Web-браузере URL приложения, например,
https://app.mydom.net
. Приложение должно отвечать именем ВМ куда пришел запрос и текущим временем, например, так:app-vm-d Friday, 07-Mar-2025 15:26:52 MSK
-
Открыть облачную консоль https://console.yandex.cloud
-
Перейти в сервис
Compute Cloud
в каталоге облачных ресурсов -
Открыть свойства виртуальной машины, имя которой мы увидели в ответе приложения, например,
app-vm-d
-
В разделе
Сеть
нажать на кнопку...
и выбратьИзменить
. -
В выпадающем списке в поле
Группы безопасности
напротив значенияblock-nlb-hc-sg
выбрать справаТолько
. В спискеГруппы безопасности
должно остаться только значениеblock-nlb-hc-sg
. НажатьСохранить
. -
Обновить страницу Web-приложения в браузере. Приложение должно ответить другим именем виртуальной машины, например, так:
app-vm-a Friday, 07-Mar-2025 15:28:02 MSK
Переключение нагрузки на другой целевой ресурс состоялось.
-
При необходимости вернуть обратно SG
permit-nlb-hc-sg
в настройках сетевого интерфейса ВМ.
Iptables
— утилита командной строки, стандартный интерфейс управления работой межсетевого экрана (брандмауэра) NetFilter для ядер Linux.
-
Обратиться к Web-приложению. Для этого нужно открыть в Web-браузере URL приложения, например,
https://app.mydom.net
. Приложение должно отвечать именем ВМ куда пришел запрос и текущим временем, например, так:app-vm-d Friday, 07-Mar-2025 15:32:20 MSK
-
Открыть облачную консоль https://console.yandex.cloud
-
Перейти в сервис
Compute Cloud
в каталоге облачных ресурсов -
Открыть свойства виртуальной машины, имя которой мы увидели в ответе приложения, например,
app-vm-d
-
В разделе
Сеть
нажать на кнопку...
и выбратьДобавить публичный IP-адрес
и далее нажать на кнопку "Добавить". -
Убедиться в том, что публичный IP-адрес показывается в настройках сетевого интерфейса ВМ.
-
Подключиться к ВМ по SSH, используя публичный IP-адрес ВМ:
ssh admin@<public-ip>
-
Отключить прохождение проверок доступности со стороны NLB с помощью инструмента
iptables
:sudo iptables -I INPUT -i eth0 -p tcp -s 198.18.235.0/24 --dport 80 -j REJECT sudo iptables -I INPUT -i eth0 -p tcp -s 198.18.248.0/24 --dport 80 -j REJECT
-
Обновить страницу Web-приложения в браузере. Приложение должно ответить другим именем ВМ, например, так:
app-vm-d Friday, 07-Mar-2025 15:40:28 MSK
Переключение нагрузки на другой целевой ресурс состоялось.
-
Включить обратно прохождение проверок доступности со стороны NLB:
sudo iptables -D INPUT -i eth0 -p tcp -s 198.18.235.0/24 --dport 80 -j ACCEPT sudo iptables -D INPUT -i eth0 -p tcp -s 198.18.248.0/24 --dport 80 -j ACCEPT
Все ресурсы которые были созданы в Yandex Cloud в процессе данного развёртывания могут быть удалены следующим образом:
cd yc-deploy-ha-app-with-nlb
source env-yc.sh
terraform destroy