Отказоустойчивый сайт с балансировкой нагрузки с помощью Yandex Application Load Balancer
- Подготовьте облако к работе
- Подготовьте сетевую инфраструктуру
- Создайте группы безопасности
- Создайте группу ВМ
- Загрузите файлы веб-сайта
- Создайте группу бэкендов
- Создайте HTTP-роутер
- Создайте L7-балансировщик
- Настройте DNS
- Протестируйте отказоустойчивость
- Как удалить созданные ресурсы
- Как создать инфраструктуру с помощью Terraform
Создайте и настройте веб-сайт с балансировкой нагрузки через Application Load Balancer между тремя зонами доступности, защищенный от сбоев в одной зоне.
- Подготовьте облако к работе.
- Подготовьте сетевую инфраструктуру.
- Создайте группы безопасности.
- Создайте группу виртуальных машин.
- Загрузите файлы веб-сайта.
- Создайте группу бэкендов.
- Создайте HTTP-роутер.
- Создайте L7-балансировщик.
- Настройте DNS.
- Протестируйте отказоустойчивость.
Если сайт вам больше не нужен, удалите все используемые им ресурсы.
Также инфраструктуру для веб-сайта можно развернуть через Terraform с помощью готовой конфигурации.
Подготовьте облако к работе
Зарегистрируйтесь в Yandex Cloud и создайте платежный аккаунт:
- Перейдите в консоль управления
, затем войдите в Yandex Cloud или зарегистрируйтесь. - На странице Yandex Cloud Billing
убедитесь, что у вас подключен платежный аккаунт, и он находится в статусеACTIVE
илиTRIAL_ACTIVE
. Если платежного аккаунта нет, создайте его и привяжите к нему облако.
Если у вас есть активный платежный аккаунт, вы можете создать или выбрать каталог, в котором будет работать ваша инфраструктура, на странице облака
Подробнее об облаках и каталогах.
Необходимые платные ресурсы
В стоимость поддержки инфраструктуры входит:
- Плата за постоянно запущенные ВМ (см. тарифы Yandex Compute Cloud).
- Плата за использование динамического публичного IP-адреса (см. тарифы Yandex Virtual Private Cloud).
- Плата за балансировку трафика (см. тарифы Application Load Balancer).
Подготовьте сетевую инфраструктуру
Перед тем, как создавать ВМ:
- Перейдите в консоль управления
Yandex Cloud и выберите каталог, в котором будете выполнять операции. - Убедитесь, что в выбранном каталоге есть сеть с подсетями в зонах доступности
ru-central1-a
,ru-central1-b
иru-central1-d
. Для этого на странице каталога выберите сервис Virtual Private Cloud. Если нужной сети или подсетей нет, создайте их.
Создайте группы безопасности
Группы безопасности содержат правила, которые разрешают балансировщику получать входящий трафик и отправлять его на ВМ, а ВМ — получать этот трафик.
Чтобы создать группы безопасности для балансировщика и для группы ВМ:
-
В консоли управления
выберите сервис Virtual Private Cloud. -
Откройте вкладку Группы безопасности.
-
Создайте группу безопасности для балансировщика:
-
Нажмите кнопку Создать группу.
-
Введите имя группы, например
alb-sg
. -
Выберите сеть, которой будет назначена группа безопасности.
-
В блоке Правила создайте следующие правила по инструкции под таблицей:
Направление
трафикаОписание Диапазон
портовПротокол Тип источника /
назначенияИсточник /
назначениеИсходящий any Весь Любой CIDR 0.0.0.0/0 Входящий ext-http 80 TCP CIDR 0.0.0.0/0 Входящий ext-https 443 TCP CIDR 0.0.0.0/0 Входящий healthchecks 30080 TCP Проверки состояния балансировщика — - Выберите вкладку Исходящий трафик или Входящий трафик.
- Нажмите кнопку Добавить правило.
- В открывшемся окне в поле Диапазон портов укажите один порт или диапазон портов, куда или откуда будет поступать трафик.
- В поле Протокол укажите нужный протокол или оставьте Любой, чтобы разрешить передачу трафика по всем протоколам.
- В поле Назначение или Источник выберите назначение правила:
- CIDR — правило будет применено к диапазону IP-адресов. В поле CIDR блоки укажите CIDR и маски подсетей, в которые или из которых будет поступать трафик. Чтобы добавить несколько CIDR, нажимайте кнопку Добавить CIDR.
- Группа безопасности — правило будет применено к ВМ из текущей группы или из выбранной группы безопасности.
- Проверки состояния балансировщика — правило, которое позволяет балансировщику проверять состояние ВМ.
- Нажмите кнопку Сохранить. Таким образом создайте все правила из таблицы.
-
Нажмите кнопку Сохранить.
-
-
Аналогично создайте группу безопасности для группы ВМ с именем
alb-vm-sg
, той же сетью и следующими правилами:Направление
трафикаОписание Диапазон
портовПротокол Тип источника Источник Входящий balancer 80 TCP Группа безопасности alb-sg
Входящий ssh 22 TCP CIDR 0.0.0.0/0
См. раздел Как создать инфраструктуру с помощью Terraform.
Создайте группу ВМ
На ВМ из целевой группы развертываются бэкенды вашего приложения. Целевая группа будет подключена к балансировщику, чтобы на эндпоинты бэкендов приложения можно было направлять запросы.
Чтобы создать группу ВМ с минимальной конфигурацией:
- В консоли управления
выберите сервис Compute Cloud. - Откройте вкладку Группы виртуальных машин и нажмите кнопку Создать группу.
- В блоке Базовые параметры:
- Введите имя группы ВМ, например
alb-vm-group
. - Выберите сервисный аккаунт из списка или создайте новый. Чтобы иметь возможность создавать, обновлять и удалять ВМ в группе, назначьте сервисному аккаунту роль
editor
. По умолчанию все операции с группами безопасности выполняются от имени сервисного аккаунта.
- Введите имя группы ВМ, например
- В блоке Распределение выберите три зоны доступности (
ru-central1-a
,ru-central1-b
иru-central1-d
), чтобы обеспечить отказоустойчивость хостинга. - В блоке Шаблон виртуальной машины нажмите кнопку Задать и укажите конфигурацию базовой ВМ:
-
В блоке Базовые параметры введите Описание шаблона.
-
В блоке Выбор образа/загрузочного диска перейдите на вкладку Cloud Marketplace и выберите продукт LEMP и нажмите кнопку Использовать.
-
В блоке Диски укажите:
- Тип диска — HDD.
- Размер — 3 ГБ.
-
В блоке Вычислительные ресурсы укажите:
- Платформа — Intel Cascade Lake.
- vCPU — 2.
- Гарантированная доля vCPU — 5%.
- RAM — 1 ГБ.
-
В блоке Сетевые настройки:
- Выберите облачную сеть и ее подсети.
- В поле Публичный адрес выберите Автоматически.
- Выберите группу безопасности
alb-vm-sg
.
-
В блоке Доступ укажите данные для доступа на ВМ:
- В поле Сервисный аккаунт выберите сервисный аккаунт для привязки к ВМ.
- В поле Логин введите имя пользователя.
- В поле SSH-ключ вставьте содержимое файла открытого ключа.
Для подключения по SSH необходимо создать пару ключей. Подробнее в разделе Подключиться к ВМ Linux по SSH.
-
Нажмите кнопку Сохранить.
-
- В блоке Масштабирование укажите Размер группы ВМ — 3.
- В блоке Интеграция с Application Load Balancer выберите опцию Создать целевую группу и укажите имя группы:
alb-tg
. - Нажмите кнопку Создать.
См. раздел Как создать инфраструктуру с помощью Terraform.
Создание группы ВМ может занять несколько минут. Когда все ВМ перейдут в статус RUNNING
, вы можете загрузить на них файлы веб-сайта.
См. также
Загрузите файлы веб-сайта
Чтобы проверить работу веб-сервера, необходимо загрузить файлы сайта на каждую ВМ. Для примера вы можете использовать файл index.html
из архива
Для каждой ВМ в созданной группе выполните следующее:
-
На вкладке Виртуальные машины нажмите на имя нужной ВМ в списке. В блоке Сеть найдите публичный IP-адрес.
-
Подключитесь к ВМ по протоколу SSH.
-
Выдайте права на запись для вашего пользователя на директорию
/var/www/html
:sudo chown -R "$USER":www-data /var/www/html
-
Загрузите на ВМ файлы веб-сайта с помощью протокола SCP
.Linux/macOSWindowsИспользуйте утилиту командной строки
scp
:scp -r <путь_до_директории_с-файлами> <имя_пользователя_ВМ>@<IP-адрес_ВМ>:/var/www/html
С помощью программы WinSCP
скопируйте локальную директорию с файлами в директорию/var/www/html
на ВМ.
Создайте группу бэкендов
Целевую группу, созданную вместе с группой ВМ, привяжите к группе бэкендов с настройками распределения трафика.
Для бэкендов в группах будут созданы проверки состояния: балансировщик будет периодически отправлять проверочные запросы к ВМ и ожидать ответа в течение определенного периода.
Чтобы создать группу бэкендов:
- Выберите сервис Application Load Balancer в каталоге, где создана группа ВМ.
- Откройте вкладку Группы бэкендов.
- Нажмите кнопку Создать группу бэкендов.
- Введите имя группы бэкендов, например
alb-bg
. - В блоке Бэкенды нажмите кнопку Добавить.
- Введите имя бэкенда, например
backend-1
. - В поле Целевая группа выберите созданную ранее целевую группу
alb-tg
. - Укажите Порт, на котором ВМ бэкенда будут принимать входящий трафик от балансировщика:
80
. - Нажмите кнопку Добавить проверку состояния.
- Укажите Порт, на котором ВМ бэкенда будут принимать проверочные соединения:
80
. - Укажите Путь, к которому будет обращаться балансировщик при проверке состояния:
/
. - Нажмите кнопку Создать.
См. раздел Как создать инфраструктуру с помощью Terraform.
Создайте HTTP-роутер
Привяжите группу бэкендов к HTTP-роутеру с правилами маршрутизации HTTP-запросов.
Чтобы создать HTTP-роутер и добавить в него маршрут:
- Откройте вкладку HTTP-роутеры.
- Нажмите кнопку Создать HTTP-роутер.
- Введите имя роутера, например
alb-router
. - Нажмите кнопку Добавить виртуальный хост.
- Введите имя виртуального хоста, например
alb-host
. - В поле Authority введите доменное имя сайта:
alb-example.com
. - Нажмите кнопку Добавить маршрут.
- Введите имя, например
route-1
. - В поле Группа бэкендов выберите созданную ранее группу
alb-bg
. - Остальные настройки оставьте без изменений и нажмите кнопку Создать.
См. раздел Как создать инфраструктуру с помощью Terraform.
Создайте L7-балансировщик
Чтобы создать балансировщик:
- Откройте вкладку Балансировщики.
- Нажмите кнопку Создать L7-балансировщик.
- Введите имя балансировщика, например
alb-1
. - В блоке Сетевые настройки выберите сеть, к которой подключена группа ВМ, и созданную ранее группу безопасности
alb-sg
. - В блоке Размещение выберите подсети для узлов балансировщика в каждой зоне доступности и включите прием трафика.
- В блоке Обработчики нажмите кнопку Добавить обработчик.
- Введите имя обработчика, например
alb-listener
. - В блоке Настройки публичного IP-адреса включите передачу трафика.
- Укажите порт
80
. - В поле HTTP-роутер выберите созданный ранее роутер
alb-router
. - Нажмите кнопку Создать.
См. раздел Как создать инфраструктуру с помощью Terraform.
Настройте DNS
Доменное имя, которое вы хотите использовать для веб-сайта, нужно связать с IP-адресом балансировщика. Для управления доменом можно использовать сервис Cloud DNS.
В инструкции ниже описана настройка DNS для доменного имени alb-example.com
.
Добавьте зону
- Выберите сервис Cloud DNS в каталоге, где создана группа ВМ.
- Нажмите кнопку Создать зону.
- Задайте настройки зоны:
- Зона:
alb-example.com.
. Укажите ваш зарегистрированный домен. - Тип: Публичная.
- Имя:
alb-zone
.
- Зона:
- Нажмите кнопку Создать.
См. раздел Как создать инфраструктуру с помощью Terraform.
Добавьте ресурсные записи
Создайте в публичной зоне записи DNS:
- Выберите сервис Application Load Balancer. В списке балансировщиков найдите IP-адрес ранее созданного балансировщика
alb-1
. - В сервисе Cloud DNS выберите зону
alb-example.com.
из списка. - Создайте запись типа А:
- Нажмите кнопку Создать запись.
- Задайте параметры записи:
- Имя: оставьте пустым.
- Тип записи: оставьте значение
А
. - TTL (время кэширования записи): оставьте значение по умолчанию.
- Значение: введите публичный IP-адрес балансировщика
alb-1
.
- Нажмите кнопку Создать.
- Создайте запись типа CNAME:
- Нажмите кнопку Создать запись.
- Задайте параметры записи:
- Имя:
www
. - Тип записи: выберите значение
CNAME
. - TTL (время кэширования записи): оставьте значение по умолчанию.
- Значение: введите
alb-example.com
.
- Имя:
- Нажмите кнопку Создать.
См. раздел Как создать инфраструктуру с помощью Terraform.
Протестируйте отказоустойчивость
-
В консоли управления
выберите сервис Compute Cloud. -
Перейдите на страницу ВМ из созданной ранее группы. В блоке Сеть найдите публичный IP-адрес.
-
Подключитесь к ВМ по протоколу SSH.
-
Остановите веб-сервис, чтобы сымитировать сбой в работе веб-сервера:
sudo service nginx stop
-
Откройте ваш веб-сайт в браузере. Несмотря на сбой в работе одного из веб-серверов, сайт должен успешно открыться.
-
После завершения проверки запустите веб-сервис:
sudo service nginx start
Как удалить созданные ресурсы
Чтобы остановить работу хостинга и перестать платить за созданные ресурсы:
- Удалите компоненты Application Load Balancer:
- Удалите группу ВМ
alb-vm-group
.
Как создать инфраструктуру с помощью Terraform
Terraform
Terraform распространяется под лицензией Business Source License
Подробную информацию о ресурсах провайдера смотрите в документации на сайте Terraform
Чтобы разместить в группе ВМ отказоустойчивый сайт с балансировкой нагрузки через Application Load Balancer с помощью Terraform:
-
Установите Terraform, получите данные для аутентификации и укажите источник для установки провайдера Yandex Cloud (раздел Настройте провайдер, шаг 1).
-
Подготовьте файлы с описанием инфраструктуры:
Готовая конфигурацияВручную-
Склонируйте репозиторий с конфигурационными файлами.
git clone https://github.com/yandex-cloud-examples/yc-website-high-availability-with-alb.git
-
Перейдите в директорию с репозиторием. В ней должны появиться файлы:
application-load-balancer-website.tf
— конфигурация создаваемой инфраструктуры.application-load-balancer-website.auto.tfvars
— файл с пользовательскими данными.
- Создайте папку для конфигурационных файлов.
- Создайте в папке:
-
Конфигурационный файл
application-load-balancer-website.tf
:application-load-balancer-website.tf
# Объявление переменных для конфиденциальных параметров variable "folder_id" { description = "ID of the folder where resources will be created" type = string } variable "vm_user" { type = string } variable "ssh_key_path" { type = string sensitive = true } variable "dns_zone" { type = string } variable "domain" { type = string } # Добавление прочих переменных locals { sa_name = "ig-sa" network_name = "network1" subnet_name1 = "subnet-1" subnet_name2 = "subnet-2" subnet_name3 = "subnet-3" } # Настройка провайдера terraform { required_providers { yandex = { source = "yandex-cloud/yandex" version = ">= 0.47.0" } } } provider "yandex" { zone = "ru-central1-a" } resource "yandex_iam_service_account" "ig-sa" { name = local.sa_name } resource "yandex_resourcemanager_folder_iam_member" "editor" { folder_id = var.folder_id role = "editor" member = "serviceAccount:${yandex_iam_service_account.ig-sa.id}" } resource "yandex_vpc_network" "network-1" { name = local.network_name } resource "yandex_vpc_subnet" "subnet-1" { name = local.subnet_name1 zone = "ru-central1-a" network_id = yandex_vpc_network.network-1.id v4_cidr_blocks = ["192.168.1.0/24"] } resource "yandex_vpc_subnet" "subnet-2" { name = local.subnet_name2 zone = "ru-central1-b" network_id = yandex_vpc_network.network-1.id v4_cidr_blocks = ["192.168.2.0/24"] } resource "yandex_vpc_subnet" "subnet-3" { name = local.subnet_name3 zone = "ru-central1-d" network_id = yandex_vpc_network.network-1.id v4_cidr_blocks = ["192.168.3.0/24"] } resource "yandex_vpc_security_group" "alb-sg" { name = "alb-sg" network_id = yandex_vpc_network.network-1.id egress { protocol = "ANY" description = "any" v4_cidr_blocks = ["0.0.0.0/0"] from_port = 1 to_port = 65535 } ingress { protocol = "TCP" description = "ext-http" v4_cidr_blocks = ["0.0.0.0/0"] port = 80 } ingress { protocol = "TCP" description = "ext-https" v4_cidr_blocks = ["0.0.0.0/0"] port = 443 } ingress { protocol = "TCP" description = "healthchecks" predefined_target = "loadbalancer_healthchecks" port = 30080 } } resource "yandex_vpc_security_group" "alb-vm-sg" { name = "alb-vm-sg" network_id = yandex_vpc_network.network-1.id ingress { protocol = "TCP" description = "balancer" security_group_id = yandex_vpc_security_group.alb-sg.id port = 80 } ingress { protocol = "TCP" description = "ssh" v4_cidr_blocks = ["0.0.0.0/0"] port = 22 } } resource "yandex_compute_image" "lemp" { source_family = "lemp" } resource "yandex_compute_instance_group" "alb-vm-group" { name = "alb-vm-group" folder_id = var.folder_id service_account_id = yandex_iam_service_account.ig-sa.id instance_template { platform_id = "standard-v2" service_account_id = yandex_iam_service_account.ig-sa.id resources { core_fraction = 5 memory = 1 cores = 2 } boot_disk { mode = "READ_WRITE" initialize_params { image_id = yandex_compute_image.lemp.id type = "network-hdd" size = 3 } } network_interface { network_id = yandex_vpc_network.network-1.id subnet_ids = [yandex_vpc_subnet.subnet-1.id,yandex_vpc_subnet.subnet-2.id,yandex_vpc_subnet.subnet-3.id] nat = true security_group_ids = [yandex_vpc_security_group.alb-vm-sg.id] } metadata = { user-data = "#cloud-config\nusers:\n - name: ${var.vm_user}\n groups: sudo\n shell: /bin/bash\n sudo: ['ALL=(ALL) NOPASSWD:ALL']\n ssh_authorized_keys:\n - ${file("${var.ssh_key_path}")}" } } scale_policy { fixed_scale { size = 3 } } allocation_policy { zones = ["ru-central1-a", "ru-central1-b", "ru-central1-d"] } deploy_policy { max_unavailable = 1 max_expansion = 0 } application_load_balancer { target_group_name = "alb-tg" } } resource "yandex_alb_backend_group" "alb-bg" { name = "alb-bg" http_backend { name = "backend-1" port = 80 target_group_ids = [yandex_compute_instance_group.alb-vm-group.application_load_balancer.0.target_group_id] healthcheck { timeout = "10s" interval = "2s" healthcheck_port = 80 http_healthcheck { path = "/" } } } } resource "yandex_alb_http_router" "alb-router" { name = "alb-router" } resource "yandex_alb_virtual_host" "alb-host" { name = "alb-host" http_router_id = yandex_alb_http_router.alb-router.id authority = [var.domain, "www.${var.domain}"] route { name = "route-1" http_route { http_route_action { backend_group_id = yandex_alb_backend_group.alb-bg.id } } } } resource "yandex_alb_load_balancer" "alb-1" { name = "alb-1" network_id = yandex_vpc_network.network-1.id security_group_ids = [yandex_vpc_security_group.alb-sg.id] allocation_policy { location { zone_id = "ru-central1-a" subnet_id = yandex_vpc_subnet.subnet-1.id } location { zone_id = "ru-central1-b" subnet_id = yandex_vpc_subnet.subnet-2.id } location { zone_id = "ru-central1-d" subnet_id = yandex_vpc_subnet.subnet-3.id } } listener { name = "alb-listener" endpoint { address { external_ipv4_address { } } ports = [ 80 ] } http { handler { http_router_id = yandex_alb_http_router.alb-router.id } } } } resource "yandex_dns_zone" "alb-zone" { name = "alb-zone" description = "Public zone" zone = "${var.domain}." public = true } resource "yandex_dns_recordset" "rs-1" { zone_id = yandex_dns_zone.alb-zone.id name = "${var.domain}." ttl = 600 type = "A" data = [yandex_alb_load_balancer.alb-1.listener[0].endpoint[0].address[0].external_ipv4_address[0].address] } resource "yandex_dns_recordset" "rs-2" { zone_id = yandex_dns_zone.alb-zone.id name = "www" ttl = 600 type = "CNAME" data = [ var.domain ] }
-
Файл с пользовательскими данными
application-load-balancer-website.auto.tfvars
:application-load-balancer-website.auto.tfvars
folder_id = "<идентификатор_каталога>" vm_user = "<имя_пользователя_ВМ>" ssh_key_path = "<путь_к_публичному_SSH-ключу>" domain = "<домен>"
-
Более подробную информацию о параметрах используемых ресурсов в Terraform см. в документации провайдера:
- yandex_iam_service_account
- yandex_resourcemanager_folder_iam_member
- yandex_vpc_network
- yandex_vpc_subnet
- yandex_vpc_security_group
- yandex_compute_image
- yandex_compute_instance_group
- yandex_alb_backend_group
- yandex_alb_http_router
- yandex_alb_virtual_host
- yandex_alb_load_balancer
- yandex_dns_zone
- yandex_dns_recordset
-
-
В файле
application-load-balancer-website.auto.tfvars
задайте пользовательские параметры:folder_id
— идентификатор каталога.vm_user
— имя пользователя ВМ.ssh_key_path
— путь к файлу с открытым SSH-ключом для аутентификации пользователя на ВМ. Подробнее см. Создание пары ключей SSH.domain
— название домена, напримерalb-example.com
.
-
Создайте ресурсы:
-
В терминале перейдите в папку, где вы отредактировали конфигурационный файл.
-
Проверьте корректность конфигурационного файла с помощью команды:
terraform validate
Если конфигурация является корректной, появится сообщение:
Success! The configuration is valid.
-
Выполните команду:
terraform plan
В терминале будет выведен список ресурсов с параметрами. На этом этапе изменения не будут внесены. Если в конфигурации есть ошибки, Terraform на них укажет.
-
Примените изменения конфигурации:
terraform apply
-
Подтвердите изменения: введите в терминале слово
yes
и нажмите Enter.
-