Модуль alb реализует прикладной балансировщик нагрузки (ALB, Application Load Balancer) в Deckhouse Platform (DP) и позволяет публиковать приложения с помощью Kubernetes Gateway API. Он разворачивает и настраивает инфраструктуру для приёма и маршрутизации внешних запросов, а также проверяет пользовательскую конфигурацию Gateway API. ALB реализован на основе Open Source-проекта Envoy.
Модуль работает со следующими кастомными ресурсами API-группы network.deckhouse.io:
- ClusterALBInstance — определяет экземпляр ALB (data-plane) в масштабе всего кластера, используется для общих или платформенных Gateway;
- ALBInstance — определяет экземпляр ALB в рамках пользовательского неймспейса, используется для Gateway уровня приложения или проекта.
Подробнее с описанием настройки и примерами использования модуля можно ознакомиться в разделе документации модуля.
Архитектура модуля
Для упрощения схемы приняты следующие допущения:
- На схеме показано, что контейнеры разных подов взаимодействуют друг с другом напрямую. Фактически они взаимодействуют через соответствующие сервисы Kubernetes (внутренние балансировщики). Названия сервисов не указываются, если они очевидны из контекста. В остальных случаях название сервиса указано над стрелкой.
- Поды могут быть запущены в нескольких репликах, однако на схеме все поды изображены в одной реплике.
Архитектура модуля alb на уровне 2 модели C4 и его взаимодействие с другими компонентами DP изображены на следующей диаграмме:
Компоненты модуля
Модуль состоит из следующих компонентов:
-
Gateway-controller (Deployment) — центральный контроллер модуля, который выполняет следующие действия:
- управляет кастомными ресурсами ClusterALBInstance и ALBInstance;
- устанавливает CRD ресурсов Gateway API (API-группу
gateway.networking.k8s.io); - реализует контроллер Gateway API для GatewayClass
d8-albи создаёт ресурс Gateway для каждого инстанса; - выполняет валидацию кастомных ресурсов ClusterALBInstance, ALBInstance и ресурсов API-группы
gateway.networking.k8s.ioчерез механику Validating Admission Controllers; - создаёт временные объекты Ingress для HTTP-01 challenge cert-manager поверх HTTPRoute при миграции с
ingress-nginx; - создаёт и удаляет компоненты proxy и geoproxy на каждый ClusterALBInstance или ALBInstance;
- предоставляет Graph API интерфейс для получения графа связей ресурсов Gateway API модулем console.
Состоит из следующих контейнеров:
- gateway-controller — основной контейнер;
- kube-rbac-proxy — сайдкар-контейнер с авторизующим прокси на основе Kubernetes RBAC для организации защищённого доступа к метрикам и graph API gateway-controller.
-
Proxy-configurator (Deployment) — управляющий компонент Gateway API, собранный на основе Istio Pilot (istiod) только для работы с Gateway API (инжект сайдкаров и штатный механизм создания инфраструктуры Gateway API у istiod выключены).
Компонент предоставляет следующие возможности:
- реализует control plane управления трафиком;
- формирует и валидирует конфигурацию envoy-прокси на основе ресурсов Gateway, HTTPRoute, GRPCRoute, TCPRoute, UDPRoute, TLSRoute и ListenerSet;
- выпускает и обновляет сертификаты для envoy-прокси, используя встроенный сервер сертификации;
- распространяет конфигурацию envoy-прокси по компонентам proxy с использованием протокола xDS (семейство стандартизированных API-протоколов для динамической конфигурации компонентов передачи данных);
- обновляет статусы ресурсов Gateway, HTTPRoute, GRPCRoute, TCPRoute, UDPRoute, TLSRoute и ListenerSet.
Состоит из одного контейнера proxy-configurator.
-
Proxy (Deployment или DaemonSet) — экземпляр Envoy, реализующий data plane управления трафиком, принимает и маршрутизирует внешний трафик по конфигурации, полученной от proxy-configurator по протоколу xDS.
Gateway-controller создаёт этот компонент динамически на каждый кастомный ресурс ClusterALBInstance или ALBInstance. Тип рабочей нагрузки зависит от вида ресурса: ClusterALBInstance разворачивается как DaemonSet, ALBInstance — как Deployment за Service.
Состоит из следующих контейнеров:
- geo-downloader-init — опциональный init-контейнер, скачивает базу GeoIP перед стартом Envoy;
- geo-downloader — опциональный сайдкар-контейнер, периодически обновляет локальную копию базы GeoIP;
- proxy — основной контейнер;
- kube-rbac-proxy — сайдкар-контейнер с авторизующим прокси на основе Kubernetes RBAC для организации защищённого доступа к метрикам основного контейнера.
Gateway-controller добавляет два первых контейнера, только если у ресурса ClusterALBInstance или ALBInstance задан параметр
spec.geoIP. -
Geoproxy (StatefulSet) — кеширующий прокси-сервер для компонента proxy, который предоставляет быстрый доступ к базе данных GeoIP, загружаемой у провайдера MaxMind. Компонент также обеспечивает доступ к уже загруженным базам в кластерах без выхода в интернет, что повышает стабильность работы контроллера Gateway API с GeoIP-базами.
Компонент предоставляет следующие возможности:
- экономия лицензий MaxMind (загрузка баз происходит из одной точки раз в сутки);
- постоянное хранение данных (перезагрузка компонентов не приводит к повторным обращениям к серверам MaxMind);
- возможность указать своё зеркало для загрузки баз.
Gateway-controller создаёт этот компонент программно на каждый ClusterALBInstance и ALBInstance, только если у ресурса задан параметр
spec.geoIP.licenseKeySecretRef, содержащий ссылку на Secret с лицензионным ключом MaxMind.Состоит из одного контейнера geoproxy.
-
Module-cleanup-waiter (Job) — Helm
pre-deleteхук модуля, запускаемый контроллером Deckhouse перед удалением модуляalb, который ожидает, пока gateway-controller завершит очистку ресурсов модуля, и только после этого позволяет закончить удаление релиза. Не участвует в штатной работе модуля.
Взаимодействия модуля
Модуль взаимодействует со следующими компонентами:
-
Kube-apiserver:
- устанавливает ресурсы API-группы
gateway.networking.k8s.io; - управляет DaemonSet, Deployment, StatefulSet, Service, Secret и ConfigMap;
- получает и обновляет ресурсы Node и Namespace;
- управляет кастомными ресурсами ClusterALBInstance и ALBInstance, Ingress и ресурсами Gateway API (API-группы
gateway.networking.k8s.io); - авторизует запросы на получение метрик и graph API компонента gateway-controller, а также метрик компонента proxy.
- устанавливает ресурсы API-группы
-
Источник данных GeoIP (провайдер MaxMind или зеркало) — скачивает базу данных GeoIP.
С модулем взаимодействуют следующие внешние компоненты:
-
Kube-apiserver — валидирует кастомные ресурсы ClusterALBInstance, ALBInstance и ресурсов Gateway API (API-группа
gateway.networking.k8s.io). -
Prometheus-main — собирает метрики компонентов gateway-controller и proxy.
-
Балансировщик нагрузки — балансировка входящего трафика между экземплярами компонента proxy.
-
Веб-интерфейс Deckhouse — запрашивает граф связей ресурсов Gateway API для визуализации.