Запуск контейнеров Elasticsearch в режиме рой

Elasticsearch предназначен для работы в режиме кластера, все, что мне нужно сделать, - это определить соответствующие IP-адреса node в кластере через переменную окружения и до тех пор, пока доступно сетевое подключение, оно будет подключаться и присоединяться к другим узлам к кластера.

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

Теперь я пытаюсь запустить контейнер elasticsearch таким образом, чтобы это позволило мне объединить все узлы в один и тот же кластер elasticsearch, однако я хочу, чтобы узлы соединялись с использованием их сетевого интерфейса наложения, а это означает, что мне нужно знать внутренние внутренние адреса контейнера во время запуска команды docker service create, как я могу это сделать? Должен ли я использовать что-то вроде консула для достижения этого?

Некоторые пояснения:

Мне нужно знать во время создания службы IP-адреса (или имена DNS) для всех участников Elasticsearch, чтобы я мог правильно запустить кластер. Это должно быть во время творения, а не потом. Кроме того, насколько я понимаю, я могу разоблачить порты 9200/9300 для всех служб и работать с внешними IP-машинами и заставить его работать, но я бы хотел использовать оверлейную сеть для выполнения всех этих сообщений (я думал, что это то, что рой mode для).

Ответ 1

Только частичное решение здесь. Таким образом, при подключении своих услуг к пользовательской сети наложения, у вас действительно есть доступ к настраиваемой службе Docker. Я подробно расскажу о сетевой функции режима Docker Swarm, прежде чем пытаться привязать ее к вашей проблеме.

Я буду использовать другой термин services и задач, в котором служба может быть elasticsearch, тогда как задача - это единственный экземпляр этой службы elasticsearch.

Сеть докеров

Идея заключается в том, что для каждой службы, которую вы создаете, docker назначает виртуальный IP (VIP) и пользовательский псевдоним dns. Вы можете получить этот VIP, используя команду docker service inspect myservice.

Но есть два режима подключения службы к оверлейной сети dnsrr и VIP. Эти параметры можно выбрать с помощью опций --endpoint-mode docker service create.

Режим VIP (я считаю, что он по умолчанию или, по крайней мере, самый используемый), влияет на виртуальный ip на псевдоним службы dns. Это означает, что выполнение nslookup servicename вернет вам один vip, который за кулисами будет связан с одним из ваших контейнеров в циклическом режиме. Но есть также специальный псевдоним dns, который позволяет вам получить доступ ко всем вашим экземплярам ips (все ваши задачи ips): tasks.myservice.

Итак, в режиме VIP вы можете получить все ваши задачи ips с помощью простого nslookup tasks.myservice, где myservice - это имя службы.

Другой режим - dnsrr. Этот режим просто избавляется от VIP и подключает псевдоним dns к различным задачам (= экземплярам службы) с помощью циклического доступа. Таким образом, вам просто нужно сделать nslookup myservice для извлечения различных экземпляров службы ip.

Кластеризация elasticsearch

Хорошо, так что в первую очередь я не очень хорошо знаком с тем, как elasticsearch позволяет вам кластеризовать. Из того, что я понял из вашего вопроса, вам нужно, когда вы запускаете двоичный файл elasticsearch, укажите его как параметр, адрес all других узлов, с которыми ему нужно кластерировать.

Итак, что бы я сделал, это создать пользовательский образ Elasticsearch, возможно, основанный на одном из библиотеки по умолчанию, к которому я бы добавил пользовательский Entrypoint, который сначала запускал script для извлечения других задач ф.

Я полагаю, что пребывание в VIP-режиме подходит для вас, так как есть псевдоним tasks.myservice dns. Затем вам нужно будет разобрать вывод для извлечения задач ip (и, возможно, удалить ваши). Затем вы сможете сохранить их в переменной окружения файла конфигурации или использовать их в качестве параметра времени выполнения для бинарного файла elasticsearch.

Изменить. Чтобы создать настраиваемую оверлейную сеть, вам нужно будет использовать команду docker network create и использовать опцию --network docker service create

Это ответ в основном основан на Сетевая документация режима Swarm