Привет, Хабр! Меня зовут Роман Тимошевский, и я являюсь лидом команды DevOps в компании Data Sapience. Мы отвечаем за поддержку инфраструктуры, в которой происходит разработка и тестирование нашх продуктов, таких как Data Ocean, Data Ocean Governance, Kolmogorov AI, CM Ocean и TALYS Ocean. Поэтому приходится активно взаимодействовать с Kubernetes и его сетевой составляющей с компонентами, отвечающими за внешний доступ к приложениям внутри кластеров. На текущий момент среди них — давно известный всем Ingress Controller и Gateway API, который призван прийти ему на замену.

Если вы последние пару лет следили за развитием сетевой подсистемы Kubernetes, то наверняка заметили, что вокруг Gateway API сложился странный консенсус: все согласны, что это будущее, но почти никто толком не понимает, какую именно реализацию брать и зачем уходить от привычного Ingress. В этой статье я попробую рассказать про ключевые отличия Gateway API от Ingress (на примере самого популярного — NGINX Ingress Controller), сравнить между собой основные реализации Gateway API и поговорить о нюансах кастомизации, интеграции и производительности.

Краткая предыстория: почему Ingress перестал всех устраивать

Ingress появился как простая абстракция, которая получает на входе адрес хоста и путь и, в соответствии с описанными правилами, перенаправляет трафик на нужный сервис. Но за годы эксплуатации накопились фундаментальные проблемы.

