Неужели Docker Рой межсервисной связи go через роутинг мне sh? - PullRequest
1 голос
/ 29 января 2020

Если у меня есть Docker Swarm с несколькими узлами, подключенными к определенной пользователем оверлейной сети, и служба A пытается связаться со службой B, где служба B имеет несколько реплик, какая реплика получит сообщение? Я понимаю, что маршрутизация меня sh - это входная вещь, но что-то подобное должно произойти и в этом случае, верно?

Ответы [ 2 ]

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

По умолчанию docker настраивает каждую службу с Виртуальным IP (VIP), который реализован с использованием ipvs в ядре. При этом выполняется циклическая балансировка нагрузки между каждой репликой службы для каждого отдельного сетевого подключения (постоянные сетевые подключения будут оставаться подключенными к одной и той же реплике в течение срока службы этого TCP-подключения).

Когда IP-адрес пересылается на находится на другом узле, он использует оверлейную сеть, реализованную в ядре vxlan, для отправки этих пакетов на другие узлы. Если что-то в сети блокирует наложенные сетевые порты, вы увидите проблемы, заставляющие это работать. Docker содержит обязательные порты в своей документации:

  • TCP-порт 2377 для связи управления кластером
  • TCP и UDP-порт 7946 для связи между узлы
  • UDP-порт 4789 для оверлейного сетевого трафика c

Я часто отлаживаю проблемы с подключением, используя tcpdump на каждом узле, чтобы увидеть, принимаются ли пакеты, отправленные с одного узла, на пункт назначения. И если необходимо, порт наложения может быть изменен с флагом docker swarm init --data-path-port при инициализации кластера роя.

Я предпочитаю использовать наложение сети по умолчанию в большинстве сценариев ios, поскольку это устраняет класс проблем с кэшированием DNS , Если вы используете циклический перебор DNS, каждый контейнер в кластере роя может кэшировать результаты DNS для реплик вашей службы и общаться со старыми IP-адресами, используемыми этой службой, до тех пор, пока результаты кэширования DNS сохраняются в приложении этого контейнера. Это может привести к значительному простою во время непрерывного обновления, пока вы ждете, пока приложение обновит sh это результаты DNS для выбранного контейнера. Хотя в прошлом я сталкивался с проблемами с ipvs, я не сталкивался с проблемами в последних версиях docker с более новым ядром, и этот же модуль ядра сейчас используется многими сетевыми провайдерами kubernetes, что приводит к гораздо большему тестированию и стабильности .

Если вы хотите получить отдельные IP-адреса для реплик службы или использовать DNS RR, вы можете сделать это один раз, не отключая службу VIP. Вместо этого, если вы запросите web для VIP веб-службы, вы можете запросить tasks.web для DNS RR всех реплик этой службы (заменив web на имя вашей службы). Я делал это только тогда, когда у меня есть приложения, которым нужно запускать команду для каждой реплики, и я вижу, как это может быть полезно для липких сессий.

Что касается того, как это относится к входящей сети и сервису me sh, входная сеть настроена на маршрутизацию указанного порта c к этому VIP в входной сети на каждом узле в кластере. Вы увидите VIP для каждой оверлейной сети, к которой подключена служба, включая входную сеть, если у вас есть опубликованные порты, когда вы запустите docker network inspect -v ... в своей сети.

Единственный раз, когда я рассматриваю отключение входа Сеть - это если у меня есть глобальная служба, кластер из одного узла или служба, работающая в предсказуемом списке узлов, и я хочу избежать дополнительного сетевого скачка, добавляемого службой me sh. В этих сценариях ios я публикую sh порт в режиме «хоста» (см. Длинный синтаксис для публикации портов). Это не позволит вам запустить более одной реплики на узле, но в большинстве моих случаев использования это приложение с состоянием, где несколько реплик не имеют смысла.

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

По существу, существует 2 режима конечной точки:

  • dnsrr => IP-адреса контейнера разрешения службы DNS
  • default => Разрешение DNS-службы маршрутизатор доступа Swarm

Маршрутизатор Swarm является чистым *****, у него много сетевых проблем (тайм-аут, нет маршрута к хосту, зомби).

dnsrr выдаст все IP-адреса контейнеров, это круто, но это может вызвать проблемы с кешем DNS (logsta sh, Php клиент AMQP ...):

"служба A имеет DNS-кеш X-секунд, она может связываться с контейнером B .1. Контейнер B.1 cra sh, повторный вызов с другим IP ==> сервисом A, все еще отправляющим на прежний IP "

Также будьте осторожны в случае контейнера с несколькими сетями.

...