Что такое Ingress-контроллер и как его правильно выбрать
Многие знают, что Kubernetes – это система оркестрации. Но даже опытные разработчики не всегда могут четко озвучить разницу между Ingress и Ingress-контроллерами, а также раскрыть логику выбора контроллера.
Принцип работы Ingress
Ingress — свод правил, в которых описано, как внешний трафик получает доступ к сервисам в кластере.
Ingress-контроллер — pod (базовый блок Kubernetes), который реализует правила, описанные в Ingress. По сути, это приложение-контроллер.
Эти две сущности не могут работать друг без друга. Можно провести аналогию с мультиваркой, которая использует программу для самостоятельного приготовления блюда. В таком случае Ingress — это программа приготовления, а Ingress-контроллер — сама мультиварка. Без мультиварки программы приготовления не имеют смысла. Без программ приготовления мультиварка такая же функциональная, как пустая кастрюля.
Важный момент: контроллер — это не замена балансировщика нагрузки, а просто еще один уровень маршрутизации, который дает больше гибкости в управлении трафиком.
Типы контроллеров
Контроллеры можно разделить на две большие группы: специальные и универсальные.
К специальным относятся решения, рассчитанные на управление трафиком конкретных систем. Допустим, Citrix ingress controller предназначен для Citrix ADC. Это инструмент для доставки приложений и балансировки нагрузки, который работает внутри контейнеров, виртуальных машин и на bare metal.
Другой пример специального контроллера — AKS Application Gateway Ingress Controller. Он распределяет рабочую нагрузку на Azure.
Универсальным решениям не важна экосистема — можно использовать их хоть на AWS и Azure, хоть на Google Cloud и cloud.timeweb.com. Однако у них тоже существуют некоторые особенности, которые нужно учитывать при выборе. Например, k8s Ingress Traefik — это контроллер для Traefik, прокси-сервера облачных приложений, а k8s Nginx Ingress — решение, которое работает с веб-сервером Nginx.
Есть и опенсорсные API-шлюзы, которые умеют контролировать входящий трафик, например Gloo и EnRoute. Они дают больше гибкости, но и взамен требуют больше времени для настройки.
Ingress-контроллеры
Контроллеры реализованы на различном софте. Один из самых простых и популярных среди веб-разработчиков — Nginx Ingress. Его разрабатывают и поддерживают создатели Kubernetes 19. В большинстве обучающих материалов именно Nginx рекомендуется использовать в качестве контроллера.
Есть также NGINX Ingress для Kubernetes. Это продукт F5 Networks — компании, которая поглотила NGINX Inc. У него есть премиум-версия, разработанная для Kubernetes F5 на NGINX Plus. Среди основных преимуществ — стабильная работа, сохранение обратной совместимости при выпуске новых версий, отсутствие посторонних модулей и высокая скорость благодаря отсутствию Lua-плагинов.
Бесплатная версия урезана даже по сравнению с контроллером от Kubernetes. Зато в премиум-версии много дополнительных функций, например: валидация через JSON-токены, метрики в реалтайме, активные проверки состояния. Кроме того, в обеих версиях есть поддержка TCP/UDP-трафика.
Еще один инструмент контроля трафика на Nginx — Kong. У него тоже доступны бесплатная и премиум-версии. Для расширения стандартных возможностей используются Lua-модули.
Kong был разработан как API Gateway, однако со временем его функциональность расширилась до Ingress-контроллера. Одно из главных преимуществ — большое количество дополнительных модулей. Их легко устанавливать и конфигурировать.
Довольно популярное решение — HAProxy. Это прокси и балансировщик трафика. Основной акцент у этого решения сделан на скорости работы, оптимизации и производительности. Поддерживается много способов балансировки. Привлекает также полная кастомизация конфигурации.
Traefik тоже изначально разрабатывался как прокси для маршрутизации запросов микросервисов и их среды. Это приносит много пользы при использовании инструмента в качестве Ingress-контроллера. Для обновления конфигурации не требуется перезагрузка, поддерживаются разные алгоритмы балансировки и протоколы, есть веб-интерфейс и SSL-сертификаты Let's Encrypt.
Это лишь самые распространенные решения для Kubernetes. Посмотреть другие контроллеры можно в документации.
Критерии выбора
Kong Traefik, Traefik HaProxy, Nginx и EnRoute — всегда будут варианты для реализации распределения трафика. Сделать правильный выбор помогут четкие критерии.
- Какие протоколы поддерживаются, особенно если приложение использует нестандартный HTTP или для его работы требуются сразу несколько протоколов.
- Какое программное обеспечение лежит в основе, например: k8s Traefik или Nginx, Envoy, HAProxy.
- Как реализована маршрутизация трафика: обычно используется host/path, однако возможны и другие варианты.
- Как реализовано пространство имен внутри кластера. Некоторые контроллеры нужно устанавливать по отдельности в каждое пространство имен, но большинство работает глобально.
- Какие способы проверки состояния поддерживаются: активные, пассивные, собственные реализации.
- Какие алгоритмы балансировки используются: Least Connections, Round Robin и т.д.
- Какая схема аутентификации используется: basic, oauth и т.д.
- Как реализовано распределение трафика. Это могут быть A/B-тесты, канареечные релизы, зеркалирование. Очень важный критерий для приложений, которым требуется аккуратное разделение трафика, например, для глубокой аналитики или отладки продуктов в боевых условиях.
- Есть ли платная подписка, которая расширяет базовую функциональность или добавляет техническую поддержку.
- Есть ли графический интерфейс, который помогает вносить изменения в конфигурацию без работы с исходным кодом.
- Есть ли JWT-валидация, которая позволяет авторизовывать и валидировать пользователей по веб-токенам.
- Какие существуют возможности для кастомизации конфига, в том числе с помощью собственных директив и флагов.
- Какие существуют механизмы защиты от DDoS-атак — это могут быть базовые решения вроде rate limit или более сложные инструменты: белые списки, отсеивание по адресам и т.д.
- Есть ли трассировка запросов, которая помогает отслеживать и исправлять запросы от ингрессов к конкретным сервисам/подам, а в идеале и между сервисами/подами.
- Поддерживается ли прикладкой фаервол.
Это не исчерпывающий список всех возможных сценариев и вытекающих из них требований, а лишь общие моменты. Для каждого отдельного проекта необходимо учитывать специфику реализации.
Заключение
Ингресс — это правила доступа внешнего трафика внутрь кластера. Контроллеры — это приложения, которые реализуют правила. Чтобы правильно выбрать контроллер, нужно ответить на несколько вопросов:
- Требуется ли поддержка протоколов TCP, UDP, gRPC сейчас? Может ли она понадобиться в будущем?
- Какие дополнительные фичи нужны сейчас или могут понадобиться в будущем?
- Потребуется ли API-шлюз или достаточно стандартных средств контроллера?
- Есть ли необходимость в коммерческой поддержке или можно справиться своими силами?
- Какие требования к производительности?
Как и при выстраивании любой системы, сначала важно понять требования к ней. Но есть и несколько универсальных советов. Например, для простых систем можно выбрать практически любой контроллер. Они справляются со стандартными задачами примерно с одинаковой производительностью. У всех контроллеров есть динамическое обнаружение сервисов, поддержка веб-сокетов, SSL-терминирование.
Для высоконагруженных систем стоит уделить внимание производительности и наличию коммерческой поддержки. Это поможет с самого начала выстроить архитектуру, в которой будут невысокие риски простоев.