Главная боль — аннотации. Спецификация Ingress настолько бедна, что любая кастомизация поведения (rewrite, таймауты, canary, mTLS, rate limiting, кастомные заголовки) реализуется через аннотации, специфичные для конкретного контроллера. В итоге ваш Ingress-манифест с десятком nginx.ingress.kubernetes.io/* аннотаций — это не переносимая конфигурация, а проприетарный конфиг NGINX, замаскированный под стандартный объект Kubernetes. Переезд на другой контроллер означает переписывание всего.

Вторая проблема — отсутствие разделения ролей. В Ingress всё свалено в один объект: и инфраструктурная часть (порты, TLS, IP), и прикладная (маршруты, пути). Это значит, что разработчик приложения и платформенная команда работают с одним и тем же ресурсом, что порождает конфликты прав и ответственности.

Gateway API проектировался именно как ответ на эти две боли.

Что такое Gateway API концептуально

Gateway API — это не контроллер, а набор CRD и спецификация поведения, развиваемые в рамках SIG-Network. Ключевая идея — разделение ответственности через несколько ресурсов:

Архитектурная схема компонентов Gateway API
Архитектурная схема компонентов Gateway API

Архитектурная схема компонентов Gateway API:

  • GatewayClass — аналог StorageClass. Определяет, какая реализация (контроллер) будет обрабатывать Gateway. Управляется инфраструктурным провайдером;

  • Gateway — конкретный экземпляр шлюза: какие порты слушать, какие протоколы, TLS-сертификаты использовать. Зона ответственности платформенной команды;

  • HTTPRoute / GRPCRoute / TCPRoute / TLSRoute / UDPRoute — правила маршрутизации. Зона ответственности команд разработки.

    Принципиальное отличие от Ingress: то, что раньше было аннотацией, теперь — типизированное поле в спецификации. Rewrite, редиректы, манипуляция заголовками, mirroring, weighted routing — всё это часть стандарта, а не вендорное расширение.

    При этом надо честно сказать: Gateway API не покрывает 100% потребностей. Для специфичных вещей (rate limiting, авторизация, кастомные политики) используется механизм Policy Attachment — отдельные CRD, которые «прикрепляются» к Gateway или Route. И вот тут универсальность снова начинает страдать, потому что эти политики различаются для разных вендоров. Об этом ниже.

Уровни соответствия: важнейший нюанс при выборе

Gateway API делит фичи на три категории:

  • Core — обязательны для всех реализаций;

  • Extended — опциональны, но стандартизированы (если реализованы, то одинаково);

  • Implementation-specific — вендорные расширения.

Это значит, что заявление «контроллер X поддерживает Gateway API» почти ничего не говорит. Нужно смотреть отчёт о соответствии (conformance report) конкретной версии. Например, поддержка GRPCRoute, mesh-режима или session persistence сильно различается между реализациями. SIG-Network публикует таблицу с галочками — это первое, на что стоит смотреть.

Обзор основных реализаций

Реализаций уже десятки, но в проде имеет смысл рассматривать далеко не все. Разберём самые значимые.

NGINX Gateway Fabric

Официальная реализация Gateway API от команды NGINX (F5).

Плюсы: знакомый dataplane (NGINX), относительно низкое потребление ресурсов, понятная модель для тех, кто уже живёт на NGINX.

Минусы: молодой проект, по фичам пока отстаёт от связки «старый Ingress + аннотации». Многое из того, что в Ingress делалось аннотациями, в NGF либо ещё не реализовано, либо требует кастомных snippet-политик. Динамическая перезагрузка конфигурации в NGINX исторически означает reload процесса — при высокой частоте изменений маршрутов (частый CI/CD, autoscaling) это может вызывать кратковременный рост потребления CPU и обрыв части долгоживущих соединений.

Envoy Gateway

Реализация под эгидой CNCF/Envoy, по сути «упрощённый и стандартизированный» способ запустить Envoy как Gateway. Внутри — control plane, который транслирует Gateway API в xDS-конфигурацию Envoy.

Плюсы: Envoy — это де-факто индустриальный стандарт edge/mesh-прокси с богатейшим функционалом (продвинутый L7, retries, circuit breaking, observability через готовые метрики/трейсы). Динамическая перенастройка через xDS без реконфигурации процесса — большое преимущество при частых изменениях. Под высокой и динамичной нагрузкой Envoy ведёт себя предсказуемее NGINX.

Минусы: Envoy заметно прожорливее по памяти, чем NGINX, особенно при большом количестве маршрутов и кластеров (модель xDS держит конфигурацию кластеров и эндпоинтов в памяти, и при тысячах маршрутов потребление растёт заметно). По CPU при включённых фильтрах и трейсинге Envoy тоже дороже. На «голом» проксировании латентность чуть выше, чем у NGINX.

Cilium Gateway API

Если вы уже используете Cilium как CNI, его реализация Gateway API встроена в dataplane на базе eBPF + Envoy. L3/L4-маршрутизация, балансировка (замена kube-proxy) и enforcement network policy на уровне L3/L4 исполняются в ядре через eBPF-программы, без выхода в user-space. L7-обработка (HTTP-маршрутизация Gateway API, L7-фильтры) делегируется встроенному Envoy.

Плюсы: единая платформа для сети и Gateway API без дополнительных компонентов. На чистом L3/L4 eBPF в ядре даёт минимальный overhead, низкую латентность и отличную масштабируемость числа правил — eBPF-карты эффективнее, чем длинные цепочки iptables. Отличная интеграция с network policies в единой модели: трафик, входящий через Gateway, и внутрикластерный трафик управляются одними и теми же правилами.

Минусы: жёсткая привязка к Cilium как CNI — это решение архитектурного уровня, а не «просто поставить контроллер». Для L7-обработки всё равно поднимается Envoy, поэтому преимущество eBPF на L7 частично нивелируется: HTTP-трафик проходит через user-space прокси, и в этой части наследуется envoy’евский профиль потребления. Реальный выигрыш Cilium на L7 — скорее в эффективной доставке трафика до прокси и обратно, чем в самой L7-обработке.

Calico Ingress Gateway

Относительно свежее предложение от Tigera (создателей Calico). Ключевой факт, который надо понимать сразу: это не самостоятельный dataplane, а дистрибутив Envoy Gateway, интегрированный в экосистему Calico. То есть под капотом — тот же Envoy + Envoy Gateway control plane, но упакованный, протестированный и поддерживаемый в связке с сетевой и security-подсистемой Calico.

Логика тут такая же, как у Cilium: если у вас Calico уже выступает в роли CNI и движком сетевых политик, то Ingress Gateway даёт единую платформу — ingress-трафик, внутрикластерное сетевое взаимодействие, network policy и наблюдаемость управляются в одном стеке и одной модели безопасности.

Плюсы:

  • Нативная интеграция с Calico Network Policy. Главное ценностное предложение. Трафик, входящий через Gateway, попадает в единую модель политик Calico — можно бесшовно описывать правила и для ingress, и для внутрикластерного трафика. Это закрывает классический разрыв между «L7 ingress-правилами» и «L3/L4 network policies», которые в обычном стеке живут раздельно. Сама модель network policy Calico — зрелая и обкатанная годами.

  • Полноценный Gateway API через Envoy. Поскольку основа — Envoy Gateway, вы получаете богатый L7-функционал, динамическую реконфигурацию через xDS (без перезапуска) и хорошую observability.

  • Производительность L3/L4. Calico в современном eBPF-режиме dataplane по latency и масштабированию правил близок к Cilium; в классическом iptables-режиме на большом числе сервисов/правил проигрывает из-за линейного роста цепочек.

  • Поддерживаемость. Tigera поставляет это как протестированную, версионированную сборку, что для энтерпрайза часто важнее, чем самостоятельная эксплуатация upstream Envoy Gateway.

Минусы:

  • Привязка к экосистеме Calico. Как и в случае Cilium, реальный смысл решение приобретает, когда Calico уже ваш CNI/policy-движок. Тащить весь Calico ради ingress нерационально;

  • Наследует «налог» Envoy. Поскольку L7-dataplane — Envoy, наследуется и его профиль потребления: повышенный расход памяти на масштабе (xDS-модель кластеров/эндпоинтов), более высокий CPU при активных L7-фильтрах и трейсинге по сравнению с NGINX;

  • Молодость продукта в этой роли. Сам Calico зрелый, но именно Ingress Gateway как продуктовое направление новое — стоит внимательно смотреть conformance-отчёт нужной версии и проверять, какие Extended-фичи Gateway API реализованы, а какие — пока нет;

  • Зависимость от расширений Envoy Gateway для политик. Продвинутые сценарии (rate limiting, внешняя авторизация) конфигурируются через Policy Attachment в стиле Envoy Gateway (BackendTrafficPolicy, SecurityPolicy и т. п.) — то есть переносимость продвинутых политик ограничена, как и у «ванильного» Envoy Gateway.

По сути, Calico Ingress Gateway и Cilium Gateway API — это два конкурирующих ответа на один и тот же вопрос: «Как объединить L7-ingress с сетевыми политиками в рамках одной платформы?» Разница в акцентах: Cilium делает ставку на eBPF в dataplane (с делегированием L7 в Envoy) и даёт дешёвую L3/L4-наблюдаемость, а Calico — на курируемый hardened Envoy Gateway, плотно сшитый со своей зрелой моделью network policy и вендорной поддержкой. При этом на самом L7 оба используют Envoy и будут показывать сопоставимые RPS и латентность при одинаковой конфигурации — реальная разница между ними лежит в L3/L4, в подходе к политикам и наблюдаемости, а не в «ingress-бенчмарках». Поэтому выбор между ними почти всегда диктуется тем, какой CNI у вас уже стоит, — менять сетевой фундамент ради ingress дорого и рискованно.

Istio

Istio полноценно поддерживает Gateway API как нативный способ конфигурации (вместо собственных VirtualService/Gateway CRD). Причём Gateway API в Istio работает в двух режимах: ingress gateway и mesh (для внутрикластерного трафика между сервисами через parentRef на Service).

Плюсы: если вам нужен service mesh, Gateway API в Istio даёт единую модель и для входящего, и для внутреннего трафика. Богатейший L7-функционал, mTLS из коробки, продвинутая телеметрия.

Минусы: Istio — тяжёлая платформа с самыми высокими накладными расходами по ресурсам из-за control plane (istiod) и сайдкаров/ambient-компонентов. Брать его только ради ingress — стрельба из пушки по воробьям. Но если mesh вам нужен по другим причинам, ingress «бесплатно» использует уже оплаченную инфраструктуру.

Kong, Traefik, HAProxy, APISIX

Большинство популярных API-gateway и прокси добавили поддержку Gateway API:

  • Traefik — лёгкий, удобный для небольших инсталляций, хорошая поддержка Gateway API, но исторически часть фич живёт в собственных CRD (IngressRoute);

  • Kong — силён там, где нужен полноценный API-management (плагины, аутентификация, монетизация). Gateway API — лишь один из способов конфигурации;

  • HAProxy — высочайшая производительность L4/L7, минимальный overhead, но экосистема расширений беднее;

  • APISIX — на базе NGINX/OpenResty, богат плагинами.

Эти решения выбирают чаще не «ради Gateway API», а ради их основной специализации (API-management, производительность), а Gateway API идёт как приятный бонус.

Кастомизация: где заканчивается стандарт

Это, пожалуй, самый недооценённый аспект миграции. Сценарии, которые в NGINX Ingress делались одной аннотацией, в Gateway API распределяются между тремя механизмами:

  1. Нативные поля спецификации — rewrite, redirect, request/response header modification, traffic splitting (weighted backends), mirroring. Это всё стандартизировано и переносимо. Хорошая новость: для большинства приложений этого достаточно;

  2. Filters / ExtensionRef — точки расширения внутри HTTPRoute, ссылающиеся на вендорные CRD;

  3. Policy Attachment — отдельные CRD для rate limiting, retries, таймаутов, авторизации, mTLS. Вот тут начинается вендор-специфика: в Envoy Gateway (и наследующем его функциональность Calico Ingress Gateway) это BackendTrafficPolicy/SecurityPolicy, в Cilium — свои аннотации, в NGF — ClientSettingsPolicy/UpstreamSettingsPolicy и snippet-механизмы.

Практический вывод: базовая маршрутизация переносима между реализациями, продвинутые политики нет. Если ваша главная цель — «переносимость конфигурации между провайдерами», то она работает лишь частично, ровно до того момента, как вам понадобится rate limiting или внешняя авторизация.

Отдельно отмечу болезненный для многих момент: знаменитые NGINX snippets (вставка произвольного куска конфига) в Gateway API мире намеренно затруднены или отключены по умолчанию из соображений безопасности (вспомните CVE вокруг snippet-инъекций в Ingress-NGINX). Если ваша инсталляция держится на кастомных snippet’ах — это будет самая сложная часть миграции.

Интеграция с cert-manager

Здесь не всё так гладко. Cert-manager поддерживает Gateway API нативно, но, как всегда, есть нюансы. Вместо аннотации cert-manager.io/cluster-issuer на Ingress вы можете:

  • добавить аннотацию на объект Gateway (cert-manager.io/cluster-issuer), и cert-manager сам создаст Certificate на основе TLS-listener’ов;

  • явно создать Certificate и сослаться на секрет в манифесте Gateway;

  • явно создать Certificate и сослаться на секрет в манифесте ListenerSet/XListenerSet, предварительно разрешив подключать ListenerSet'ы из неймспейсов разработчиков к Gateway.

В итоге, если вам недостаточно одного wildcard-сертификата на весь кластер и вы хотите, чтобы разработчики могли выпускать уникальные сертификаты для своих HTTPRoute, каждый из которых привязан к своему поддомену, вам придётся либо прописывать их все вручную на уровне Gateway (который, как мы помним, находится в зоне ответственности команды поддержки платформы), либо плодить дополнительные сущности в виде ListenerSet'ов. Сделать это так же просто и удобно путём добавления одной аннотации на IngressHTTPRoute, как это было раньше, к сожалению, не получится.

Важный нюанс с ACME HTTP-01 challenge: cert-manager умеет решать challenge через Gateway API, создавая временный HTTPRoute. Нужно, чтобы это поддерживалось вашей реализацией (флаг --enable-gateway-api в cert-manager).

Производительность: общие закономерности

Сразу оговорюсь: бенчмарки сильно зависят от профиля нагрузки, числа маршрутов, размера тел запросов, доли keep-alive соединений и включённых фич (TLS termination, L7-фильтры). Любые «X RPS быстрее Y» без указания условий — маркетинг. Конкретные нюансы каждого решения я разобрал в обзоре реализаций выше. Здесь — обобщающая картина.

Ключевые различия проходят по двум осям: dataplane (NGINX vs Envoy vs eBPF) и способ реконфигурации (reload vs xDS).

  • NGINX-решения выигрывают по памяти и latency на статичной конфигурации, но проигрывают за счёт reload’ов при частых изменениях;

  • Envoy-решения (Envoy Gateway, Istio, Cilium и Calico) дороже по памяти и CPU, но обеспечивают динамическую реконфигурацию без reload и предсказуемое поведение под динамичной нагрузкой;

  • eBPF-решения (Cilium, Calico в eBPF-режиме) дают минимальный overhead на L3/L4, но, как только трафик попадает в L7-обработку Gateway API, оба сводятся к Envoy, и преимущество eBPF в этой части нивелируется.

Главный практический вывод: на самом L7 все Envoy-based решения показывают сопоставимые цифры при одинаковой конфигурации, поэтому выбор между ними редко стоит делать по «ingress-бенчмаркам». Гораздо важнее dataplane на L3/L4, модель сетевых политик, наблюдаемость и, что часто решает всё — какой CNI у вас уже стоит.

Производительность: тесты

Всё описанное выше — это теория и накопленный опыт тех, кто работал с этими решениями (пусть и не в роли Gateway API). Дополнительно я решил провести небольшой практический тест некоторых популярных универсальных реализаций Gateway API.

Стенд представляет из себя:

  • Managed k8s кластер в Яндекс облаке, на котором установлены:

    • NGINX Ingress

    • NGINX Gateway Fabric

    • Envoy Gateway

    • Istio Gateway

    • Тестовый под с веб-страницей на 100 МБ, хранящейся в памяти

  • Виртуальная машина, с которой запускается утилита wrk для генерации нагрузки

Все компоненты установлены со стандартными параметрами, без дополнительных модификаций и оптимизаций.

Провёл 4 теста с разным количеством активных подключений — 4, 8, 16 и 32. Результаты получились следующими:

4 потока, 4 подключения
4 потока, 4 подключения
4 потока, 8 подключений
4 потока, 8 подключений
4 потока, 16 подключений
4 потока, 16 подключений
4 потока, 32 подключения
4 потока, 32 подключения

Результаты при разном профиле нагрузки получились неоднозначными, но в целом можно сделать вывод, что NGINX как в случае Gateway API, так и в случае Ingress Controller показывает худшие результаты как по пропускной способности, так и по утилизации CPU. К моему удивлению, Istio оказался шустрее всех, а Envoy в большинстве сценариев занял почётное второе место. Утилизация памяти во всех сценариях для всех реализаций оказалась незначительной (не более 100 МБ), поэтому не стал отражать её в таблице.

Данный тест был проведен в максимально простых условиях и далеко не с самой высокой нагрузкой. Поэтому важно понимать, что в реальных окружениях картина может сильно отличаться в зависимости от количества и настроек манифестов HTTPRoute, TCPRoute, размера веб-страниц, частоты создания и изменений манифестов и многих других факторов.

Как выбрать: практические рекомендации

Если убрать хайп, решение сводится к нескольким вариантам:

NGINX Ingress Controller: эксплуатировать целесообразно, если: у вас стабильная конфигурация, всё работает, команда знает NGINX, сложные потребности уже закрыты аннотациями и ваше кластер находится в защищённом контуре без доступа снаружи. Держите в голове, что развитие классического Ingress фактически заморожено с марта 2026 года и нет никаких гарантий, что вендор будет выпускать хотфиксы в случае обнаружения новых уязвимостей;

Envoy Gateway: если хотите «чистую» реализацию Gateway API без привязки к платформе, нужны богатые L7-возможности и динамичная среда с частыми изменениями;

NGINX Gateway Fabric: если хотите Gateway API, но психологически и операционно остаётесь в мире NGINX и ваши требования укладываются в текущий (пока ограниченный) набор фич;

Cilium Gateway: если вы уже используете Cilium в качестве CNI или строите платформу с единым подходом к сети, политикам и наблюдаемости, и вам важна eBPF-эффективность на L3/L4;

Calico Ingress Gateway: если Calico уже ваш CNI и движок сетевых политик, вам нужен полноценный Gateway API на базе Envoy и при этом критична единая модель безопасности для ingress и внутрикластерного трафика с поддержкой от вендора. Это прямая альтернатива Cilium Gateway для тех, кто исторически стоит на Calico и не хочет менять сетевой фундамент ради application-layer networking;

Istio: только если вам реально нужен service mesh — тогда Gateway API становится естественным единым языком как для внешнего, так и для внутреннего трафика;

Kong/APISIX/Traefik: если ваша задача — полноценный API-management или вам важна их специфическая специализация, а Gateway API — лишь способ конфигурации.

Итог

Gateway API — это правильное архитектурное решение давних проблем Ingress: типизированная спецификация вместо аннотаций и чёткое разделение ролей. Но «универсальной переносимости» в полном смысле он не даёт: базовая маршрутизация стандартизирована, а всё интересное (политики, rate limiting, авторизация) снова уходит в вендорную специфику через Policy Attachment.

Поэтому выбор реализации — это по-прежнему выбор экосистемы и dataplane, как и в эпоху Ingress. Разница в том, что теперь у вас есть хотя бы общий язык для 80% типовых сценариев, и менять реализацию стало менее болезненно, чем переписывать сотни аннотаций. А такие решения, как Cilium Gateway и Calico Ingress Gateway, показывают новый тренд: ingress перестаёт быть изолированным компонентом и срастается с сетевой платформой и моделью безопасности кластера в единое целое.

Мигрируйте осознанно. Начните с conformance-отчётов нужных вам реализаций, выпишите список своих текущих аннотаций и проверьте, во что каждая из них превращается в выбранной реализации. И тестируйте на своём профиле трафика — число маршрутов, доля keep-alive, размер страниц, объём network-policy правил и включённые L7-фильтры влияют на результат сильнее, чем выбор между конкретными платформами. Именно этот аудит, а не бенчмарки RPS, чаще всего и определяет реальную стоимость перехода.


Делитесь в комментариях, какие реализации используете вы и почему. И подписывайтесь на блог Data Sapience на Habr и наш Telegram-канал.