Многие знают, что Kubernetes – это система оркестрации. Но даже опытные разработчики не всегда могут четко озвучить разницу между 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 и timeweb.cloud. Однако у них тоже существуют некоторые особенности, которые нужно учитывать при выборе. Например, k8s Ingress Traefik — это контроллер для Traefik, прокси-сервера облачных приложений, а k8s Nginx Ingress — решение, которое работает с веб-сервером Nginx.
Есть и опенсорсные API-шлюзы, которые умеют контролировать входящий трафик, например Gloo и EnRoute. Они дают больше гибкости, но и взамен требуют больше времени для настройки.
Контроллеры реализованы на различном софте. Один из самых простых и популярных среди веб-разработчиков — 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 — всегда будут варианты для реализации распределения трафика. Сделать правильный выбор помогут четкие критерии.
Это не исчерпывающий список всех возможных сценариев и вытекающих из них требований, а лишь общие моменты. Для каждого отдельного проекта необходимо учитывать специфику реализации.
Ингресс — это правила доступа внешнего трафика внутрь кластера. Контроллеры — это приложения, которые реализуют правила. Чтобы правильно выбрать контроллер, нужно ответить на несколько вопросов:
Как и при выстраивании любой системы, сначала важно понять требования к ней. Но есть и несколько универсальных советов. Например, для простых систем можно выбрать практически любой контроллер. Они справляются со стандартными задачами примерно с одинаковой производительностью. У всех контроллеров есть динамическое обнаружение сервисов, поддержка веб-сокетов, SSL-терминирование.
Для высоконагруженных систем стоит уделить внимание производительности и наличию коммерческой поддержки. Это поможет с самого начала выстроить архитектуру, в которой будут невысокие риски простоев.