Назначение входных и выходных шлюзов Istio

#kubernetes #openshift #istio

#kubernetes #openshift #istio

Вопрос:

У меня возникли проблемы с пониманием того, какой трафик контролируется входными и выходными шлюзами istio.

  1. Например, приложение настраивает слушателей в очереди MQ. Это пример входящего или исходящего трафика? Я думал, что там, где приложение инициирует соединение, тогда этот трафик будет направлен на выходной шлюз. И наоборот, если приложение является конечной точкой, то трафик должен маршрутизироваться через входной шлюз.
  2. Допустим, приложение A является внешней службой для приложения B. Приложение A выполняет запрос rest для B. Должен ли этот запрос перенаправляться через ingress? Теперь приложение B выполняет запрос rest к A. Должен ли трафик проходить через выход сейчас?

Комментарии:

1. Это полностью зависит от того, как установлены TCP-соединения. Если приложение A инициирует соединение с B, оно будет перенаправлено через выход, предполагая, что правила виртуальных служб / шлюза / назначения были настроены как таковые. Наоборот, B -> A будет проходить через входной ресурс в вашу коляску и проксироваться. Я полагаю, что поведение по умолчанию, предполагающее, что Envoy включен в вашем модуле. Трафик будет направляться с выхода и через вход.

2. чтобы убедиться: 1) приложение A, развернутое в openshift, приложение B работает вне кластера openshift. Поэтому, если приложение A инициирует соединение (например, отправляет post-запрос на ‘ ServerB / test’ ) с B, этот запрос должен быть направлен через входные шлюзы. 2) приложение A подключается к внешнему серверу базы данных (не в кластере openshift) через выходные шлюзы?

3. @pwflamy 1) правильно, 2) не совсем, AFAIK это проходит через кластер, как упоминалось здесь , но вы можете включить выход и отправлять исходящий трафик через него, если хотите, взгляните сюда , это должно вам все объяснить.

4. @Jakub подождите, что значит «инициировать соединение»? Если мы запустим command [appA]: curl appB , означает ли это, что appA инициирует соединение с AppB? Я спрашиваю, потому что, если вы последуете своему ответу ниже, окажется, что мой первый пример в комментарии неверен. Или я не правильно понимаю «инициировать соединение» (посмотрите, что в моем комментарии appA находится внутри сервисной сетки, а AppB — внешняя служба)

5. @pwflamy извините, я неправильно понял второй вопрос, и хотя appA является внешним, а AppB находится внутри сетки. Как упоминалось ниже в моем примере, appA — это внешний сервис за пределами сетки, а AppB — это внедренный сервис в сетку istio.

Ответ №1:

Давайте начнем с некоторой теории. Я нашел несколько источников, в которых описывается, как работают входные и выходные шлюзы istio.

Документация Istio

Istio использует входные и выходные шлюзы для настройки балансировщиков нагрузки, выполняющихся на границе сервисной сетки. Входной шлюз позволяет определять точки входа в сетку, через которую проходит весь входящий трафик. Выходной шлюз — это симметричная концепция; он определяет точки выхода из сетки. Выходные шлюзы позволяют применять функции Istio, например, мониторинг и правила маршрутизации, к трафику, выходящему из сетки.


Istio в книге действий

Чтобы наши приложения и службы могли предоставлять что-либо значимое, им необходимо взаимодействовать с приложениями, которые находятся за пределами нашего кластера. Это могут быть существующие монолитные приложения, готовое программное обеспечение, очереди обмена сообщениями, базы данных и системы сторонних партнеров. Для этого операторам необходимо настроить Istio так, чтобы разрешать трафик в кластер, и быть очень конкретными в отношении того, какому трафику разрешено покидать кластер. Компонентами Istio, которые обеспечивают эту функциональность, являются istio-ingressgateway и istio-egressgateway.

И вот картинка, которая хорошо это показывает

введите описание изображения здесь


Banzaicloud

Входной шлюз служит точкой входа для всех служб, работающих в сети.

введите описание изображения здесь

выходные шлюзы — это точки выхода из сетки, которые позволяют нам применять функции Istio. Это включает в себя применение таких функций, как мониторинг и правила маршрутизации, к трафику, который выходит из сетки.

введите описание изображения здесь


По поводу ваших вопросов

Например, приложение настраивает слушателей в очереди MQ. Это пример входящего или исходящего трафика? Я думал, что там, где приложение инициирует соединение, тогда этот трафик будет направлен на выходной шлюз. И наоборот, если приложение является конечной точкой, то трафик должен маршрутизироваться через входной шлюз.

введите описание изображения здесь

Я не знаком с очередями сообщений, но, основываясь на приведенном выше рисунке, давайте предположим, что потребители находятся внутри сетки, поэтому службам производителей придется обращаться туда через входной шлюз.

[Служба производителя] -> входной шлюз -> [коляска посланника -> Служба потребителя]

Итак, да, трафик должен маршрутизироваться через входной шлюз


Допустим, приложение A является внешней службой для приложения B. Приложение A выполняет запрос rest для B. Должен ли этот запрос перенаправляться через ingress? Теперь приложение B выполняет запрос rest к A. Должен ли трафик проходить через выход сейчас?

Если служба внутри сервисной сетки хочет взаимодействовать с внешней службой, мы должны начать с настройки для нее выхода и входа в службу.

Поскольку весь исходящий трафик из модуля с поддержкой Istio по умолчанию перенаправляется на его вспомогательный прокси-сервер, доступность URL-адресов за пределами кластера зависит от конфигурации прокси-сервера. По умолчанию Istio настраивает прокси-сервер Envoy для передачи запросов к неизвестным службам. Хотя это обеспечивает удобный способ начать работу с Istio, обычно предпочтительнее настроить более строгий контроль.

Насколько мне известно, именно этого хотел бы трафик.

 appA -> external service outside the mesh
appB -> injected service in the istio mesh
  

Предположим, вы хотите использовать curl из appA в AppB

[приложение A] (curl ingress-внешний ip / определенный путь или порт) -> входной шлюз -> [коляска посланника -> AppB]

Предположим, вы хотите использовать curl из AppB в appA

[AppB -> коляска посланника] (curl appA) -> выходной шлюз -> [appA]


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