Выяснение IP-адреса сервиса для докуризированного Консула - PullRequest
0 голосов
/ 01 июня 2019

Я создаю приложение на основе микросервисов и хотел бы использовать Консул в качестве реестра службВ целом у меня есть три сценария:

  • Все службы выполняются на хосте.
  • Все службы выполняются на хосте, но Consul работает в Docker.
  • Все службы и Консул работают в Docker.

Теперь у меня есть проблема, как зарегистрировать службы с их IP-адресом, потому что мне нужно выяснить их IP-адрес, чтобы он был доступен дляКонсул (например, для проверки работоспособности):

  • Если все работает на одном хосте, это довольно просто: просто используйте 127.0.0.1, и все готово.
  • Есливсе (включая Consul) работает в Docker, я мог бы использовать hostname -i из контейнеров Docker, чтобы выяснить их внешний IP и передать его Consul.Это работает, но мне интересно, есть ли лучший способ решить эту проблему?(В идеале решение также должно работать в Kubernetes таким же образом.)
  • Если службы работают на хосте, но Consul работает в Docker, сейчас я вообще пропускаю какие-либо идеи.По сути, Консул требует, чтобы IP-адрес хоста мог общаться со службами, но я могу обнаружить это только в контейнере Консула (путем разрешения host.docker.internal).Но, во-первых, это не работает извне, а во-вторых, это работает только для Docker для Mac / Windows, а не, например, для Kubernetes.

Как я мог решить эти проблемы?

PS: Я бы не хотел использовать контейнер, такой как registrator от Gliderlabs, так как сомневаюсь, насколько хорошо это работает на Kubernetes, а также это не поможет в смешанном сценарии Docker / host.

1 Ответ

2 голосов
/ 01 июня 2019

Если вы используете Kubernetes, вы можете начать с проверки того, соответствует ли встроенный реестр служб вашим потребностям. Как правило, нет прямого пути для доступа к модулю через IP-адрес узла его узла, поэтому описанная вами настройка не будет работать должным образом. (Я мог бы подумать, что Консул - это хранилище ключей / значений, но я бы не стал обращаться к нему как к реестру услуг на земле Кубернетес.)

В простой среде Docker с несколькими хостами это одна из немногих ситуаций, в которых я нашел подходящую сеть хостов. Запустите Консул с помощью --net host или эквивалентной опции в Docker Compose или другом инструменте оркестровки. Тогда Consul будет полагать, что «его» IP-адрес принадлежит хосту, и если у вас есть автоматические TCP-зонды для известных портов, вы можете найти все службы, работающие на хосте, и обнаружить , например, службу MySQL на порту. 3306, независимо от того, работает он в контейнере или на хосте.

При этой настройке servicename.service.consul будет преобразован в некоторый IP-адрес физического хоста. Если у вас есть контейнер Docker, указывающий на его текущий хост для службы DNS, то он перенаправит службу на некоторый хост, возможно, на тот же, но в прошлом это работало надежно для меня.

Обратите внимание, что соответствующие имена хостов будут отличаться в разных средах: servicename.service.consul для настройки на основе Consul, servicename.namespacename.svc.cluster.local в Kubernetes, возможно localhost в среде разработчика и рабочего стола. Вы должны убедиться, что это настраивается, проще всего через переменную окружения.

...