Миграция сервисов с внешнего балансировщика NLB на L7-балансировщик ALB с целевым ресурсом — внутренним сетевым балансировщиком NLB
Сетевой балансировщик Yandex Network Load Balancer может распределять трафик на поды вашего балансировщика, развернутые в кластере Yandex Managed Service for Kubernetes. Если функциональность, настроенная в вашем балансировщике, не поддерживается в Yandex Application Load Balancer, то вы можете добавить внутренний сетевой балансировщик для распределения трафика на поды вашего балансировщика и подключить внутренний сетевой балансировщик в качестве целевого ресурса для L7-балансировщика Application Load Balancer с профилем безопасности Yandex Smart Web Security.
В этом практическом руководстве рассмотрен вариант, при котором создается внутренний сетевой балансировщик для балансировки трафика на поды Ingress-контроллера NGINX, развернутые в кластере Managed Service for Kubernetes, и в целевой группе L7-балансировщика указывается IP-адрес внутреннего сетевого балансировщика.
Схема работы L7-балансировщика с подключенным профилем безопасности Smart Web Security:
Чтобы мигрировать сервис с внешнего сетевого балансировщика на L7-балансировщик:
- Ознакомьтесь с рекомендациями по миграции сервисов.
- Выполните подготовительные действия.
- Создайте профиль безопасности Smart Web Security.
- Создайте внутренний сетевой балансировщик для Ingress-контроллера NGINX.
- Создайте L7-балансировщик. На этом этапе вы подключите профиль безопасности Smart Web Security к виртуальному хосту L7-балансировщика.
- Мигрируйте пользовательскую нагрузку с внешнего сетевого балансировщика на L7-балансировщик.
Рекомендации по миграции сервисов
-
Дополнительно к защите от DDoS-атак на уровне L7 модели OSI с помощью Yandex Smart Web Security рекомендуется подключить защиту от DDoS-атак на уровне L3-L4. Для этого заранее зарезервируйте статический публичный IP-адрес с защитой от DDoS-атак и используйте этот адрес для обработчика L7-балансировщика.
Если у обработчика сетевого балансировщика уже используется публичный IP-адрес с защитой от DDoS, то вы сможете сохранить его и перенести в L7-балансировщик.
Если у обработчика сетевого балансировщика используется публичный IP-адрес без защиты от DDoS, то для защиты от DDoS-атак на уровне L3-L4 миграция на L7-балансировщик возможна только со сменой публичного IP-адреса для вашего сервиса.
При использовании защиты от DDoS-атак на уровне L3-L4 настройте порог для срабатывания механизмов защиты на уровне L3-L4, который будет соответствовать объему легитимного трафика на защищаемый ресурс. Для настройки такого порога обратитесь в техническую поддержку
.Также задайте значение MTU равным
1450
на целевых ресурсах за балансировщиком. Подробнее см. в разделе Настроить MTU при включении защиты от DDoS-атак. -
Работы по миграции рекомендуется проводить в часы наименьшей пользовательской нагрузки. Если вы планируете сохранить публичный IP-адрес, то учитывайте, что при миграции этот IP-адрес будет переноситься с сетевого балансировщика на L7-балансировщик. В это время ваш сервис будет недоступен. Время недоступности сервиса в штатном режиме может занимать несколько минут.
-
При использовании L7-балансировщика запросы на бэкенды приходят с IP-адресом источника из диапазона внутренних IP-адресов подсетей, указанных при создании L7-балансировщика. Исходный IP-адрес источника запроса (пользователя) фигурирует в заголовке
X-Forwarded-For
. Если необходимо журналировать публичные IP-адреса пользователей на веб-сервере, измените его конфигурацию. -
Ознакомьтесь с автомасштабированием и ресурсными единицами в L7-балансировщике.
Перед началом работы
-
Создайте подсети в трех зонах доступности. Эти подсети будут использоваться для L7-балансировщика.
-
Создайте группы безопасности, которые разрешают L7-балансировщику получать входящий трафик и отправлять его на целевые ресурсы, а также разрешают целевым ресурсам получать входящий трафик от балансировщика.
-
При использовании протокола HTTPS добавьте TLS-сертификат вашего сервиса в Yandex Certificate Manager.
-
Зарезервируйте публичный статический IP-адрес с защитой от DDoS на уровне L3-L4 для L7-балансировщика. См. рекомендации по миграции сервисов.
Создайте профиль безопасности Smart Web Security
Создайте профиль безопасности Smart Web Security, выбрав вариант создания По преднастроенному шаблону.
При создании профиля задайте настройки:
- В поле Действие для базового правила по умолчанию выберите
Разрешить
. - Для правила Smart Protection включите опцию Только логирование (dry run).
С этими настройками будет выполняться только логирование информации о трафике без применения к нему каких-либо действий. Это позволит снизить риск отключения пользователей из-за проблем в настройке профиля. Постепенно вы сможете отключить опцию Только логирование (dry run) и настроить правила с запрещающими действиями в профиле безопасности для вашего сценария.
Создайте внутренний сетевой балансировщик для 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: <номер_порта_для_HTTP,_например_80> targetPort: <номер_порта_пода_Ingress-контроллера_NGINX_для_HTTP,_например_80> protocol: TCP name: http - port: <номер_порта_для_HTTPS,_например_443> targetPort: <номер_порта_пода_Ingress-контроллера_NGINX_для_HTTPS,_например_443> protocol: TCP name: https selector: <селекторы_подов_Ingress-контроллера_NGINX>
-
Примените изменения с помощью команды:
kubectl apply -f <файл_с_ресурсом_Service>
-
-
Дождитесь создания внутреннего сетевого балансировщика и появления соответствующего ему объекта
Service
. Посмотреть информацию о сервисах вы можете с помощью команды:kubectl get service
Создайте L7-балансировщик
-
Создайте целевую группу L7-балансировщика. В блоке Целевые ресурсы выберите опцию Не из VPC и укажите внутренний IP-адрес внутреннего сетевого балансировщика. Нажмите кнопку Добавить целевой ресурс и далее кнопку Создать.
-
Создайте группу бэкендов со следующими параметрами:
-
Выберите тип группы бэкендов
HTTP
. -
В блоке Бэкенды нажмите кнопку Добавить и задайте настройки бэкенда:
- Тип —
Целевая группа
. - Целевые группы — созданная ранее целевая группа.
- Порт — TCP-порт, который настроен на обработчике внешнего сетевого балансировщика. Обычно это порт
80
для HTTP и443
для HTTPS. - В блоке Настройки протокола в зависимости от вашего сервиса выберите протокол
HTTP
илиHTTPS
. - В блоке HTTP проверка состояния удалите проверку состояния. Не добавляйте ее, так как в качестве целевого ресурса используется сетевой балансировщик, который является отказоустойчивым сервисом.
- Тип —
-
-
В блоке Виртуальные хосты нажмите кнопку Добавить виртуальный хост и задайте настройки виртуального хоста:
-
Authority — имя домена вашего сервиса.
-
Профиль безопасности — созданный ранее профиль безопасности Smart Web Security.
Важно
Привязка профиля безопасности к виртуальному хосту L7-балансировщика является ключевым шагом для подключения сервиса Smart Web Security.
-
Нажмите кнопку Добавить маршрут и задайте настройки маршрута:
- Путь —
Начинается с
/
. - Действие —
Маршрутизация
. - Группа бэкендов — созданная ранее группа бэкендов.
- Путь —
Вы можете добавить несколько доменов с помощью кнопки Добавить виртуальный хост.
-
-
Создайте L7-балансировщик, выбрав способ создания Вручную:
-
Укажите группу безопасности, созданную ранее.
Важно
Группы узлов в кластере Managed Service for Kubernetes должны иметь разрешающие правила в группах безопасности для входящих соединений от L7-балансировщика на диапазон портов 30000-32767 из подсетей, в которых размещается L7-балансировщик, или из его группы безопасности.
-
В блоке Размещение выберите для узлов балансировщика подсети в трех зонах доступности. Включите прием трафика в этих подсетях.
-
В блоке Настройки автомасштабирования укажите минимальное количество ресурсных единиц в каждой зоне в соответствии с ожидаемой нагрузкой на ваш сервис.
Количество ресурсных единиц рекомендуется выбрать на основе нагрузки на ваш сервис в следующих величинах:
- количество запросов в секунду (RPS);
- количество одновременных активных соединений;
- количество новых соединений в секунду;
- объем трафика в секунду.
-
В блоке Обработчики нажмите кнопку Добавить обработчик и задайте настройки обработчика:
-
В блоке Публичный IP-адрес укажите:
- Порт — TCP-порт, который настроен на обработчике внешнего сетевого балансировщика. Обычно это порт
80
для HTTP и443
для HTTPS. - Тип —
Список
. Выберите из списка публичный IP-адрес с защитой от DDoS на уровне L3-L4. Подробнее см. рекомендации по миграции сервисов.
- Порт — TCP-порт, который настроен на обработчике внешнего сетевого балансировщика. Обычно это порт
-
В блоке Приём и обработка трафика укажите:
- Тип обработчика —
HTTP
. - Протокол — в зависимости от вашего сервиса выберите протокол
HTTP
илиHTTPS
. - Если выбран протокол
HTTPS
, в поле Сертификаты укажите ваш TLS-сертификат, добавленный ранее в Certificate Manager. - HTTP-роутер — созданный ранее HTTP-роутер.
- Тип обработчика —
-
-
-
Дождитесь, когда L7-балансировщик перейдет в статус
Active
. -
Перейдите в созданный 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-адрес, который ранее был у внешнего сетевого балансировщика:
CLITerraformЕсли у вас еще нет интерфейса командной строки Yandex Cloud, установите и инициализируйте его.
По умолчанию используется каталог, указанный в профиле CLI. Вы можете указать другой каталог с помощью параметра
--folder-name
или--folder-id
.Чтобы изменить публичный IP-адрес, выполните команду:
yc application-load-balancer load-balancer update-listener <имя_балансировщика> \ --listener-name <имя_обработчика> \ --external-ipv4-endpoint address=<публичный_IP-адрес_сервиса>,port=<порт_сервиса>
Где
address
— это публичный IP-адрес, который ранее был у внешнего сетевого балансировщика.-
Откройте актуальный конфигурационный файл Terraform с планом инфраструктуры.
Как создать такой файл, см. в разделе Создать L7-балансировщик.
Более подробную информацию о параметрах ресурса
yandex_alb_load_balancer
в Terraform см. в документации провайдера . -
Измените в описании балансировщика значение параметра
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-балансировщика.
Не сохранять публичный IP-адрес для вашего сервиса
-
Чтобы мигрировать пользовательскую нагрузку с внешнего сетевого балансировщика на L7-балансировщик, в DNS-сервисе, обслуживающем публичную зону вашего домена, измените значение А-записи для доменного имени сервиса на публичный 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