Как развернуть консул с помощью режима Docker 1.12 swarm
У меня есть консольный кластер из 3 серверов. У меня также есть докерный рой, состоящий из 6 рабочих и 3 мастеров (мастера находятся на том же оборудовании, что и серверы консула, но устанавливаются с возможностью доступности == для предотвращения их приема работы).
Я обычно использую консул-шаблон для чтения консула K/V. Я не могу, чтобы жизнь меня работала над тем, как разумно развертывать услугу агента консула. Если я использую глобальную услугу, то я получаю один агент за node, но кластер серверов жалуется, потому что все агенты клиента имеют одинаковый IP-адрес.
Кажется, что реплицированные сервисы - это путь, но я считаю, что мне нужно опубликовать клиентский порт 8301, и это, похоже, вызывает столкновение с моим кластером серверов (на котором работают как мастер-роуд, так и консул-серверы (не под докеры).
Я бы оценил общее руководство в правильном направлении - имея в виду, что это 1.12 swarm-режим и поэтому очень отличается от более ранних версий.
Ответы
Ответ 1
После долгих обсуждений и многих тупиков мы наконец придумали решение, которое работает для нас. Часть проблемы заключается в том, что на момент написания статьи Docker 1.12 несколько несовершеннолетний и вводит ряд понятий, которые необходимо понять, прежде чем все это имеет смысл. В нашем случае наш предыдущий опыт с 1.12 вариантами Swarm мешал нашему дальнейшему мышлению, а не помогал.
Решение, которое мы использовали для развертывания службы консула K/V для нашего роя, выглядит следующим образом
-
Создайте оверлейную сеть под названием 'consul'. Это создает адресное пространство для обслуживания нашей службы.
docker network create --driver overlay --subnet 10.10.10.0/24 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. (Консул не будет разрешать имена для присоединения - другие контейнеры могут работать лучше, позволяя указать имя службы "consulserver", а не VIP)
Это делается, любая другая служба может получить доступ к консулагенту, присоединившись к сети консулов и разрешая имя "консулагент". Служба консулагента может быть масштабирована (или, возможно, развернута как глобальная служба) по мере необходимости.
Издательский порт 8500 предоставляет доступную услугу на краю рой и может быть удален, если вам не нужно было предоставлять доступ к службам не-рой.
Ответ 2
Это сбивает с толку, но Docker "Swarm Mode" - это действительно другое животное, которое все еще называется Docker Swarm. В режиме Роя вам не нужен Консул. Демон-докер на каждом хосте действует как хранилище значений ключей и выполняет обнаружение службы. Он делает все, для чего нужен Консул в "старом" Докеровском рое.
Просто будьте осторожны, чтобы искать документацию/информацию, специфичную только для режима роя. Мне жаль, что они не использовали для этого другое имя.
Ответ 3
В моем блоге я так же разбираюсь в ответе MarkH, но главное отличие заключается в том, что вместо того, чтобы указывать на 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 node, чтобы вы могли поменять его на реплики и поставить свои ограничения.
Ответ 4
Для таких, как я, которые предпочитают запускать наши службы из файлов docker-compose.yml, мне удалось "развертывать стек докеров"
https://github.com/thechane/consul/blob/master/docker-compose.yml
... для запуска Consul в качестве службы Docker.
--- ИЗМЕНИТЬ, плохая форма, чтобы просто ответить на ссылки, вот так:
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
Также обратите внимание: позднее я обнаружил, что без семени больше не могут быть добавлены экземпляры consul. Поэтому, если вы намереваетесь увеличить количество swarm node, я бы удалил команду timeout с ее параметрами из начальной точки семени.