Ingress-nginx долгое время оставался стандартным ingress-контроллером для Kubernetes, но после объявления о завершении активной поддержки многим командам пришлось задуматься о миграции. В этой статье рассказываем, как мы выбирали новый ingress-контроллер.

Почему тема смены ingress-контроллера стала актуальной

Большинство инженеров, работающих с Kubernetes, уже знают, что ingress-nginx уходит на пенсию. В официальном объявлении Kubernetes говорится, что поддержка ingress-nginx продолжится в режиме best-effort до марта 2026 года. После этого проект перестанет получать новые релизы, исправление ошибок и обновление безопасности.

Мы, как и многие команды в отрасли, долгое время использовали ingress-nginx в собственных и клиентских кластерах. Контроллер стабильно работает, хорошо изучен и закрывает базовые задачи маршрутизации трафика. При этом небольшой, но показательный опрос на Reddit показывает, что ingress-nginx до сих пор занимает почти половину рынка.

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

  • куда мигрировать 

  • какие риски возникают при переходе 

  • сколько будет стоить миграция 

  • какие ограничения и несовместимости появятся

Ingress API vs Gateway API 

Параллельно в экосистеме Kubernetes развивается новый стандарт публикации сервисов — Gateway API. Постепенно он становится основным направлением развития вместо классического Ingress API.

Gateway API решает задачи, которые раньше приходилось закрывать сложными ingress-конфигурациями, аннотациями и дополнительными механизмами. Если говорить коротко, основная идея Gateway API — более четкое разделение ответственности и более гибкая маршрутизация. В классическом Ingress все обычно описывается в одном ingress-объекте: хост, правила маршрутизации, TLS, иногда дополнительные параметры через аннотации. По мере роста инфраструктуры такие конфигурации становятся все сложнее и хуже масштабируются.

В Gateway API архитектура сразу разделена на несколько логических уровней. Объект Gateway описывает точку входа в кластер для конкретного хоста, а Route-объекты отвечают за правила маршрутизации. Если провести аналогию с nginx:

  • Gateway — уровень хоста

  • Route — уровень location и маршрутизации внутри него

Такой подход позволяет разным командам независимо управлять своей частью конфигурации и упрощает сопровождение инфраструктуры.

Подробнее про различия API можно прочитать в официальной документации.

При этом переход на Gateway API требует определенных трудозатрат: нужно переписывать манифесты, обновлять Helm-чарты, менять CI/CD-пайплайны и тестировать маршрутизацию и TLS.

Поэтому мы решили разделить миграцию на несколько этапов. Сначала заменить ingress-контроллер на современное поддерживаемое решение с минимальными изменениями текущих сервисов, а затем постепенно переводить инфраструктуру на Gateway API по мере готовности процессов и инструментов.

Так мы снизим риски и не будем совмещать сразу несколько крупных изменений. Дополнительно важно учитывать текущее состояние экосистемы. Многие популярные Helm-чарты, включая Bitnami и другие широко используемые решения, до сих пор ориентированы на классический Ingress и только начинают добавлять поддержку Gateway API. Поэтому Ingress какое-то время останется частью production-инфраструктур, несмотря на развитие нового стандарта.

Наш контекст: инфраструктура и ограничения

Чтобы понять масштаб миграции, важно описать контекст нашей инфраструктуры.

Сейчас в эксплуатации находятся:

  • 5 собственных Kubernetes-кластеров 

  • более 500 ingress-ресурсов 

  • десятки клиентских кластеров в публичных облаках, on-premise инфраструктуре и в средах заказчиков. 

Любые изменения сетевого слоя затрагивают сразу большое количество систем с разными требованиями и уровнем критичности.

Отдельно стоит отметить production-окружения с высокой нагрузкой, где публикация сервисов наружу — критичная часть инфраструктуры. В таких системах любые изменения нужно выполнять максимально аккуратно, без простоев и влияния на пользователей. Это автоматически ограничивает варианты миграции. Нельзя просто переключить контроллер одним релизом или массово переписать конфигурации. Необходим постепенный переход с тестированием и возможностью отката.

Дополнительную сложность создают накопленные ingress-nginx-конфигурации. За годы эксплуатации мы активно использовали аннотации для настройки маршрутизации, безопасности и поведения прокси.

Например:

Механизмы аутентификации и интеграции с внешними сервисами

- auth-url
 - auth-signin 
 - auth-response-headers 

