Вопрос или проблема
Я начинаю изучать Kubernetes и есть одна вещь, которую я пока не понимаю.
Предположим, у меня есть три виртуальные машины (VMware) с уникальными внешними IP-адресами (допустим, IP-адреса X, Y, Z).
Предположим, мы хотим предоставить доступ к 3 разным сайтам на порту 80.
Предположим, мы хотим разместить каждый сайт на каждом IP адресе.
Без использования Kubernetes я могу просто создать Docker-контейнер на каждой машине и легко его открыть. (X:80, Y:80, Z:80)
Как я могу подойти к этой проблеме с Kubernetes?
Какое было бы эквивалентное решение тому, которое я описал выше, без использования Kubernetes?
Есть Ingress, но это потребовало бы чего-то вроде X:80, X:80/secondsite, X:80/thirdsite.
Как решается эта проблема, если мне нужно больше IP-адресов, чем виртуальных машин?
Возможно ли назначить диапазон IP-адресов одной виртуальной машине и использовать их с Ingress или каким-то другим способом?
Я заранее извиняюсь, если эти вопросы кажутся тривиальными, но я буду благодарен за ответы, которые дадут мне некоторое направление.
Как эта проблема решается в облаке, таком как AWS/Google
Вы создаете развертывание и сервис для этого развертывания. Затем вы создаете контроллер ingress (например, nginx). Затем вы создаете сервис типа LoadBalancer для этого контроллера, который создаст балансировщик нагрузки, например, ELB. Kubernetes отображает порты слушателей ELB обратно на порты нод, открытые сервисом контроллера ingress. Затем вы создаете объект ingress, который указывает, что этот хост направляется к этому сервису. Контроллер ingress перезагружается с измененной конфигурацией.
Когда вы делаете все сами, вам нужно по сути создать сервис ingress с жестко заданным nodeport. Если вы не установите nodeport в сервисе, то Kubernetes выберет случайный порт. Если вы хотите автоматизировать процесс, вы можете предварительно выбрать уникальный nodeport. Kubernetes затем откроет этот же node порт на всех нодах для получения трафика.
Затем на вашем балансировщике нагрузки как-то задаете новый VIP и указываете отправлять 80->nodeport на всех нодах.
Ответ или решение
Концепция использования нескольких внешних IP-адресов в Kubernetes может показаться сложной для начинающих, особенно если рассматривать интеграцию с различными внешними инфраструктурами, такими как виртуальные машины или облачные провайдеры. Однако, благодаря гибкости и многочисленным возможностям расширения Kubernetes, этот вопрос можно решить относительно просто. Давайте подробно рассмотрим, как это можно осуществить.
Теоретическая основа
Kubernetes предлагает различные способы маршрутизации трафика к контейнерам, включая Ingress и типы сервисов, такие как NodePort и LoadBalancer. Ингресс позволяет централизовать управление маршрутизацией HTTP(S) трафика на основе URL или хоста. Тем не менее, для решения задачи с несколькими внешними IP-адресами и необходимостью привязки каждого из них к отдельному веб-сайту на 80-порту, вам потребуется использовать более продвинутое взаимодействие между сервисами и инфраструктурой.
Примеры реализации
-
NodePort и вручную поддерживаемый Load Balancer:
- Создайте Deployment для каждого вашего веб-приложения. Каждое из этих приложений будет развернуто в кластере Kubernetes.
- Создайте Service типа NodePort для каждого Deployment. NodePort откроет специальный порт на всех узлах кластера, через который будет доступен ваш сервис.
- Настройте вашу внешнюю инфраструктуру (будь то физический маршрутизатор или программный эквивалент) так, чтобы она направляла HTTP трафик с каждого из внешних IP-адресов на соответствующий NodePort.
-
Использование LoadBalancer:
- Если вы используете облачного провайдера, который поддерживает автоматическое создание Load Balancer, вы можете воспользоваться Service типа LoadBalancer. Этот тип сервиса автоматически создаст балансировщик нагрузки, ассоциированный с внешним IP-адресом.
- Затем вы создаёте различные Ingress ресурсы, которые направляют трафик к соответствующим Service в кластере, основываясь на заданных правилах маршрутизации.
-
Метод с использованием MetalLB:
- В Kubernetes кластерах, развернутых на bare-metal или на платформе без встроенной поддержки LoadBalancer, вы можете использовать MetalLB — это дополнение, которое предоставляет возможности балансировщика нагрузки в таких сценариях.
- MetalLB позволяет назначить IP-адреса из заданного пула, и вы можете настроить его так, чтобы он распределял разные IP-адреса для каждого из ваших веб-приложений.
Применение в облачных окружениях
В облачных платформах, таких как AWS или Google Cloud, решение задачи с несколькими внешними IP-адресами значительно упрощается благодаря предоставляемым ими готовым решениям для управления IP-адресами и балансировкой нагрузки.
AWS:
- Используйте Elastic Load Balancing (ELB). Создание Service типа LoadBalancer автоматически создаст ELB, который распределит трафик на указанные nodePort сервисы. Укажите в правилах ELB, какой IP-адрес соответствует какому nodePort.
Google Cloud:
- Используйте Google Cloud Load Balancer. Также создайте Service типа LoadBalancer, и Kubernetes свяжет ваш сервис с балансировщиком облака. Настройка будет аналогичной с использованием правил для разных доменов или IP-адресов.
Заключение
Использование нескольких внешних IP-адресов в Kubernetes требует понимания и правильной настройки LoadBalancer и сервисов. Однако, понимание принципов работы этой системы и использование указанных примеров помогут вам эффективно распределить трафик и управлять несколькими веб-приложениями на едином Kubernetes кластере. Возможность масштабирования и высокая доступность, предоставляемые Kubernetes, становятся основными преимуществами в данной конфигурации.