Обнаружение службы DNS с помощью Consul в Docker Swarm

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

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

процесс настройки кластера до сих пор:

  • когда установка docker, set --cluster-store=consul://127.0.0.1:8500 в Docker демон выбирает
  • на узле кластера" primary "запустите контейнер consul server в режиме"- bootstrap-expect 3"
  • на узлах кластера" secondary "запустите контейнер consul server в режиме"- 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 для вызова приложения, swarm прозрачно балансирует вещи на серверах.

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

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

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

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

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

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

15
задан Emmet O'Grady
17.01.2023 11:22 Количество просмотров материала 3557
Распечатать страницу

1 ответ

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

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

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 может измениться, поэтому я немного его закодировал и сказал docker всегда использовать этот IP для моста docker0, указав --bip=172.17.0.1 в параметрах демона docker. Следующий шаг должен был установить dns по умолчанию демона docker к тому же IP. Мой полный демон docker opts выглядит так:

[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

великолепно!

0
отвечен Emmet O'Grady 2023-01-18 19:10

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх