Я пытаюсь заставить службу обнаружения работать, используя консул 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 работать внутри моих контейнеров?