Модуль 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 изображены на следующей диаграмме:

Архитектура модуля alb

Компоненты модуля

Модуль состоит из следующих компонентов:

  1. 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.
  2. 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.

  3. 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.

  4. Geoproxy (StatefulSet) — кеширующий прокси-сервер для компонента proxy, который предоставляет быстрый доступ к базе данных GeoIP, загружаемой у провайдера MaxMind. Компонент также обеспечивает доступ к уже загруженным базам в кластерах без выхода в интернет, что повышает стабильность работы контроллера Gateway API с GeoIP-базами.

    Компонент предоставляет следующие возможности:

    • экономия лицензий MaxMind (загрузка баз происходит из одной точки раз в сутки);
    • постоянное хранение данных (перезагрузка компонентов не приводит к повторным обращениям к серверам MaxMind);
    • возможность указать своё зеркало для загрузки баз.

    Gateway-controller создаёт этот компонент программно на каждый ClusterALBInstance и ALBInstance, только если у ресурса задан параметр spec.geoIP.licenseKeySecretRef, содержащий ссылку на Secret с лицензионным ключом MaxMind.

    Состоит из одного контейнера geoproxy.

  5. Module-cleanup-waiter (Job) — Helm pre-delete хук модуля, запускаемый контроллером Deckhouse перед удалением модуля alb, который ожидает, пока gateway-controller завершит очистку ресурсов модуля, и только после этого позволяет закончить удаление релиза. Не участвует в штатной работе модуля.

Взаимодействия модуля

Модуль взаимодействует со следующими компонентами:

  1. 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.
  2. Источник данных GeoIP (провайдер MaxMind или зеркало) — скачивает базу данных GeoIP.

С модулем взаимодействуют следующие внешние компоненты:

  1. Kube-apiserver — валидирует кастомные ресурсы ClusterALBInstance, ALBInstance и ресурсов Gateway API (API-группа gateway.networking.k8s.io).

  2. Prometheus-main — собирает метрики компонентов gateway-controller и proxy.

  3. Балансировщик нагрузки — балансировка входящего трафика между экземплярами компонента proxy.

  4. Веб-интерфейс Deckhouse — запрашивает граф связей ресурсов Gateway API для визуализации.

Дополнительные ресурсы