Зачем нам нужен балансировщик нагрузки для предоставления сервисов kubernetes с помощью входа? - PullRequest
1 голос
/ 28 апреля 2020

Для примера архитектуры, основанной на микросервисах, развернутой на движке Google kubernetes, мне нужна помощь для подтверждения моего понимания:

  1. Мы знаем, что службы предполагают трафик балансировки нагрузки c для репликации pod.
  2. Когда мы создаем входной контроллер nginx и определения входа для маршрутизации к каждой услуге, балансировщик нагрузки также настраивается автоматически.
  3. где-то читал, что создание входного контроллера nginx означает создание nginx контроллера (развертывание) и службы типа балансировки нагрузки за сценой. Я не уверен, что это правда.

Кажется, что балансировка нагрузки выполняется службами. Маршрутизация на основе URL выполняется входящим контроллером.

Зачем нам нужен балансировщик нагрузки? Он не предназначен для балансировки нагрузки между несколькими экземплярами. Он просто перенаправит все созданные трафик c на nginx обратный прокси-сервер и направит запросы на основе URL.

Пожалуйста, исправьте, если я не прав в моем понимании.

Ответы [ 3 ]

1 голос
/ 29 апреля 2020

Тип сервиса LoadBalancer и Ingress - это способ внешнего доступа к вашему приложению, хотя они работают по-другому.

Сервис:

В Kubernetes служба - это абстракция, которая определяет логический набор модулей и политику доступа к ним (иногда этот шаблон называется микросервисом). Набор модулей, на которые ориентируется Сервис, обычно определяется селектором (см. ниже , чтобы узнать, почему вам может потребоваться Сервис без селектора).

Существует несколько типов Сервисов, и из них тип LoadBalancer позволяет вам выставлять приложение, назначая внешний IP для вашей службы. Для каждого сервиса LoadBalancer ему будет назначен новый внешний IP. Балансировка нагрузки будет обрабатываться kube-proxy.

Ingress:

Объект API, который управляет внешним доступом к службам в кластере, обычно HTTP , Вход может обеспечить балансировку нагрузки, завершение SSL и виртуальный хостинг на основе имен.

При настройке входа (т. Е. nginx -вход) для службы создается тип службы LoadBalancer. -контроллеры и балансировщик нагрузки в вашем облачном провайдере будут созданы автоматически, и для службы nginx будет назначен общедоступный c IP.

Этот балансировщик нагрузки / publi c ip будет используется для входящего соединения для всех ваших услуг, и nginx -ingress будет отвечать за обработку входящих соединений.

Например:

Предположим, у вас есть 10 услуг типа LoadBalancer : Это приведет к созданию 10 новых публичных ips, и вам нужно будет использовать соответствующий ip для службы, к которой вы хотите подключиться.

Но если вы используете вход, будет создан только 1 IP, и вход будет ответственный за обработку входящего соединения для правильного сервиса на основе PATH / URL, который вы определили во входной конфигурации. При входе вы можете:

  • Использовать регулярное выражение в path для определения службы для перенаправления;
  • Использовать SSL / TLS
  • Вставить пользовательские заголовки;
  • Перенаправление запросов на службу по умолчанию, если одна из служб завершилась неудачно (default-backend);
  • Создание белых списков на основе IP-адресов
  • Et c ...

Важное примечание о входной балансировке нагрузки во входе:

GCE / AWS балансировщики нагрузки не предоставляют веса для своих целевых пулов. Это не было проблемой со старыми правилами LB kube-proxy, которые корректно балансировали бы между всеми конечными точками.

С новой функциональностью внешний трафик c не одинаково сбалансирован по нагрузке между модулями, но скорее одинаково сбалансирован на уровне узла (поскольку GCE / AWS и другие внешние реализации LB не способны указывать вес на узел, они равномерно распределяются по всем целевым узлам, независимо от количества модулей на каждом узле).

0 голосов
/ 29 апреля 2020

Кажется, балансировка нагрузки выполняется службами. Маршрутизация на основе URL выполняется входящим контроллером.

Сервисы балансируют трафик c между пакетами. Но они по умолчанию недоступны вне kubernetes в Google Kubernetes Engine (тип ClusterIP). Вы можете создавать сервисы с типом LoadBalancer, но каждый сервис получит свой собственный IP-адрес (Network Load Balancer), поэтому он может дорого обойтись. Также, если у вас есть одно приложение, которое имеет разные сервисы, гораздо лучше использовать объекты Ingress, которые предоставляют единую точку входа. Когда вы создаете объект Ingress, контроллер Ingress (например, nginx one) создает балансировщик нагрузки HTTP (S) Google Cloud. Объект Ingress, в свою очередь, может быть связан с одним или несколькими объектами Service.

Затем вы можете получить назначенный IP-адрес балансировщика нагрузки от объекта входа:

kubectl get ingress ingress- name --output yaml

В результате ваше приложение в модулях становится доступным вне кластера kubernetes:

LoadBalancerIP / url1 -> service1 -> pods

LoadBalancerIP / url2 -> service2 -> pods

0 голосов
/ 28 апреля 2020

Стручки входного контроллера (например, nginx) должны быть выставлены вне кластера kubernetes как точка входа всех траффиков север-юг c, входящих в кластер kubernetes. Один из способов сделать это - через LoadBalancer. Вы также можете использовать NodePort, но это не рекомендуется для производства, или вы можете просто развернуть входной контроллер непосредственно в сети хоста на хосте с publi c ip. Наличие балансировщика нагрузки также дает возможность балансировать нагрузку по трафику c между несколькими копиями модулей входного контроллера.

Когда вы используете входной контроллер, трафик c поступает из loadBalancer во входной контроллер и затем получает для поддержки IP-адресов POD на основе правил, определенных во входном ресурсе. Это позволяет обойти службу kubernetes и балансировку нагрузки (с помощью kube-proxy на уровне 4), предоставляемую службой kubernetes. Внутренний контроллер входа обнаруживает все IP-адреса POD с конечных точек службы kubernetes и напрямую направляет трафик c в модули.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...