Доступно в редакциях: CE, BE, SE, SE+, EE
Стадия жизненного цикла модуля: Preview
У модуля есть требования для установки
Модуль alb реализует прикладной балансировщик нагрузки (Application Load Balancer, ALB) и позволяет публиковать приложения с помощью Kubernetes Gateway API. Он разворачивает и настраивает инфраструктуру для приёма и маршрутизации внешних запросов, а также проверяет пользовательскую конфигурацию Gateway API.
Текущая используемая версия Envoy Proxy — v1.38.3.
Модуль поддерживает:
- балансировку трафика по нескольким протоколам;
- автоматическое создание и гибкую настройку инфраструктуры для объектов Gateway (служебный ресурс для настройки точки входа трафика в кластер);
- управление приёмом входящих запросов с помощью объектов ListenerSet (пользовательский ресурс);
- маршрутизацию входящих запросов с помощью объектов HTTPRoute, GRPCRoute, TCPRoute, UDPRoute и TLSRoute (пользовательские ресурсы);
- валидацию конфигурации Gateway API.
Модуль может использоваться в кластере совместно с модулем ingress-nginx. Подробнее — в разделе «Руководство администратора».
Преимущества подхода на основе Gateway API
Модуль построен на Kubernetes Gateway API — современном стандарте управления входящим трафиком, который приходит на смену Ingress API. Опираясь на этот стандарт, модуль предоставляет:
- единый декларативный API сразу для нескольких протоколов (HTTP/HTTPS, gRPC, TCP, UDP и TLS passthrough), включая сценарии, которые не покрываются Ingress API;
- разделение ответственности между администратором кластера (инфраструктура через ClusterALBInstance и ALBInstance), администратором неймспейса (приём трафика через ListenerSet) и командой приложения (маршрутизация через HTTPRoute и другие объекты-маршруты), что упрощает мультитенантность;
- расширенные возможности обработки запросов из коробки: WAF (ModSecurity/Coraza) на уровне маршрута, внешнюю аутентификацию, списки разрешённых IP-адресов, ограничение частоты запросов, session affinity, GeoIP, BackendTLSPolicy, Proxy Protocol и HTTP/3.
Модуль может работать в кластере одновременно с модулем ingress-nginx, поэтому переходить на Gateway API можно постепенно: новые приложения публиковать через модуль, а существующие — оставлять в текущей схеме.
Отличие Kubernetes Gateway API от API Gateway
Несмотря на схожие названия, это разные понятия:
- Kubernetes Gateway API — это набор ресурсов Kubernetes (спецификация), описывающих маршрутизацию входящего трафика к сервисам. Это интерфейс конфигурации, который реализуют контроллеры, и преемник Ingress API.
- API Gateway — это архитектурный компонент (или продукт), который объединяет несколько API приложений за единой точкой входа и централизует сквозные функции: аутентификацию, авторизацию и ограничение частоты запросов для потребителей API.
Иными словами, Kubernetes Gateway API описывает, как настроить маршрутизацию трафика, а API Gateway — это разновидность инфраструктуры, которая этот трафик обрабатывает. Некоторые API Gateway можно настраивать через Kubernetes Gateway API. Модуль alb является реализацией Kubernetes Gateway API.
Сравнение возможностей модулей ingress-nginx и alb
Оба модуля решают одну задачу — приём и маршрутизацию внешнего трафика к приложениям, но опираются на разные стандарты: ingress-nginx использует Ingress API с аннотациями, а alb — Kubernetes Gateway API. Модули можно использовать в кластере одновременно (подробнее — в разделе «Руководство администратора»). В таблице ниже сравниваются их возможности в текущих версиях.
| Параметр | ingress-nginx |
alb |
|---|---|---|
| Стандарт маршрутизации | Ingress API с аннотациями | Kubernetes Gateway API |
| Реализация прокси | nginx | Envoy Proxy |
| Стадия жизненного цикла | General Availability | Preview |
| Развитие | Режим сопровождения: upstream-проект Ingress NGINX не развивает новые возможности, обновления безопасности поставляет DKP | Активно развивается |
| Минимальная версия DKP | Доступен во всех поддерживаемых версиях | 1.76 |
| Редакции DKP | Все редакции | Все редакции |
| Модель разграничения ролей | администратор кластера, администратор неймспейса | администратор кластера, администратор неймспейса, команда приложения |
| Несколько независимых точек входа | Несколько Ingress-контроллеров, выбор через ingressClass |
Несколько объектов Gateway, выбор через gatewayName; шлюзы cluster-scoped и в неймспейсе |
| HTTP/HTTPS (HTTP/1.1, HTTP/2, HTTP/3) | Есть | Есть |
| WebSocket | Есть | Есть |
| gRPC | Есть | Есть |
| FastCGI | Есть | Нет |
| TCP | Нет | Есть (TCPRoute) |
| UDP | Нет | Есть (UDPRoute) |
| TLS passthrough | Есть | Есть (TLSRoute) |
| Proxy Protocol | Есть | Есть |
| Способы приёма трафика | Инлеты LoadBalancer, HostNetwork и HostPort |
Инлеты LoadBalancer и HostPort |
| Автоматический выпуск TLS-сертификатов (cert-manager) | Есть | Есть |
| Настройка политик HTTPS (версии TLS, шифры, HSTS) | Есть | По умолчанию TLSv1.2/1.3; HSTS — через аннотацию заголовков ответа |
| WAF | ModSecurity на уровне контроллера или Ingress-ресурса | ModSecurity/Coraza на уровне маршрута, preset OWASP CRS |
| Внешняя аутентификация | Есть | Есть |
| Ограничение доступа по IP (whitelist) | Есть | Есть |
| Basic authentication | Есть | Есть |
| Ограничение частоты запросов | Есть | Есть |
| Session affinity | Есть | Есть |
| GeoIP | Гео-статистика запросов в метриках | Обогащение запросов заголовками на основе баз MaxMind |
| Метрики Prometheus и дашборды Grafana | Есть, с детализацией по неймспейсам, виртуальным хостам, Ingress-ресурсам и локациям | Есть: метрики Envoy Proxy и дашборды по запросам, маршрутам и upstream |
| Трассировка OpenTelemetry | Есть | Есть |
Балансировка трафика по нескольким протоколам
Модуль позволяет использовать следующие протоколы для приема и дальнейшей маршрутизации трафика:
- HTTP/HTTPS: основные протоколы маршрутизации трафика. По умолчанию поддерживаются HTTP/1.1 и HTTP/2. HTTP/3 можно включить с помощью параметров ALBInstance и ClusterALBInstance.
- WebSocket: поддерживается Envoy Proxy нативно, без дополнительной настройки со стороны пользователя.
- gRPC: поддерживается маршрутизация gRPC-маршрутов с помощью GRPCRoute.
- Proxy Protocol: поддерживается организация приёма Proxy Protocol-трафика за счёт использования соответствующих параметров ALBInstance и ClusterALBInstance.
- SSL Passthrough: поддерживается сквозная маршрутизация SSL-трафика с помощью TLSRoute.
- TCP: поддерживается маршрутизация TCP-трафика с помощью TCPRoute.
- UDP: поддерживается маршрутизация UDP-трафика через UDP listener управляемого Gateway с помощью UDPRoute.
Поддержка SSL/TLS
По умолчанию в Envoy Proxy поддерживается TLSv1.2 и TLSv1.3. В случае использования TLSv1.2 применяются следующие параметры криптографии:
- обмен ключами: ECDHE;
- аутентификация: ECDSA, RSA;
- шифрование (AEAD): AES-GCM (128/256), ChaCha20-Poly1305;
- контроль целостности: SHA256, SHA384.
При использовании TLSv1.3 набор протоколов криптографии определяется библиотекой BoringSSL.
Мониторинг и статистика
Модуль alb собирает метрики Envoy Proxy и предоставляет их Prometheus в формате Prometheus. Если включён модуль operator-prometheus, объект PodMonitor d8-alb-proxy собирает метрики с endpoint /stats/prometheus каждого готового пода ALB-прокси. Имена собранных метрик получают префикс d8_alb_gateway_.
В зависимости от метрики данные можно группировать по следующим меткам:
namespace;gateway;clusteralbinstance;hostname;route;response_code;methodдля счётчика HTTP-запросов по методу;countryдля GeoIP-метрик;cityдля GeoIP-метрик по городам;cluster_nameдля upstream-кластеров;nodeиtierдля метаданных цели прокси.
Графики собраны в дашбордах Grafana, расположенных в monitoring/grafana-dashboards/alb:
requests.json(Requests) содержит общую статистику HTTP-запросов, HTTP-методы, HTTP-, TCP- и UDP-трафик, карту стран и Top cities для GeoIP-запросов, ошибки, upstream, TLS и listener’ы;route-details.json(Route Details) содержит детализацию выбранного маршрута: количество запросов, RPS, HTTP-трафик, задержку P50/P95/P99, коды ответов и сигналы ошибок;upstream-details.json(Upstream Details) содержит детализацию выбранного upstream-кластера: количество запросов, задержку, повторы, таймауты, ошибки соединения, ожидающие запросы и доступные endpoints.
Основные принципы сбора статистики
- Envoy Proxy формирует стандартные метрики и пользовательскую HTTP-статистику. Пользовательская статистика запросов содержит маршрут, запрошенное имя хоста и код ответа в виде меток метрик.
- Envoy Proxy предоставляет метрики по адресу
/stats/prometheus. Прокси ALB черезkube-rbac-proxyпубликует этот endpoint на портуhttps-metricsи авторизует доступ к соответствующему workload прокси. Метрики Gateway-контроллера также публикуются через егоkube-rbac-proxy. - Если включён
operator-prometheus, объектыPodMonitord8-alb-proxyиd8-alb-gateway-controllerсобирают метрики ALB-прокси и Gateway-контроллера; к именам метрик добавляется префиксd8_alb_gateway_. - Дашборды Grafana выполняют запросы к полученным метрикам Prometheus и позволяют фильтровать данные по namespace, Gateway, ALB instance, hostname, route, коду ответа или upstream-кластеру.
Какая информация собирается Prometheus и в каком виде
- HTTP:
d8_alb_gateway_envoy_http_custom_downstream_rq_by_pathсчитает запросы с меткамиroute,hostnameиresponse_code;d8_alb_gateway_envoy_http_custom_downstream_rq_by_methodсчитает запросы с меткамиmethod,routeиhostname;d8_alb_gateway_envoy_http_custom_downstream_rq_{rx,tx}_bytes_totalсчитает принятый и переданный HTTP-трафик;d8_alb_gateway_envoy_http_custom_downstream_rq_duration_by_path_{sum,count,bucket}хранит гистограмму длительности запросов; метрики no-route, no-cluster, таймаутов и сбросов downstream показывают сигналы ошибок; - GeoIP:
d8_alb_gateway_envoy_http_custom_geoip_requestsсчитает HTTP-запросы по меткеcountry;d8_alb_gateway_envoy_http_custom_geoip_requests_by_city— по меткамcountryиcity. Первая метрика создаётся, если настроены GeoIP City DB иgeoIP.headers.country; вторая — если также настроенgeoIP.headers.city. - Статус GeoIP:
d8_alb_gateway_geoip_configuredравна1, когда для ALBInstance настроен источник баз GeoIP (GeoProxy или прямое зеркало), и0в остальных случаях. Она отображается в панели GeoIP status дашбордаRequests; это статус конфигурации, а не готовности или актуальности скачанной базы. - Upstream:
d8_alb_gateway_envoy_cluster_upstream_rq_time_{sum,count,bucket}хранит гистограмму задержки upstream; также собираются общее количество запросов, повторы, переполнения повторов, таймауты, ошибки соединения, активные и ожидающие запросы, сбросы и количество доступных endpoints; - Listener и TLS:
d8_alb_gateway_envoy_listener_downstream_cx_activeиd8_alb_gateway_envoy_listener_ssl_certificate_*показывают активные downstream-соединения и статистику TLS-сертификатов; - TCP:
d8_alb_gateway_envoy_tcp_custom_downstream_cx_totalиd8_alb_gateway_envoy_tcp_downstream_cx_{rx,tx}_bytes_totalпоказывают количество соединений и объём трафика; - UDP:
d8_alb_gateway_envoy_cluster_udp_sess_{rx,tx}_datagramsпоказывают полученные и переданные датаграммы UDP-сессий.
Автоматическое создание и гибкая настройка инфраструктуры для объектов Gateway
В модуле представлены два пользовательских ресурса (CRD) для декларативного описания и управления инфраструктурой объектов Gateway: ClusterALBInstance и ALBInstance. Особенности этих ресурсов и разница между ними описаны в таблице ниже.
| ClusterALBInstance | ALBInstance | |
|---|---|---|
| Назначение | Развёртывание cluster-scoped-объекта Gateway | Развёртывание объекта Gateway в неймспейсе |
| Типичный сценарий | Общая точка входа, системный (для публикации служебных компонентов DKP) или платформенный шлюз | Отдельный шлюз для приложения или команды в выделенном неймспейсе |
| Поддерживаемые типы инлета | LoadBalancer, HostPort |
LoadBalancer |
| Реализация прокси | Envoy Proxy | Envoy Proxy |
| Тип развёртывания | DaemonSet | Deployment |
| Локализация объектов ListenerSet и маршрутов | В любом пользовательском неймспейсе | В том же неймспейсе, что и объект ALBInstance |
| Права доступа | Администратор кластера | Администратор неймспейса |
Создание ALBInstance ресурсов поддерживается в следующих редакциях: EE, BE, SE, SE+, CSE.
Результатом создания объекта ClusterALBInstance или ALBInstance в кластере становится появление управляемого объекта Gateway. При этом:
- Каждый объект Gateway обслуживается как минимум одним экземпляром Envoy Proxy.
- Трафик в него приходит через объект Service типа
LoadBalancerили напрямую с использованием параметровHostPort. - Каждый объект Gateway по умолчанию создает два обработчика:
d8-http(порт80) иd8-https(порт443). Они предназначены для служебных целей — например, проверки доступности шлюза или работыcert-manager(HTTP-01). Для публикации приложений эти обработчики использовать не рекомендуется, используйте для этого ListenerSet.
Ручная модификация объектов Gateway, управляемых модулем, не допускается.
Несколько объектов ClusterALBInstance или ALBInstance могут ссылаться на один и тот же объект Gateway через поле gatewayName. В этом случае они описывают общий шлюз, но инфраструктура приёма запросов может отличаться в зависимости от настроек. Можно рассматривать gatewayName как аналог ingressClass для объектов IngressNginxController.
Управление приёмом входящих запросов с помощью объектов ListenerSet
Объект ListenerSet описывает системные и пользовательские обработчики трафика, которые задают имя хоста, режим TLS, порт и протокол. Каждый объект ListenerSet связывается с конкретным родительским объектом Gateway через поле spec.parentRef, а затем к нему подключаются маршруты.
Расположение объектов ListenerSet зависит от используемого типа объекта Gateway:
- для ClusterALBInstance объекты ListenerSet могут располагаться в любом неймспейсе;
- для ALBInstance объекты ListenerSet рекомендуется располагать в том же неймспейсе, что и родительский ALBInstance.
В обоих случаях объект ListenerSet рекомендуется располагать в том же неймспейсе, что и подключаемые к нему объекты HTTPRoute, GRPCRoute и TLSRoute. Это упрощает читаемость конфигурации и позволяет избежать дополнительных настроек, например объектов ReferenceGrant.
Объекты TCPRoute и UDPRoute для обычных TCP/UDP-портов, заданных в additionalPorts, подключаются непосредственно к соответствующему listener управляемого Gateway, а не к ListenerSet. Это дает сетевым администраторам более точный контроль над тем, какие дополнительные порты доступны в кластере. Подробнее — в разделе «Открытие дополнительного TCP/UDP-порта» руководства администратора.
Маршрутизация входящих запросов с помощью объектов HTTPRoute, GRPCRoute, TCPRoute, UDPRoute и TLSRoute
Модуль поддерживает следующие типы маршрутов:
- HTTPRoute — для маршрутизации HTTP/HTTPS/TLS запросов;
- GRPCRoute — для маршрутизации gRPC-трафика;
- TLSRoute — для сквозной маршрутизации TLS-трафика;
- TCPRoute — для маршрутизации TCP-трафика (обычный TCP через listener Gateway из
additionalPortsлибо после терминации TLS на ListenerSet); - UDPRoute — для маршрутизации UDP-трафика через listener Gateway из
additionalPorts.
Объекты HTTPRoute поддерживают расширенные настройки с помощью аннотаций, которые дополняют текущую спецификацию Gateway API.
Валидация конфигурации Gateway API
Помимо настройки инфраструктуры Gateway API, модуль выполняет валидацию пользовательских настроек, чтобы не допустить применения конфликтующих конфигураций. Например, модуль проверяет конфликты между одинаковыми обработчиками трафика в разных объектах ListenerSet, если они ссылаются на один и тот же объект Gateway.