2016-08-17 6 views
0

У меня 6 микросервисов, упакованных в докерные контейнеры. На каждом узле рой я установил агента консула, привязанного к IP-адресу хоста и клиенту в режиме 0.0.0.0. Все микросервисы находятся в файле-файле, который я запускаю из диспетчера Swarm. Микросервисы написаны на Java и в bootstrap.yml Я должен указать конечную точку консула. Возможные варианты:Докерный рой, консул и весенний ботинок

  • локальные переменная
  • $ {} HOSTIP среды

Проблема: - локальный не локальный хост, но контейнер локальный, и я не имею консул агента на контейнер localhost, но хост. - $ {HOSTIP} в файле компоновки я должен предоставить этот env var. Но я не знаю, где Swarm MAnager планирует запланировать запуск микросервиса, поэтому я не могу знать, какой IP-адрес будет использоваться.

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

У вас есть предложения, как это решить? У меня есть кластер consul, 3 менеджера и 3 узла. на каждом менеджере и узле у меня запущен агент консула (в качестве контейнера докеров). Независимо от того, какой тип сетей я использую, я не могу запустить микросервис. Я начал консул как --net = host и --net = bridge, но это не работает.

Есть ли у кого-нибудь идеи? Спасибо заранее.

+0

[Читать] (http://blog.nimbleci.com/2016/08/17/how -to-setup-and-deploy-to-a-1000-node-docker-swarm /) может вам помочь. [Этот тоже] (http://stackoverflow.com/questions/34365604/how-to-create-docker-overlay-network-between-multi-hosts/34434948#34434948). – Auzias

+0

Ознакомьтесь с новой функцией рояля Docker Engine в версии 1.1. Теперь обнаружено обнаружение службы, что означает, что вам больше не понадобится использовать консул для отслеживания экземпляров контейнера. https://docs.docker.com/engine/swarm/. Я также могу порекомендовать следующее, в котором подробно описано, как интегрировать балансировщики нагрузки с новым режимом роя: https://technologyconversations.com/2016/08/01/integrating-proxy-with-docker-swarm-tour-around-docker-1 -12-series/ –

ответ

0

Итак, вы работаете в консуле в контейнерах, верно? Возможно ли в вашей установке связать контейнеры? Таким образом, вы можете запускать контейнеры consul в качестве «консула» на каждом хосте и связывать свои микросервисы с ним. Связанные контейнеры получают запись хоста, и поэтому служба консула должна быть доступна в «consul: 8500» из ваших услуг. Редактирование: если вы используете официальное изображение Ducer Consul от Hashicorp, вы можете настроить адрес клиента на 0.0.0.0, это должно сделать API консула доступным для других контейнеров, запущенных на хосте.

+0

Я бегу консул в контейнере докера, официальный образ на всех хостах. адрес клиента установлен в 0.0.0.0. Кроме того, я запускаю консул с флагом --net = host. в файле компоновки имеется 5 контейнеров. ссылки не помогут, поскольку консул находится в сети хоста, но контейнеры запускаются в оверлейной сети. Я также пробовал использовать мосты, но он не работал. –

+0

Правда, соединение и --net = хост одновременно не допускаются. С официальным изображением из Hashicorp вы можете использовать некоторые переменные среды.Этот вариант работал для меня: 'docker run -d -e CONSUL_CLIENT_INTERFACE = docker0 -e CONSUL_BIND_INTERFACE = lo -net = агент консула хоста' - он связывает клиентский интерфейс и API с интерфейсом моста Docker (стандарт - 172.17.0.1 с момента теперь), и я смог вызвать агента через curl из другого контейнера через этот IP – kgorskowski

+0

Просто не работает. Консул запускается на локальном хосте, но поскольку приложение java находится в контейнере, а консул endopoint является localhost, он просто не знает, как использовать localhost из VM, а не из контейнера. –

0

Позвольте мне ответить на мой вопрос Q: Это не способ, которым мы хотим это сделать. Я имею в виду, что мы не можем помещать некоторые вещи в Рой и кое-что за пределы Рой с ожиданием, что это сработает. Я не буду. Консул как открытие службы не может использоваться и за пределами Роя. Простым ответом было бы использовать Docker Orchestration и Service discovery и не привлекать Консула. Если кто-то использует Swarm, все должно быть в оверлейных сетях (кролик, redis, лось и т. Д.) ...

+0

Когда вы говорите: «Это не способ, которым мы хотим это сделать», вы говорите о том, что спрашивает OP, или о том, что Кгогорски сказал в его ответе? Не могли бы вы отредактировать свой ответ и прояснить его? Спасибо! –