Управление протоколами и поведением backend-сервисов

- backend-protocol 
 - x-forwarded-prefix
 - x-forwarded-proto  Настройки CORS

- enable-cors 
 - cors-allow-origin
 - cors-allow-methods
 - cors-allow-credentials 
 
 Параметры буферизации и таймауты

- proxy-body-size 
 - proxy-buffer-size
 - proxy-buffers-number
 - proxy-connect-timeout
 - proxy-read-timeout
 - proxy-send-timeout
 - client-body-buffer-size
 
 Маршрутизация и переписывания путей

- rewrite-target 

Пользовательские сниппеты конфигурации

- configuration-snippet 

- server-snippet 

Последние два пункта особенно чувствительны при миграции. Они позволяют внедрять произвольные nginx-настройки прямо в конфигурацию ingress и дают очень высокую гибкость. Одновременно это создает сильную зависимость от конкретной реализации контроллера. Такие конструкции практически невозможно перенести на другое решение без изменений, и именно они чаще всего становятся основной точкой сложности при миграции.

Требования к новому ingress / gateway решению

Когда стало понятно, что оставаться на ingress-nginx в долгосрочной перспективе не получится, следующим шагом стало определение требований к новому решению. Нам нужен был инструмент, который стабильно работает с классическим Ingress, поддерживает Gateway API, позволяет мигрировать постепенно и минимально затрагивает текущие сервисы.

– Одним из ключевых критериев была зрелость проекта. Мы смотрели не только на функциональность, но и на активность разработки, частоту обновлений, качество документации и размер сообщества. Это напрямую связано с операционными рисками: чем шире используется решение, тем выше вероятность, что возникающие проблемы уже известны и имеют готовые способы решения.

– Не менее важной были простота и предсказуемость миграции. У нас уже есть сотни ingress-ресурсов и большое количество автоматизации вокруг них: Helm-чарты, пайплайны и шаблоны конфигураций. Поэтому мы искали решение, которое позволит максимально сохранить существующие манифесты и текущее поведение сервисов.

– Отдельно оценивались сложность настройки, удобство эксплуатации, логирование, мониторинг и удобство диагностики. Для production-окружений также критичны производительность и стабильность под нагрузкой, поэтому мы дополнительно изучали результаты нагрузочного тестирования и рекомендации сообщества.

Конечный список требований выглядел так:

  • поддержка классического Ingress 

  • совместимость с существующими конфигурациями 

  • поддержка Gateway API 

  • активное развитие проекта 

  • минимальные изменения при миграции 

  • предсказуемое поведение 

  • высокая производительность 

  • возможность работы в облаках и on-premise инфраструктуре 

Кандидаты на замену ingress-nginx 

 

В следующей статье расскажем, что же мы выбрали и как устроили бесшовный переход.

А вы сталкивались с такой ситуацией? Какой выбор сделали и почему?

Комментарии (1)


  1. Mnemonik
    27.05.2026 11:31

    Никогда не пользовался nginx-ingress, у нас сразу был traefik.

    Плюсы - очень просто в конфигурации. Как раньше на ingress, так и на gateway api, хоть он и посложнее.

    Минусы - довольно быстро складывается под нагрузкой. По тестам у него есть довольно обозримый лимит одновременных/поступающих соединений после которого он начинает стремительно деградировать. Решается горизонтальным скалированием нод, но всё равно обидно.

    Мы в итоге выбрали Envoy Gateway (https://gateway.envoyproxy.io)

    Плюсы - очень хорошо себя показывает под нагрузкой. если бэк выдержит, медленно, но верно запросы будут обслужены. Кроме того многие ingress решения на самом деле не больше чем обёртки над Envoy. Тот же Istio это фактически очень сложный data-plane над множеством envoy инстансов.

    Минусы - намного более сложный подход к конфигурации, следование концепции Gateway API, из-за чего некоторые задачи которые обычно выглядят как опция on/off в конфиге решаются чуть ли не несколькими манифестами в разных неймспейсах (что-то навроде включения proxy protocol, или auth middleware).

    Но если справиться с настройкой один раз, перенести все фишки из старой инфрастуктуры в новый концепт - работает и не шумит. Уже пару раз было такое что он вполне вывез внезапные пики 10х нагрузки приходящие быстро и не надолго (какие-то масс сканы или возмущённый AI которому хочется всё и сразу).