Вопрос или проблема
У нас есть требование использовать ingress-nginx как для внешнего, так и для внутреннего доступа к рабочим нагрузкам, работающим в кластере.
В зависимости от сетевой настройки кластера ingress-nginx создаст сервис типа LoadBalancer, который создаст либо внешний, либо внутренний балансировщик нагрузки. В моем случае у меня есть кластер EKS со всеми публичными подсетями, поэтому он будет предоставлять внешний балансировщик нагрузки.
Если у кластера только частные подсети, то он предоставит внутренний балансировщик нагрузки. Если вы хотите, чтобы были предоставлены как внешний, так и внутренний балансировщик нагрузки, как указано в документации ingress-nginx здесь, хотя он предоставляет и внешний, и внутренний балансировщик нагрузки, нет механизма для указания, какой балансировщик нагрузки использовать для вашего ресурса Ingress (он создает только один ресурс IngressClass).
Это уже было сообщено в проект здесь, который не имеет никакого заключения для общего случая использования. Единственное решение, которое я нашел до сих пор, – это иметь две разные установки контроллера, как указано здесь.
Кто-то сталкивался с такой же ситуацией и нашел другой способ?
Дополнительная информация для установки отдельных контроллеров: https://devrowbot.com/posts/internal-load-balancers-with-ingress-nginx/
Ответ или решение
Использование ingress-nginx контроллера для внешнего и внутреннего доступа в EKS кластере
Ingress-nginx контроллер является важной частью Kubernetes для управления внешним доступом к приложениям, работающим в кластере. Когда дело доходит до настройки ingress-nginx для внутреннего и внешнего доступа, важно учитывать архитектуру вашего кластера и конфигурацию сети. В этом ответе мы подробно рассмотрим вашу ситуацию и предложим возможные решения.
Проблема
Вы столкнулись с необходимостью обеспечить как внешний, так и внутренний доступ к рабочим нагрузкам в EKS кластере. В обычном случае, при настройке ingress-nginx, контроллер создает сервис типа LoadBalancer
. В зависимости от архитектуры сети, это может привести к созданию только внешнего или внутреннего балансировщика нагрузки.
С учетом того, что вы упоминаете единственное наличие публичных подсетей, ingress-nginx создает внешний балансировщик нагрузки. Также в кластере, где есть только приватные подсети, будет создан внутренний балансировщик.
Однако, если вы хотите использовать оба типа балансировщика нагрузки (внешний и внутренний), существует ограничение: ingress-nginx поддерживает только одно Resource класса IngressClass, что означает, что вы не можете явно указать, какой именно балансировщик использовать для ваших ресурсов Ingress.
Возможные решения
-
Два отдельных экземпляра контроллера ingress-nginx: Как вы уже упомянули, одним из предложенных решений является реализация двух отдельных экземпляров ingress-nginx. Это позволит вам создать разные классы Ingress, которые могут обращаться к соответствующим балансировщикам нагрузки. Это подходит для сложных сценариев, где вы хотите четко разделить внутренний и внешний трафик.
По ссылке Devrowbot можно найти пошаговые инструкции по установке двух экземпляров контроллера, что может стать отличным решением в вашей ситуации.
-
Использование маппинга маршрутов: Если возможно, подумайте о том, чтобы рассмотреть различные маршруты или поддомены для внутренних и внешних обращений. Например, можно настроить внутренние сервисы на специфические поддомены, такие как
internal.example.com
, и внешний доступ наexternal.example.com
. Это потребует дополнительной конфигурации DNS, но может улучшить организацию трафика. -
Настройка пользовательского балансировщика нагрузки: Используйте альтернативные решения для управления трафиком, такие как AWS Application Load Balancer (ALB) или при необходимости создать пользовательский контроллер для работы с ingress. Такой подход потребует большего количества ресурсов и добавит сложности, но обеспечит необходимую гибкость.
-
Мониторинг и оповещения: Как только вы выберете решение и реализуете его, не забудьте наладить мониторинг и оповещения для наблюдения за производительностью и доступностью ваших нагрузок. Это поможет вам быстро реагировать на проблемы, если они возникнут.
Заключение
Использование ingress-nginx контроллера как для внешнего, так и для внутреннего доступа – это распространенная задача, особенно в современных Kubernetes кластерах. Ваша ситуация требует внимательного подхода, и использование двух отдельных экземпляров контроллера ingress-nginx представляется более оптимальным решением для разделения трафика и управления балансировкой нагрузки.
Оставайтесь в курсе обновлений и возможных улучшений в проекте ingress-nginx, так как сообщество активно работает над расширением возможностей решения. Не стесняйтесь делиться своим опытом и результатами среди коллег и в сообществах.