Автоматическая самоконфигурация кластера etcd в качестве службы роуминга Docker
Я хочу найти способ развернуть кластер etcd в качестве службы Docker Swarm, который автоматически настроил бы себя без какого-либо взаимодействия. В принципе, я думаю о чем-то в духе этой команды:
docker service create --name etcd --replicas 3 my-custom-image/etcd
Я предполагаю, что оверлейная сеть настроена на безопасность и обеспечивает как шифрование, так и аутентификацию, поэтому я считаю, что мне не нужен TLS, даже --auto-tls
. Не хотите, чтобы дополнительная головная боль находила способ предоставления сертификатов, когда это можно решить на другом уровне.
Мне нужен уникальный --name
для каждого экземпляра, но я могу получить его с точки входа script, которая использовала бы export ETCD_NAME=$(hostname --short)
.
Проблема в том, что я застрял в начальной конфигурации. На основе руководства по кластеризации есть три варианта, но ни один из них не подходит:
- Сценарий обнаружения DNS ближе всего к тому, что я ищу, но Docker не поддерживает обнаружение DNS SRV на данный момент. Я могу найти
etcd
, и я получу все IP-адреса контейнеров своих узлов, но нет записей _etcd-server._tcp
.
- Я не могу автоматически создавать
ETCD_INITIAL_CLUSTER
, потому что, пока я знаю IP-адреса, я не знаю имена других узлов, и я не знаю, как это можно понять. (Я не собираюсь открывать сокет Docker API для контейнера etcd для этого.)
- Существует уже существовавший и т.д. кластер, и при поставке начального URI конфигурации из discovery.etcd.io - это возможное обходное решение, которое я заинтересован в том, чтобы не делать этого. Я пытаюсь "просто развернуть стек из этого
docker-compose.yml
, и он автоматически сделает все правильно, без вопросов".
Есть ли трюк, который я могу вытащить?
Ответы
Ответ 1
Как вы правильно сказали, что знаете IP-адреса ваших контейнеров узлов,
поэтому предлагаемый трюк состоит в том, чтобы просто построить требуемые имена etcd
в качестве производных от каждого IP-адреса node s.
- внутри каждого контейнера
etcd
вызывается с использованием этого конкретного контейнера IP i.e. etcd-$ip
-
ETCD_INITIAL_CLUSTER
заполняется с использованием других IP-адресов контейнеров аналогичным образом.
Имена могут быть такими же простыми, как etcd-$ip
или даже лучше, то есть мы могли бы использовать netmask
для вычисления IP-адреса node s в этой сети, чтобы сделать имена более красивыми.
В этом случае в простой конфигурации с тремя узлами можно было бы иметь имена типа etcd-02
etcd-03
и т.д.
Никаких особых требований для атрибута name, он просто должен быть уникальным и удобочитаемым для человека. Хотя это действительно похоже на трюк, он может работать