Как развернуть 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 для нашего Роя происходит следующим образом:

  1. создайте сеть наложения под названием "консул". Это создает адресное пространство для работы нашего сервиса.

    docker network create --driver overlay --subnet 10.10.10.0/24 consul

  2. разверните кластер серверов 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) в начале сети консула, который сопоставляется с тремя новыми экземплярами.

  3. Далее мы развернули службу агента

    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 с ее параметрами из начальной точки входа.