2

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

Я начинаю с 3 голых серверов с установленным механизмом докера. Я готовлю кластер, используя ansible.

Процесс настройки этого кластера:

  • При установке docker, установите --cluster-store=consul://127.0.0.1:8500 в опциях демона docker
  • На "основном" кластерном узле запустите контейнер сервера консула в режиме «-bootstrap-wait 3»
  • На "вторичных" узлах кластера запустите контейнер сервера консула в режиме «-join»
  • Запустите мастер роя и контейнер агента роя на каждом узле кластера, указывая на локальный консул-сервер на том же хосте

При запуске серверов консула я сопоставляю все порты консула с хостом, вот так:

version: '2'

services:
    consul:
        image: progrium/consul
        hostname: "{{ ansible_hostname }}"
        ports:
            # Explanation of ports needed: http://stackoverflow.com/a/30692226/1514089
            - "8300:8300" # This is used by servers to handle incoming requests from other agents
            - "8301:8301/tcp" # This is used to handle gossip in the LAN. Required by all agents
            - "8301:8301/udp" # This is used to handle gossip in the LAN. Required by all agents
            - "8302:8302/tcp" # This is used by servers to gossip over the WAN to other servers
            - "8302:8302/udp" # This is used by servers to gossip over the WAN to other servers
            - "8400:8400" # This is used by all agents to handle RPC from the CLI
            - "8500:8500" # This is used by clients to talk to the HTTP API
            - "8600:8600" # Used to resolve DNS queries
         restart: always
         command: "{{ consul_command }}"

Это заставляет меня работать роем докеров. Я могу войти в любой из узлов кластера и использовать docker compose для запуска приложения, рой прозрачно балансирует вещи между серверами.

Теперь, хотя я хочу начать использовать возможности DNS conss для разрешения служб внутри каждого контейнера в рое, я хочу сделать это:

$ docker run -it ubuntu dig consul.service.consul

Я попробовал несколько вещей, но у меня не получилось, я подозреваю, что это как-то связано с сетями докеров. Позволь мне объяснить...

Когда я запускаю консул-серверы, они подключаются к собственной сети docker-compose, так как я запускаю их с docker-compose. Однако, поскольку рой еще не работает, очевидно, что наложенные сети с несколькими хостами еще не созданы. Таким образом, каждый контейнер консула оказывается в своей собственной мостовой сети только для хоста. Я создаю свои докеры только после того, как рой был загружен. Я не смог добавить контейнеры консула в оверлейную сеть после того, как рой поднялся, я получаю

Error response from daemon: No such container: swarm-node-1/swarmconsul_consul_1

Как я могу заставить обнаружение службы на основе DNS работать внутри моих контейнеров?

1 ответ1

0

В конце концов мне удалось заставить его работать. Я делал несколько вещей неправильно.

Самой большой ошибкой было то, что я не назначил порт 53 на хосте порту 53/udp внутри контейнера консула. Полное отображение портов теперь выглядит так:

services:
    consul:
        image: progrium/consul
        hostname: "{{ ansible_hostname }}"
        ports:
          # Explanation of ports needed: http://stackoverflow.com/a/30692226/1514089
          - "8300:8300" # This is used by servers to handle incoming requests from other agents
          - "8301:8301/tcp" # This is used to handle gossip in the LAN. Required by all agents
          - "8301:8301/udp" # This is used to handle gossip in the LAN. Required by all agents
          - "8302:8302/tcp" # This is used by servers to gossip over the WAN to other servers
          - "8302:8302/udp" # This is used by servers to gossip over the WAN to other servers
          - "8400:8400" # This is used by all agents to handle RPC from the CLI
          - "8500:8500" # This is used by clients to talk to the HTTP API
          - "8600:8600" # Used to resolve DNS queries
          - "172.17.0.1:53:53/udp"
        restart: always
        command: "{{ consul_command }}"

Здесь мы привязываемся к порту 53 на интерфейсе docker0. Однако я узнал, что IP-адрес моста docker0 может измениться, поэтому немного жестко его закодировал и велел докеру всегда использовать этот IP-адрес для моста docker0, указав --bip=172.17.0.1 в параметрах демона docker. Следующим шагом было установить днс по умолчанию демона docker на тот же IP. Мои полные опции демона докера выглядят так:

[Service]
ExecStart=
ExecStart=/usr/bin/docker daemon \
    -H tcp://0.0.0.0:2375 \
    -H unix:///var/run/docker.sock \
    --bip=172.17.0.1/16 \
    --dns=172.17.0.1 \
    --dns-search=service.consul \
    --storage-driver=overlay \
    --cluster-store=consul://127.0.0.1:8500

Теперь я могу сделать это:

$ sudo docker -H :4000 run -it joffotron/docker-net-tools
/ # dig +short consul.service.consul
10.0.0.93
10.0.0.95
10.0.0.94

Большой!

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .