Настройка режима управления целевыми группами для сетевых балансировщиков
Режим управления целевыми группами настраивается в сервисе Kubernetes — ресурсе Service типа LoadBalancer. По настройкам сервиса контроллер Managed Service for Kubernetes автоматически создает сетевой балансировщик нагрузки Network Load Balancer, который направляет трафик на узлы кластера.
По умолчанию балансировщики нагрузки используют общую целевую группу, включающую все узлы кластера. Балансировщик проверяет доступность всех узлов кластера, даже если поды приложения, к которому он направляет трафик, размещены только на нескольких из них.
Чтобы сократить число проверяемых узлов, для сервиса с политикой externalTrafficPolicy: Local можно настроить режим управления целевыми группами v2. Контроллер создаст для сетевого балансировщика отдельную целевую группу с узлами, на которых размещены поды приложения, и будет обновлять ее. Вы можете задать режим при создании сервиса или настроить в уже существующем.
Важно
Режим v2 доступен в релизном канале RAPID и требует предварительного подключения на стороне Yandex Cloud. Для подключения обратитесь в техническую поддержку — укажите идентификатор облака и идентификатор кластера.
После подключения настройте режим v2 по инструкции.
Чтобы настроить режим управления целевыми группами:
- Подготовьтесь к работе.
- Создайте сервис типа
LoadBalancerили включите режимv2и политикуLocalдля существующего сервиса. - Проверьте состав целевой группы и доступность приложения.
Перед началом работы
-
Убедитесь, что кластер использует релизный канал
RAPID. Режимv2с политикойLocalпока доступен только в этом канале. -
Обратитесь в техническую поддержку. Укажите идентификатор облака и идентификатор кластера. Запросите подключение режима
v2и дождитесь подтверждения подключения. -
Установите kubectl
и настройте его на работу с созданным кластером Managed Service for Kubernetes. -
Проверьте квоты и лимиты Network Load Balancer: в режиме
v2для каждого сервиса сLocalсоздается отдельная целевая группа. При необходимости запросите увеличение квот. -
Проверьте права сервисного аккаунта кластера и группы безопасности по инструкции подготовки инфраструктуры.
-
Подготовьте приложение. В примерах используется приложение в пространстве имен
default, поды которого имеют меткуapp: demoи принимают TCP-трафик на порте8080. Замените эти параметры своими значениями. -
Проверьте готовность подов и их размещение:
kubectl -n default get pods -l app=demo -o wide
Создайте сервис типа LoadBalancer
Чтобы создать сервис типа LoadBalancer, для которого контроллер автоматически создаст сетевой балансировщик с отдельной целевой группой:
-
Сохраните спецификацию сервиса в файл
app-lb.yaml:apiVersion: v1 kind: Service metadata: name: app-lb namespace: default annotations: yandex.cloud/controller-reconcile-mode: "v2" spec: type: LoadBalancer externalTrafficPolicy: Local selector: app: demo ports: - name: http port: 80 targetPort: 8080 protocol: TCPГде:
type: LoadBalancerв разделеspec— тип сервиса, для которого контроллер автоматически создает сетевой балансировщик нагрузки.yandex.cloud/controller-reconcile-mode: "v2"в разделеmetadata.annotations— аннотация, которая включает режим управления целевыми группамиv2.externalTrafficPolicy: Localв разделеspec— политика, при которой узел направляет внешний трафик только в поды приложения на этом же узле. В сочетании с режимомv2целевая группа включает только узлы с подами, выбранными селектором сервиса.
Дополнительные параметры приведены в справочнике Service.
-
Создайте сервис:
kubectl apply -f app-lb.yaml -
Дождитесь появления IP-адреса сетевого балансировщика в поле
EXTERNAL-IPсервиса:kubectl -n default get service app-lb --watchПоявление адреса еще не подтверждает готовность приложения. Проверьте результат.
Включите режим v2 для существующего сервиса типа LoadBalancer
Миграция существующего сервиса типа LoadBalancer на v2 поддерживается без простоя. Чтобы включить режим управления v2 для существующего сервиса:
-
Сохраните конфигурацию сервиса:
kubectl -n default get service app-lb -o yaml > app-lb-backup.yamlЗапишите адрес балансировщика, состав целевой группы и результаты проверок доступности. Убедитесь, что приложение доступно через балансировщик.
-
Проверьте политику трафика в настройках сервиса:
kubectl -n default get service app-lb -o jsonpath='{.spec.externalTrafficPolicy}'Для сокращения целевой группы нужна политика
Local. Если установлено значениеCluster, проверьте, подходит ли приложению политикаLocal. Чтобы перейти на нее, изменитеspec.externalTrafficPolicyв исходном манифесте сервиса и примените конфигурацию. Со значениемClusterрежимv2не сокращает список целей. -
Добавьте аннотацию в объект
Service:kubectl -n default annotate service app-lb \ yandex.cloud/controller-reconcile-mode=v2 --overwriteКоманда не меняет
externalTrafficPolicy. Контроллер обновит облачные ресурсы и удалит ресурсы прежнего режима, когда они больше не используются.Если сервис управляется через Helm или GitOps, сохраните аннотацию в исходной конфигурации. Иначе последующая синхронизация может вернуть прежнее значение.
-
Проверьте результат. При переводе нескольких сервисов включайте режим
v2для них по очереди.
Проверьте результат
После создания сервиса или изменения режима управления целевыми группами в его настройках:
-
Посмотрите настройки и события сервиса:
kubectl -n default get service app-lb -o yaml kubectl -n default describe service app-lb -
Посмотрите размещение подов приложения, сведения о подах в объектах
EndpointSlice, связанных с сервисом, и адреса узлов:kubectl -n default get pods -l app=demo -o wide kubectl -n default get endpointslices \ -l kubernetes.io/service-name=app-lb -o yaml kubectl get nodes -o wide -
Найдите сетевой балансировщик, созданный для сервиса, и посмотрите состав подключенной целевой группы. Для сочетания
v2иLocalцели должны соответствовать узлам с подами приложения, выбранными селектором сервиса. Сравнивайте набор узлов, а не количество подов или записейEndpointSlice. -
Проверьте состояние целевых ресурсов и выполните запрос к приложению через адрес сетевого балансировщика. Если приложение обслуживает HTTP, выполните команду:
curl http://<ip_адрес_балансировщика>/
Изменения группы и результаты проверок доступности обновляются асинхронно. Для проверки на тестовом приложении измените количество реплик или размещение подов и убедитесь, что группа обновилась.
Вернитесь к режиму legacy
Чтобы сетевой балансировщик снова использовал общую целевую группу со всеми узлами кластера, задайте значение legacy в аннотации объекта Service:
kubectl -n default annotate service app-lb \
yandex.cloud/controller-reconcile-mode=legacy --overwrite
Если сервис управляется через Helm или GitOps, также сохраните изменения в исходной конфигурации. Проверьте результат.
Устранение неполадок
Если результат отличается от ожидаемого, проверьте следующие условия:
|
Проблема |
Что проверить |
|
В группе остаются все узлы |
Политику |
|
Новый узел не появился в группе |
Наличие подов в |
|
Узел есть в группе, но не проходит проверку доступности |
Готовность подов, параметры сервиса, порт проверки и группы безопасности. |
|
У сервиса нет внешнего адреса |
События сервиса, ошибки создания балансировщика, квоты и права сервисного аккаунта кластера. |
Если состав группы не соответствует размещению подов после завершения операций, сохраните YAML-описание сервиса, события и время изменения для обращения в техническую поддержку. Не удаляйте системные записи в поле metadata.finalizers и общие целевые группы вручную.