Миграция сервисов с балансировщика NLB с целевыми ресурсами из кластера Yandex Managed Service for Kubernetes на L7-балансировщик ALB с помощью Terraform
Чтобы мигрировать сервис с сетевого балансировщика на L7-балансировщик:
- Ознакомьтесь с рекомендациями по миграции сервисов.
- Создайте инфраструктуру. На этом этапе вы подключите профиль безопасности Smart Web Security к виртуальному хосту L7-балансировщика.
- Установите Ingress-контроллер Application Load Balancer и создайте ресурсы в кластере Managed Service for Kubernetes. На этом этапе вы подключите профиль безопасности Smart Web Security к L7-балансировщику.
- Проверьте работу 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-балансировщика будут созданы по две ресурсные единицы в каждой из подсетей, которые будут указаны при создании ресурса
Ingress
. В аннотацияхIngress
-ресурса не поддерживается указание минимального количества ресурсных единиц L7-балансировщика. Группа ресурсных единиц автоматически масштабируется в зависимости от внешней нагрузки на узлы балансировщика. -
Функциональные возможности балансировщика Application Load Balancer могут отличаться от возможностей, используемых в вашем балансировщике, развернутом в кластере Managed Service for Kubernetes. Ознакомьтесь с описанием Ingress-контроллера Application Load Balancer и принципами его работы.
Создайте инфраструктуру
-
Если у вас еще нет Terraform, установите его.
-
Получите данные для аутентификации. Вы можете добавить их в переменные окружения или указать далее в файле с настройками провайдера.
-
Настройте и инициализируйте провайдер. Чтобы не создавать конфигурационный файл с настройками провайдера вручную, скачайте его
. -
Поместите конфигурационный файл в отдельную рабочую директорию и укажите значения параметров. Если данные для аутентификации не были добавлены в переменные окружения, укажите их в конфигурационном файле.
-
Скачайте в ту же рабочую директорию файл конфигурации в зависимости от используемого протокола:
HTTP
— файл конфигурации alb-k8s-http.tf .HTTPS
— файл конфигурации alb-k8s-https.tf .
В этих файлах описаны:
- подсети для L7-балансировщика;
- группа безопасности для L7-балансировщика;
- статический адрес для L7-балансировщика;
- импорт TLS-сертификата в Certificate Manager (если используется протокол
HTTPS
); - профиль безопасности Smart Web Security.
-
В конфигурационном файле укажите значения переменных:
domain_name
— имя домена вашего сервиса.network_id
— идентификатор сети, в которой находятся виртуальные машины из целевой группы сетевого балансировщика нагрузки.certificate
(если используется протоколHTTPS
) — путь к файлу самоподписанного пользовательского сертификата.private_key
(если используется протоколHTTPS
) — путь к файлу с закрытым ключом.
-
Проверьте корректность файлов конфигурации Terraform с помощью команды:
terraform validate
Если в файлах конфигурации есть ошибки, Terraform на них укажет.
-
Создайте необходимую инфраструктуру:
-
Выполните команду для просмотра планируемых изменений:
terraform plan
Если конфигурации ресурсов описаны верно, в терминале отобразится список изменяемых ресурсов и их параметров. Это проверочный этап: ресурсы не будут изменены.
-
Если вас устраивают планируемые изменения, внесите их:
-
Выполните команду:
terraform apply
-
Подтвердите изменение ресурсов.
-
Дождитесь завершения операции.
-
В указанном каталоге будут созданы все требуемые ресурсы. Проверить появление ресурсов и их настройки можно в консоли управления
. -
Установите Ingress-контроллер Application Load Balancer и создайте ресурсы в кластере Managed Service for Kubernetes
-
Установите Ingress-контроллер Yandex Application Load Balancer.
-
Создайте ресурс IngressClass для Ingress-контроллера L7-балансировщика:
-
Создайте YAML-файл, в котором опишите ресурс
IngressClass
.Пример ресурса
IngressClass
:apiVersion: networking.k8s.io/v1 kind: IngressClass metadata: labels: app.kubernetes.io/component: controller name: ingress-alb spec: controller: ingress.alb.yc.io/yc-alb-ingress-controller
-
Создайте ресурс
IngressClass
с помощью команды:kubectl apply -f <файл_с_ресурсом_IngressClass>
-
-
Создайте ресурс
Ingress
:-
Ознакомьтесь с описанием полей и аннотаций ресурса
Ingress
и примером. -
Создайте YAML-файл, в котором опишите ресурс
Ingress
:-
Заполните раздел annotations для настроек L7-балансировщика:
-
ingress.alb.yc.io/subnets
— идентификаторы подсетей в трех зонах доступности для узлов L7-балансировщика. Идентификаторы перечисляются через запятую без пробелов. -
ingress.alb.yc.io/security-groups
— идентификатор одной или нескольких групп безопасности для L7-балансировщика. Идентификаторы нескольких групп перечисляются через запятую без пробелов. -
ingress.alb.yc.io/external-ipv4-address
— зарезервированный ранее статический публичный IP-адрес. -
ingress.alb.yc.io/group-name
— имя группы ресурсовIngress
. РесурсыIngress
объединяются в группы, каждая из которых обслуживается отдельным экземпляром Application Load Balancer с отдельным публичным IP-адресом. -
ingress.alb.yc.io/security-profile-id
— идентификатор созданного ранее профиля безопасности Smart Web Security.Важно
Профиль безопасности будет привязан к виртуальному хосту L7-балансировщика. Указание профиля безопасности является ключевым шагом для подключения сервиса Smart Web Security.
-
ingress.alb.yc.io/autoscale-min-zone-size
— минимальное количество ресурсных единиц в каждой зоне доступности в соответствии с ожидаемой нагрузкой на ваш сервис.Количество ресурсных единиц рекомендуется выбирать на основе нагрузки на ваш сервис, измеряемой в следующих величинах:
- количество запросов в секунду (RPS);
- количество одновременных активных соединений;
- количество новых соединений в секунду;
- объем трафика в секунду.
-
-
Для поля
ingressClassName
укажите имя созданного ранее ресурсаIngressClass
. -
При использовании протокола HTTPS заполните раздел tls:
hosts
— доменное имя вашего сервиса, которому соответствует TLS-сертификат.secretName
— TLS-сертификат вашего сервиса в Yandex Certificate Manager в форматеyc-certmgr-cert-id-<идентификатор_сертификата>
.
-
Заполните раздел rules в соответствии с правилами распределения входящего трафика по бэкендам в зависимости от доменного имени (поле
host
) и запрашиваемого ресурса (полеhttp.paths
):-
host
— имя домена вашего сервиса. -
pathType
— тип указания на запрашиваемый ресурс:Exact
— путь в URI запроса должен совпадать со значением поляpath
.Prefix
— путь в URI запроса должен начинаться со значения поляpath
.
-
path
— путь в URI входящего запроса (если типExact
) или его начало (если типPrefix
). -
backend
— указание на бэкенд или группу бэкендов, которые должны обрабатывать запросы с указанным доменным именем и путем в URI. Укажите либо сервис-бэкенд (service
), либо группу бэкендов (resource
), но не оба одновременно:-
service
— сервис Managed Service for Kubernetes, который должен обрабатывать запросы в качестве бэкенда:name
— имя сервиса Managed Service for Kubernetes. РесурсService
, на который указывает это поле, должен быть описан по конфигурации.port
— порт сервиса, к которому будет обращатьсяIngress
. Для порта сервиса укажите либо номер (number
), либо имя (name
), но не оба одновременно.
Важно
Сервисы Managed Service for Kubernetes, используемые в качестве бэкендов, должны иметь тип
NodePort
. -
resource
— указание на группу бэкендовHttpBackendGroup
, которые должны обрабатывать запросы. Бэкендами в такой группе могут быть сервисы Managed Service for Kubernetes и бакеты Yandex Object Storage. При использовании группы бэкендов доступна расширенная функциональность Application Load Balancer. Также можно указывать относительные веса бэкендов для пропорционального распределения трафика между ними.kind
—HttpBackendGroup
.name
— имя группы бэкендов. Оно должно совпадать с именем, указанным в полеmetadata.name
ресурсаHttpBackendGroup
. РесурсHttpBackendGroup
, на который указывает это поле, должен быть описан по конфигурации.apiGroup
—alb.yc.io
.
-
-
Пример ресурса
Ingress
:apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: <имя_ресурса> annotations: ingress.alb.yc.io/subnets: <идентификатор_подсети_ru-central1-a,идентификатор_подсети_ru-central1-b,идентификатор_подсети_ru-central1-d> ingress.alb.yc.io/security-groups: <идентификатор_группы_безопасности_L7-балансировщика> ingress.alb.yc.io/external-ipv4-address: <статический_публичный_IP-адрес> ingress.alb.yc.io/group-name: <имя_группы_ресурсов> ingress.alb.yc.io/security-profile-id: <идентификатор_профиля_безопасности_Smart_Web_Security> ingress.alb.yc.io/autoscale-min-zone-size: <минимальное_количество_ресурсных_единиц_L7-балансировщика_в_каждой_зоне> spec: ingressClassName: <имя_ресурса_IngressClass> tls: - hosts: - <имя_домена_сервиса> secretName: yc-certmgr-cert-id-<идентификатор_сертификата> rules: - host: <имя_домена_сервиса> http: paths: - path: / pathType: Prefix backend: service: name: <имя_сервиса_Kubernetes> port: number: <номер_порта,_например_443>
-
-
Создайте ресурс
Ingress
с помощью команды:kubectl apply -f <файл_с_ресурсом_Ingress>
-
-
По конфигурации ресурса
Ingress
будет развернут L7-балансировщик. Дождитесь завершения его создания и привязки кIngress
публичного IP-адреса. Этот IP-адрес понадобится для проверки запросов. Посмотреть информацию о ресурсе вы можете с помощью команды:kubectl get ingress <имя_ресурса_Ingress> -w
Проверьте работу L7-балансировщика
Протестируйте запрос к сервису через L7-балансировщик. Например, одним из способов:
-
В файле
hosts
на рабочей станции добавьте запись<публичный_IP-адрес_L7-балансировщика> <имя_домена_сервиса>
. Удалите запись после тестирования. -
Выполните запрос с помощью cURL
в зависимости от типа протокола:curl http://<имя_домена_сервиса> \ --resolve <имя_домена_сервиса>:<порт_сервиса>:<публичный_IP-адрес_L7-балансировщика>
curl https://<имя_домена_сервиса> \ --resolve <имя_домена_сервиса>:<порт_сервиса>:<публичный_IP-адрес_L7-балансировщика>
Мигрируйте пользовательскую нагрузку с сетевого балансировщика на L7-балансировщик
Выберите один из вариантов миграции:
- Сохранить публичный IP-адрес для вашего сервиса.
- Не сохранять публичный IP-адрес для вашего сервиса.
Сохранить публичный IP-адрес для вашего сервиса
-
Если у сетевого балансировщика используется динамический публичный IP-адрес, сделайте его статическим.
-
В сетевом балансировщике удалите все обработчики для освобождения статического публичного IP-адреса. После этого ваш сервис не будет доступен через сетевой балансировщик.
-
В L7-балансировщике назначьте обработчику публичный IP-адрес, который ранее был у сетевого балансировщика:
-
Откройте YAML-файл с описанием ресурса
Ingress
. -
В разделе
annotations
для поляingress.alb.yc.io/external-ipv4-address
укажите публичный IP-адрес, который ранее был у сетевого балансировщика. -
Примените изменения с помощью команды:
kubectl apply -f <файл_с_ресурсом_Ingress>
-
-
Дождитесь завершения изменения публичного IP-адреса у ресурса
Ingress
. Посмотреть информацию о ресурсе вы можете с помощью команды:kubectl get ingress <имя_ресурса_Ingress> -w
После изменения IP-адреса восстановится доступность вашего сервиса через L7-балансировщик.
-
Перейдите в L7-балансировщик:
- В консоли управления
перейдите в каталог, в котором находится кластер Managed Service for Kubernetes. - Выберите сервис Managed Service for Kubernetes.
- Выберите нужный кластер.
- Слева выберите
Сеть, а в правой части — вкладку Ingress. Для вашегоIngress
-ресурса в столбце Балансировщик перейдите по ссылке на L7-балансировщик. - Наблюдайте за пользовательской нагрузкой, поступающей на L7-балансировщик, на графиках статистики работы балансировщика.
- В консоли управления
-
Удалите освободившийся статический публичный IP-адрес, который был зарезервирован для L7-балансировщика:
-
Откройте конфигурационный файл, который вы использовали для создания L7-балансировщика (
alb-k8s-http.tf
илиalb-k8s-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.
-
-
-
(Опционально) После переноса пользовательской нагрузки на L7-балансировщик удалите сетевой балансировщик.
Не сохранять публичный IP-адрес для вашего сервиса
-
Чтобы мигрировать пользовательскую нагрузку с сетевого балансировщика на L7-балансировщик, в DNS-сервисе, обслуживающем публичную зону вашего домена, измените значение А-записи для доменного имени сервиса на публичный IP-адрес L7-балансировщика. Если публичная зона домена была создана в Yandex Cloud DNS, то измените запись по инструкции.
Примечание
Распространение изменений в записи DNS зависит от значения времени жизни записи (TTL) и количества звеньев цепочки DNS-запросов. Это может занять продолжительное время.
-
По мере распространения изменений в записи DNS наблюдайте за ростом запросов, поступающих на L7-балансировщик:
- В консоли управления
перейдите в каталог, в котором находится кластер Managed Service for Kubernetes. - Выберите сервис Managed Service for Kubernetes.
- Выберите нужный кластер.
- Слева выберите
Сеть, а в правой части — вкладку Ingress. Для вашегоIngress
-ресурса в столбце Балансировщик перейдите по ссылке на L7-балансировщик. - Наблюдайте за пользовательской нагрузкой, поступающей на L7-балансировщик, на графиках статистики работы балансировщика.
- В консоли управления
-
Наблюдайте за снижением нагрузки на сетевой балансировщик с помощью метрик балансировщика
processed_bytes
иprocessed_packets
. Для визуализации этих метрик можно создать дашборд. Отсутствие нагрузки на сетевом балансировщике в течение продолжительного времени свидетельствует о том, что перенос пользовательской нагрузки на L7-балансировщик завершен. -
(Опционально) После переноса пользовательской нагрузки на L7-балансировщик удалите сетевой балансировщик.