Отказоустойчивый сайт с балансировкой нагрузки с помощью Yandex Application Load Balancer
- Подготовьте облако к работе
- Подготовьте сетевую инфраструктуру
- Создайте группы безопасности
- Создайте группу ВМ
- Загрузите файлы веб-сайта
- Создайте группу бэкендов
- Создайте HTTP-роутер
- Создайте L7-балансировщик
- Настройте DNS
- Протестируйте отказоустойчивость
- Как удалить созданные ресурсы
- Как создать инфраструктуру с помощью Terraform
Создайте и настройте веб-сайт с балансировкой нагрузки через Application Load Balancer между тремя зонами доступности, защищенный от сбоев в одной зоне.
- Подготовьте облако к работе.
- Подготовьте сетевую инфраструктуру.
- Создайте группы безопасности.
- Создайте группу ВМ.
- Загрузите файлы веб-сайта.
- Создайте группу бэкендов.
- Создайте HTTP-роутер.
- Создайте L7-балансировщик.
- Настройте DNS.
- Протестируйте отказоустойчивость.
Если сайт вам больше не нужен, удалите все используемые им ресурсы.
Также инфраструктуру для веб-сайта можно развернуть через Terraform с помощью готового файла конфигурации.
Подготовьте облако к работе
Перед работой нужно зарегистрироваться в Yandex Cloud и создать платежный аккаунт:
- Перейдите в консоль управления, затем войдите в Yandex Cloud или зарегистрируйтесь, если вы еще не зарегистрированы.
- На странице биллинга убедитесь, что у вас подключен платежный аккаунт, и он находится в статусе
ACTIVE
илиTRIAL_ACTIVE
. Если платежного аккаунта нет, создайте его.
Если у вас есть активный платежный аккаунт, вы можете создать или выбрать каталог, в котором будет работать ваша инфраструктура, на странице облака.
Подробнее об облаках и каталогах.
Необходимые платные ресурсы
В стоимость поддержки инфраструктуры входит:
- плата за постоянно запущенные ВМ (см. тарифы Yandex Compute Cloud);
- плата за использование динамического внешнего IP-адреса (см. тарифы Yandex Virtual Private Cloud);
- плата за балансировку трафика (см. тарифы Yandex Application Load Balancer).
Подготовьте сетевую инфраструктуру
Перед тем, как создавать ВМ:
-
Перейдите в консоль управления Yandex Cloud и выберите каталог, в котором будете выполнять операции.
-
Убедитесь, что в выбранном каталоге есть сеть с подсетями в зонах доступности
ru-central1-a
,ru-central1-b
иru-central1-с
. Для этого на странице каталога выберите сервис Virtual Private Cloud. Если нужной сети или подсетей нет, создайте их.
Создайте группы безопасности
Примечание
Группы безопасности находятся на стадии Preview. Если они недоступны в вашей сети, для ресурсов будет разрешен весь входящий и исходящий трафик и дополнительной настройки не требуется.
Группы безопасности содержат правила, которые разрешают балансировщику получать входящий трафик и отправлять его на ВМ, а ВМ — получать этот трафик.
Чтобы создать группы безопасности для балансировщика и для группы ВМ:
-
В консоли управления выберите сервис 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
. По умолчанию все операции в Instance Groups выполняются от имени сервисного аккаунта.
- Введите имя группы ВМ, например
-
В блоке Распределение выберите три зоны доступности (
ru-central1-a
,ru-central1-b
иru-central1-с
), чтобы обеспечить отказоустойчивость хостинга. -
В блоке Шаблон виртуальной машины нажмите кнопку Задать и укажите конфигурацию базовой ВМ:
- В блоке Базовые параметры введите Описание шаблона.
- В блоке Выбор образа/загрузочного диска перейдите на вкладку 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 (время кэширования записи): оставьте значение по умолчанию.
- Значение: введите публичный адрес балансировщика
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 позволяет быстро создать облачную инфраструктуру в Yandex Cloud и управлять ею с помощью файлов конфигураций. В файлах конфигураций хранится описание инфраструктуры на языке HCL (HashiCorp Configuration Language). Terraform и его провайдеры распространяются под лицензией Mozilla Public License.
Подробную информацию о ресурсах провайдера смотрите в документации на сайте Terraform или в зеркале.
При изменении файлов конфигураций Terraform автоматически определяет, какая часть вашей конфигурации уже развернута, что следует добавить или удалить.
Чтобы разместить в группе виртуальных машин отказоустойчивый сайт с балансировкой нагрузки через Application Load Balancer с помощью Terraform:
-
Установите Terraform, получите данные для аутентификации и укажите источник для установки провайдера Yandex Cloud (раздел Настройте провайдер, шаг 1).
-
Подготовьте файлы с описанием инфраструктуры:
В руководстве используются группы безопасности. Если они вам недоступны, то запросите доступ в поддержке или уберите из файла конфигурации блок
yandex_vpc_security_group
и другие упоминанияsecurity_group
.Готовый архивСоздание вручную- Создайте папку для файлов.
- Скачайте архив (2 КБ).
- Разархивируйте архив в папку. В результате в ней должен появиться конфигурационный файл
application-load-balancer.tf
.
-
Создайте папку для файлов.
-
Создайте в папке конфигурационный файл
application-load-balancer.tf
:application-load-balancer.tfterraform { required_providers { yandex = { source = "yandex-cloud/yandex" version = ">= 0.47.0" } } } provider "yandex" { zone = "ru-central1-a" } variable "folder_id" { description = "ID of the folder where resources will be created" default = "<идентификатор_каталога>" } resource "yandex_iam_service_account" "ig-sa" { name = "ig-sa" } resource "yandex_resourcemanager_folder_iam_binding" "editor" { folder_id = var.folder_id role = "editor" members = [ "serviceAccount:${yandex_iam_service_account.ig-sa.id}", ] } resource "yandex_vpc_network" "network-1" { name = "network1" } resource "yandex_vpc_subnet" "subnet-1" { name = "subnet1" 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 = "subnet2" 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 = "subnet3" zone = "ru-central1-c" 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"] } 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: <имя_пользователя>\n groups: sudo\n shell: /bin/bash\n sudo: ['ALL=(ALL) NOPASSWD:ALL']\n ssh-authorized-keys:\n - ${file("<путь_к_открытому_SSH-ключу>")}" } } scale_policy { fixed_scale { size = 3 } } allocation_policy { zones = ["ru-central1-a", "ru-central1-b", "ru-central1-c"] } 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 = ["alb-example.com"] 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-c" 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 = "alb-example.com." public = true } resource "yandex_dns_recordset" "rs-1" { zone_id = yandex_dns_zone.alb-zone.id name = "alb-example.com." 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 = ["alb-example.com"] }
Более подробную информацию о параметрах используемых ресурсов в Terraform см. в документации провайдера:
- yandex_iam_service_account
- yandex_resourcemanager_folder_iam_binding
- 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
-
В блоке
variable
укажите значение переменнойfolder_id
— идентификатор каталога, в котором создаются необходимые ресурсы. -
В блоке
metadata
укажите имя пользователя и содержимое SSH-ключа. Подробнее см. в разделе Метаданные виртуальной машины. -
Создайте ресурсы:
-
В терминале перейдите в папку, где вы отредактировали конфигурационный файл.
-
Проверьте корректность конфигурационного файла с помощью команды:
terraform validate
Если конфигурация является корректной, появится сообщение:
Success! The configuration is valid.
-
Выполните команду:
terraform plan
В терминале будет выведен список ресурсов с параметрами. На этом этапе изменения не будут внесены. Если в конфигурации есть ошибки, Terraform на них укажет.
-
Примените изменения конфигурации:
terraform apply
-
Подтвердите изменения: введите в терминале слово
yes
и нажмите Enter.
-