Как развернуть consul с помощью режима Docker 1.12 swarm
У меня есть консул кластер из 3 серверов. У меня также есть Рой докеров около 6 рабочих и 3 мастеров (мастера находятся на том же оборудовании, что и серверы консула, но установлены с availability == drain, чтобы предотвратить их прием работы).
Я обычно использую consul-template для чтения consul K / V. Я не могу в течение жизни понять, как разумно развернуть службу агента консула. Если я использую глобальную службу, я получаю один агент на узел, но кластер серверов жалуется, потому что все агенты клиента имеют один и тот же IP-адрес.
реплицированные службы, похоже, подходят, но я считаю, что мне нужно опубликовать клиентский порт 8301, и это, похоже, вызывает столкновение с моим кластером серверов (который работает как на серверах swarm master, так и на серверах consul (не под docker).
Я был бы признателен за общее направление в правильном направлении-имея в виду, что это режим Роя 1.12 и, следовательно, очень отличается от более ранних версий.
4 ответов
Это сбивает с толку, но Докер "режим роя" на самом деле другое животное, что то, что до сих пор называется Докер Рой. В режиме Роя вам не нужен консул. Демон docker на каждом хосте действует как хранилище ключевых значений и выполняет обнаружение службы. Он делает все для того, что консулу необходимо в "старые" Рой "Докер".
просто будьте осторожны, чтобы искать документацию / информацию, которая специфична только для "режима Роя". Жаль, что они не назвали его по-другому.
после долгих размышлений и многих тупиков мы, наконец, пришли к решению, которое работает для нас. Часть проблемы заключается в том, что на момент написания Докер 1.12 несколько молод и вводит ряд понятий, которые должны быть поняты, прежде чем все это будет иметь смысл. В нашем случае наш предыдущий опыт с вариантами Роя до 1.12 скорее мешал нашему передовому мышлению, чем помогал.
решение, которое мы использовали для развертывания службы consul K / V для нашего Роя происходит следующим образом:
-
создайте сеть наложения под названием "консул". Это создает адресное пространство для работы нашего сервиса.
docker network create --driver overlay --subnet 10.10.10.0/24 consul
-
разверните кластер серверов consul в новом наложении. У нас есть три хоста, которые мы используем в качестве узлов менеджера, и мы хотели, чтобы контейнеры сервера consul запускались на этом кластере, а не на серверах приложений, следовательно, флаг "ограничение"
docker service create -e 'CONSUL_LOCAL_CONFIG={"leave_on_terminate": true}' --name consulserver --network consul --constraint 'node.role == manager' --replicas 3 consul agent server -bootstrap-expect=3 -bind=0.0.0.0 -retry-join="10.10.10.2" -data-dir=/tmp
ключ вот что Рой выделит новый VIP (10.10.10.2) в начале сети консула, который сопоставляется с тремя новыми экземплярами.
-
Далее мы развернули службу агента
docker service create \ -e 'CONSUL_BIND_INTERFACE=eth0' \ -e 'CONSUL_LOCAL_CONFIG={"leave_on_terminate": true, "retry_join":["10.10.10.2"]}' \ --publish "8500:8500" \ --replicas 1 \ --network consul \ --name consulagent \ --constraint 'node.role != manager' \ consul agent -data-dir=/tmp -client 0.0.0.0
указание VIP службы consulserver. (Consul не будет разрешать имена для соединения - другие контейнеры могут работать лучше, позволяя указывать имя службы "consulserver", а не VIP)
Это сделано, любой другой сервиса могут получить доступ к consulagent, будучи присоединен к сети консул, и разрешение имени "consulagent". Служба consulagent может быть масштабирована (или развернута как глобальная служба) по мере необходимости. Порт публикации 8500 делает сервис доступным на краю Роя и может быть удален, если вам не нужно было делать его доступным для служб, отличных от роя.
в своем блог Я исследую аналогичный способ ответа Марха, но ключевое различие заключается в том, что вместо указания на VIP новых серверов я указываю на первые три узла, которые присоединяются к сети. Это может быть полезно из-за того, что VIP имеет проблемы, когда он будет указывать на себя по сравнению с балансировкой нагрузки на всех узлах на этом VIP. По моему опыту лучше делать это таким образом, для создания сервиса.
docker service create \
--network=consul \
--name=consul \
-e 'CONSUL_LOCAL_CONFIG={"skip_leave_on_interrupt": true}' \
-e CONSUL_BIND_INTERFACE='eth0' \
--mode global \
-p 8500:8500 \
consul agent -server -ui -client=0.0.0.0 \
-bootstrap-expect 3 \
-retry-join 172.20.0.3 \
-retry-join 172.20.0.4 \
-retry-join 172.20.0.5 \
-retry-interval 5s
Я использую глобальный режим здесь 3 узел рой, так что вы можете поменять это на реплики и поставить свои ограничения.
для таких, как я, которые предпочитают запускать наши службы из docker-compose.YML-файлы, мне удалось "развернуть стек docker"
https://github.com/thechane/consul/blob/master/docker-compose.yml
... запустить Consul в качестве службы докеров.
- - - редактировать, плохая форма, чтобы просто ответить на ссылки, так что вот она:
version: '3.1'
#customise this with options from
#https://www.consul.io/docs/agent/options.html
services:
seed:
hostname: seed
image: consul:0.8.0
deploy:
restart_policy:
condition: none #we do not want this to be restarted on timeout (see entrypoint options below)
replicas: 1
placement:
constraints:
- "engine.labels.access == temp"
- "engine.labels.access != consul"
environment:
- "CONSUL_LOCAL_CONFIG={\"disable_update_check\": true}"
- "CONSUL_BIND_INTERFACE=eth0"
entrypoint:
- timeout #this seed fires up the cluster after which it is no longer needed
- -sTERM #this is the same signal as docker would send on a scale down / stop
- -t300 #terminate after 5 mins
- consul
- agent
- -server
- -bootstrap-expect=5
- -data-dir=/tmp/consuldata
- -bind={{ GetInterfaceIP "eth0" }}
networks:
- "consul"
cluster:
image: consul:0.8.0
depends_on:
- "seed"
deploy:
mode: global ##this will deploy to all nodes that
placement:
constraints:
- "engine.labels.access == consul" ##have the consul label
- "engine.labels.access != temp"
environment:
- "CONSUL_LOCAL_CONFIG={\"disable_update_check\": true}"
- "CONSUL_BIND_INTERFACE=eth0"
- "CONSUL_HTTP_ADDR=0.0.0.0"
entrypoint:
- consul
- agent
- -server
- -data-dir=/tmp/consuldata
- -bind={{ GetInterfaceIP "eth0" }}
- -client=0.0.0.0
- -retry-join=seed:8301
- -ui ##assuming you want the UI on
networks:
- "consul"
ports:
- "8500:8500"
- "8600:8600"
networks:
consul:
driver: overlay
также обратите внимание, что позже я обнаружил, что без семени больше экземпляров консула не может быть добавлено. Так что если вы намерены чтобы расширить количество узлов Роя, я бы удалил команду timeout с ее параметрами из начальной точки входа.