Миграция сервисов с внешнего балансировщика NLB на L7-балансировщик ALB с целевым ресурсом — внутренним сетевым балансировщиком NLB с помощью Terraform
Важно
Часть ресурсов, необходимых для прохождения практического руководства, доступны только в регионе Россия.
Чтобы мигрировать сервис с сетевого балансировщика на L7-балансировщик:
- Ознакомьтесь с рекомендациями по миграции сервисов.
- Создайте внутренний сетевой балансировщик для Ingress-контроллера NGINX.
- Создайте инфраструктуру. На этом этапе вы подключите профиль безопасности Smart Web Security к виртуальному хосту L7-балансировщика.
- Проверьте работу L7-балансировщика.
- Мигрируйте пользовательскую нагрузку с сетевого балансировщика на L7-балансировщик.
Рекомендации по миграции сервисов
-
Подключите защиту от DDoS-атак на уровне L3-L4 (модель OSI
). Она станет дополнением к защите на уровне L7, которую после миграции обеспечит Yandex Smart Web Security.Чтобы подключить защиту на уровне L3-L4:
-
Перед миграцией зарезервируйте статический публичный IP-адрес с защитой от DDoS-атак и используйте этот адрес для обработчика L7-балансировщика. Если для сетевого балансировщика публичный IP с защитой уже есть, его можно сохранить при миграции. В противном случае IP-адрес придется поменять на защищенный.
-
Настройте порог для срабатывания механизмов защиты, который будет соответствовать объему легитимного трафика на защищаемый ресурс. Для настройки такого порога обратитесь в техническую поддержку
. -
Задайте значение MTU равным
1450на целевых ресурсах за балансировщиком. Подробнее см. в разделе MTU и TCP MSS.
-
-
Проводите миграцию в часы наименьшей пользовательской нагрузки. Если вы решили сохранить публичный IP-адрес, то во время миграции ваш сервис будет недоступен, пока этот IP-адрес переносится с сетевого балансировщика на L7-балансировщик. Обычно это занимает несколько минут.
-
При использовании L7-балансировщика запросы на бэкенды приходят с IP-адресом источника из диапазона внутренних IP-адресов подсетей, указанных при создании L7-балансировщика. Исходный IP-адрес источника запроса (пользователя) фигурирует в заголовке
X-Forwarded-For. Если необходимо логировать публичные IP-адреса пользователей на веб-сервере, измените его конфигурацию. -
Перед миграцией определите минимальное количество ресурсных единиц для настройки автомасштабирования в L7-балансировщике.
Количество ресурсных единиц выберите на основе анализа нагрузки на ваш сервис по следующим показателям:
- количество запросов в секунду (RPS);
- количество одновременных активных соединений;
- количество новых соединений в секунду;
- объем трафика в секунду.
Создайте внутренний сетевой балансировщик для Ingress-контроллера NGINX
-
Создайте внутренний сетевой балансировщик для Ingress-контроллера NGINX. Выберите вариант, который соответствует способу первоначального развертывания вашего Ingress-контроллера NGINX:
С помощью Helm-чартаС помощью манифеста-
В файле
values.yaml, который вы использовали для первоначальной конфигурации Ingress-контроллера NGINX, добавьте параметры конфигурации для внутреннего сетевого балансировщика. Остальные параметры в файле оставьте без изменений.controller: service: external: enabled: true internal: enabled: true annotations: yandex.cloud/load-balancer-type: internal yandex.cloud/subnet-id: <идентификатор_подсети_для_IP-адреса_внутреннего_сетевого_балансировщика> loadBalancerIP: <IP-адрес_обработчика_внутреннего_сетевого_балансировщика> externalTrafficPolicy: Local -
Примените изменения конфигурации Ingress-контроллера NGINX с помощью команды:
helm upgrade <имя_Ingress-контроллера_NGINX> -f values.yaml <чарт_для_Ingress-контроллера_NGINX> -n <пространство_имен>
-
Создайте YAML-файл, в котором опишите ресурс
Service:apiVersion: v1 kind: Service metadata: name: <имя_ресурса> namespace: <пространство_имен> annotations: yandex.cloud/load-balancer-type: internal yandex.cloud/subnet-id: <идентификатор_подсети_для_IP-адреса_внутреннего_сетевого_балансировщика> spec: type: LoadBalancer externalTrafficPolicy: Local loadBalancerIP: <IP-адрес_обработчика_внутреннего_сетевого_балансировщика> ports: - port: <80_или_другой_номер_порта_для_HTTP> targetPort: <80_или_другой_номер_порта_пода_Ingress-контроллера_NGINX_для_HTTP> protocol: TCP name: http - port: <443_или_другой_номер_порта_для_HTTPS> targetPort: <443_или_другой_номер_порта_пода_Ingress-контроллера_NGINX_для_HTTPS> protocol: TCP name: https selector: <селекторы_подов_Ingress-контроллера_NGINX> -
Примените изменения с помощью команды:
kubectl apply -f <файл_с_ресурсом_Service> -
-
Дождитесь создания внутреннего сетевого балансировщика и появления соответствующего ему объекта
Service. Посмотреть информацию о сервисах вы можете с помощью команды:kubectl get service
Создайте инфраструктуру для L7-балансировщика
-
Если у вас еще нет Terraform, установите его.
-
Получите данные для аутентификации. Вы можете добавить их в переменные окружения или указать далее в файле с настройками провайдера.
-
Настройте и инициализируйте провайдер. Чтобы не создавать конфигурационный файл с настройками провайдера вручную, скачайте его
. -
Поместите конфигурационный файл в отдельную рабочую директорию и укажите значения параметров. Если данные для аутентификации не были добавлены в переменные окружения, укажите их в конфигурационном файле.
-
Скачайте в ту же рабочую директорию файл конфигурации в зависимости от используемого протокола:
HTTP— файл конфигурации alb-int-nlb-http.tf .HTTPS— файл конфигурации alb-int-nlb-https.tf .
В этих файлах описаны:
- подсети для L7-балансировщика;
- группа безопасности для L7-балансировщика;
- статический адрес для L7-балансировщика;
- импорт TLS-сертификата в Certificate Manager (если используется протокол
HTTPS); - профиль безопасности Smart Web Security;
- целевая группа, группа бэкендов и HTTP-роутер для L7-балансировщика;
- L7-балансировщик.
-
В конфигурационном файле укажите значения переменных:
domain_name— имя домена вашего сервиса.network_id— идентификатор сети, в которой находятся виртуальные машины из целевой группы сетевого балансировщика нагрузки.ip_address_int_nlb— внутренний IP-адрес созданного ранее внутреннего сетевого балансировщика.certificate(если используется протоколHTTPS) — путь к файлу самоподписанного пользовательского сертификата.private_key(если используется протоколHTTPS) — путь к файлу с закрытым ключом.
-
Проверьте корректность файлов конфигурации Terraform с помощью команды:
terraform validateЕсли в файлах конфигурации есть ошибки, Terraform на них укажет.
-
Создайте необходимую инфраструктуру:
-
Выполните команду для просмотра планируемых изменений:
terraform planЕсли конфигурации ресурсов описаны верно, в терминале отобразится список изменяемых ресурсов и их параметров. Это проверочный этап: ресурсы не будут изменены.
-
Если вас устраивают планируемые изменения, внесите их:
-
Выполните команду:
terraform apply -
Подтвердите изменение ресурсов.
-
Дождитесь завершения операции.
-
В указанном каталоге будут созданы все требуемые ресурсы. Проверить появление ресурсов и их настройки можно в консоли управления
. -
-
В консоли управления перейдите в каталог, в котором создан L7-балансировщик.
-
Выберите сервис Application Load Balancer.
-
Дождитесь, когда L7-балансировщик перейдет в статус
Active. -
Укажите настройки автомасштабирования в L7-балансировщике:
- В консоли управления нажмите на имя нужного балансировщика.
- Нажмите
и выберите Редактировать. - В блоке Настройки автомасштабирования укажите ограничения на количество ресурсных единиц.
- Нажмите кнопку Сохранить.
Проверьте работу L7-балансировщика
-
В консоли управления
перейдите в созданный L7-балансировщик и слева выберите Проверки состояния. Убедитесь, что все проверки состояния L7-балансировщика показывают состояниеHEALTHY. -
Протестируйте запрос к сервису через L7-балансировщик. Например, одним из способов:
-
В файле
hostsна рабочей станции добавьте запись<публичный_IP-адрес_L7-балансировщика> <имя_домена_сервиса>. Удалите запись после тестирования. -
Выполните запрос с помощью cURL
в зависимости от типа протокола:curl http://<имя_домена_сервиса> \ --resolve <имя_домена_сервиса>:<порт_сервиса>:<публичный_IP-адрес_L7-балансировщика>curl https://<имя_домена_сервиса> \ --resolve <имя_домена_сервиса>:<порт_сервиса>:<публичный_IP-адрес_L7-балансировщика>
-
Мигрируйте пользовательскую нагрузку с внешнего сетевого балансировщика на L7-балансировщик
Выберите один из вариантов миграции:
- Сохранить публичный IP-адрес для вашего сервиса.
- Не сохранять публичный IP-адрес для вашего сервиса.
Сохранить публичный IP-адрес для вашего сервиса
-
Если у внешнего сетевого балансировщика используется динамический публичный IP-адрес, сделайте его статическим.
-
Удалите внешний сетевой балансировщик. Выберите вариант, который соответствует способу первоначального развертывания вашего Ingress-контроллера NGINX:
С помощью Helm-чартаС помощью манифеста-
В файле
values.yaml, который вы использовали для конфигурации Ingress-контроллера NGINX, в секцииcontroller.service.externalустановите значение параметраenabled: false. Остальные параметры в файле оставьте без изменений.controller: service: external: enabled: false ... -
Примените изменения конфигурации Ingress-контроллера NGINX с помощью команды:
helm upgrade <имя_Ingress-контроллера_NGINX> -f values.yaml <чарт_для_Ingress-контроллера_NGINX> -n <пространство_имен>
Удалите ресурс
Serviceдля внешнего сетевого балансировщика с помощью команды:kubectl delete service <имя_ресурса_Service_для_внешнего_сетевого_балансировщика> -
-
Дождитесь удаления внешнего сетевого балансировщика для Ingress-контроллера NGINX и удаления соответствующего ему объекта
Service. Посмотреть информацию о сервисах вы можете с помощью команды:kubectl get serviceПосле этого ваш сервис не будет доступен через внешний сетевой балансировщик.
-
В L7-балансировщике назначьте обработчику публичный IP-адрес, который ранее был у внешнего сетевого балансировщика:
-
Откройте конфигурационный файл, который вы использовали для создания L7-балансировщика (
alb-int-nlb-http.tfилиalb-int-nlb-https.tf). -
Измените в описании балансировщика значение параметра
addressв блокеlistener.endpoint.address.external_ipv4_address:resource "yandex_alb_load_balancer" "<имя_балансировщика>" { ... listener { ... endpoint { address { external_ipv4_address { address = <публичный_IP-адрес_сервиса> } } ports = [ <порт_сервиса> ] } } }Где
address— это публичный IP-адрес, который ранее был у сетевого балансировщика. -
Примените изменения:
-
В терминале перейдите в папку, где вы отредактировали конфигурационный файл.
-
Проверьте корректность конфигурационного файла с помощью команды:
terraform validateЕсли конфигурация является корректной, появится сообщение:
Success! The configuration is valid. -
Выполните команду:
terraform planВ терминале будет выведен список ресурсов с параметрами. На этом этапе изменения не будут внесены. Если в конфигурации есть ошибки, Terraform на них укажет.
-
Примените изменения конфигурации:
terraform apply -
Подтвердите изменения: введите в терминале слово
yesи нажмите Enter.
-
-
-
После изменения IP-адреса восстановится доступность вашего сервиса через L7-балансировщик. Наблюдайте за пользовательской нагрузкой, поступающей на L7-балансировщик, на графиках статистики работы балансировщика.
-
Удалите освободившийся статический публичный IP-адрес, который был выбран при создании L7-балансировщика.
-
Откройте конфигурационный файл, который вы использовали для создания L7-балансировщика (
alb-int-nlb-http.tfилиalb-int-nlb-https.tf). -
Удалите из файла описание ресурса
yandex_vpc_address:resource "yandex_vpc_address" "static-address" { description = "Static public IP address for the Application Load Balancer" name = "alb-static-address" external_ipv4_address { zone_id = "ru-central1-a" ddos_protection_provider = "qrator" } } -
Примените изменения:
-
В терминале перейдите в папку, где вы отредактировали конфигурационный файл.
-
Проверьте корректность конфигурационного файла с помощью команды:
terraform validateЕсли конфигурация является корректной, появится сообщение:
Success! The configuration is valid. -
Выполните команду:
terraform planВ терминале будет выведен список ресурсов с параметрами. На этом этапе изменения не будут внесены. Если в конфигурации есть ошибки, Terraform на них укажет.
-
Примените изменения конфигурации:
terraform apply -
Подтвердите изменения: введите в терминале слово
yesи нажмите Enter.
-
-
Не сохранять публичный IP-адрес для вашего сервиса
-
Чтобы мигрировать пользовательскую нагрузку с внешнего сетевого балансировщика на L7-балансировщик, в DNS-сервисе, обслуживающем публичную зону вашего домена, измените значение A-записи для доменного имени сервиса на публичный IP-адрес L7-балансировщика. Если публичная зона домена была создана в Yandex Cloud DNS, то измените запись по инструкции.
Примечание
Миграция нагрузки может выполняться долго, так как распространение изменений в записи DNS зависит от времени жизни записи (TTL) и количества звеньев цепочки DNS-запросов.
-
По мере распространения изменений в записи DNS наблюдайте за ростом запросов, поступающих на L7-балансировщик, на графиках статистики работы балансировщика.
-
Наблюдайте за снижением нагрузки на внешний сетевой балансировщик с помощью метрик балансировщика
processed_bytesиprocessed_packets. Для визуализации этих метрик можно создать дашборд. Если нагрузка на сетевом балансировщике долгое время отсутствует, то перенос на L7-балансировщик завершен. -
(Опционально) После переноса пользовательской нагрузки на L7-балансировщик удалите внешний сетевой балансировщик. Выберите вариант, который соответствует способу первоначального развертывания вашего Ingress-контроллера NGINX:
С помощью Helm-чартаС помощью манифеста-
В файле
values.yaml, который вы использовали для конфигурации Ingress-контроллера NGINX, в секцииcontroller.service.externalустановите значение параметраenabled: false. Остальные параметры в файле оставьте без изменений.controller: service: external: enabled: false ... -
Примените изменения конфигурации Ingress-контроллера NGINX с помощью команды:
helm upgrade <имя_Ingress-контроллера_NGINX> -f values.yaml <чарт_для_Ingress-контроллера_NGINX> -n <пространство_имен>
Важно
При изменении конфигурации Ingress-контроллера NGINX ваш сервис временно будет недоступен.
Удалите ресурс
Serviceдля внешнего сетевого балансировщика с помощью команды:kubectl delete service <имя_ресурса_Service_для_внешнего_сетевого_балансировщика> -
-
(Опционально) Дождитесь удаления внешнего сетевого балансировщика для Ingress-контроллера NGINX и удаления соответствующего ему объекта
Service. Посмотреть информацию о сервисах вы можете с помощью команды:kubectl get service