Как развернуть консул с помощью режима 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 с ее параметрами из начальной точки семени.