Необходимость обнаружения службы для режима роя движка докеров

Я смущен роем докеров. Насколько мне известно, старый способ запуска роя состоял в том, чтобы запускать менеджера и воркеров в контейнерах до того, как движок докеров предоставил встроенную поддержку режима роя. В документации по старому контейнерному рою объяснялось, как настроить обнаружение сервисов с помощью consul, etcd или zookeeper. Обнаружение служб необходимо, так как службы запускаются на случайных портах, чтобы избежать коллизий, верно?

Документация для режима роя Docker Engine не объясняет, как настроить обнаружение службы. Теперь я запутался, включен ли механизм в режиме роя, или документация неполная.

Где я могу найти четкое и актуальное объяснение режима роя и его отношения к таким понятиям, как обнаружение сервисов?


person Tuomas Toivonen    schedule 24.11.2016    source источник


Ответы (2)


Хотя ответ, данный @MagicMicky, верен, я попытаюсь добавить больше контекста о разнице между Swarm Legacy и Swarm Mode в отношении обнаружения службы:

Примечание. Первую версию Swarm я буду называть Swarm legacy, а новую версию — Swarm mode.

Обнаружение сервисов с помощью Swarm Legacy

Используя Swarm Legacy, вам нужно было развернуть свой собственный Zookeeper, Consul или Etcd для управления узлами топологии кластера. назначаются агентами в кластере. Эти распределенные хранилища ключей и значений использовались для мониторинга работоспособности и распределенной блокировки. Они не использовались Swarm для управления обнаружением сервисов, а только для обнаружения и мониторинга узлов кластера.

Если вы хотели, чтобы сервисное обнаружение для ваших контейнеров было развернуто через Swarm, вам нужно было, например, настроить внешний консул/регистратор/DNS и зарегистрировать свои сервисы в этих решениях. На мой взгляд, примером такой системы, созданной специально для Swarm, был Wagl.

В более поздних версиях Docker Engine (1.11) у вас также был доступ к встроенному DNS при создании оверлейных сетей и назначении контейнеров в оверлейную сеть. До 1.11 (противоречивый) механизм обнаружения служб заключался в добавлении записей служб через /etc/hosts.

В любом случае, оверлейная сеть не была напрямую включена в Swarm, и это был отдельный компонент, требующий собственной настройки. Это было скорее "дополнение".

Как правило, «философия» первой версии Swarm заключалась в том, чтобы предоставить что-то простое и надежное для управления контейнерами между хостами, если вам нужно было добавить к нему дополнительные возможности, например, обнаружение служб или балансировку нагрузки, вам приходилось развертывать свои собственные.


Обнаружение сервисов в режиме Docker Swarm

Начиная с Docker 1.12, обнаружение служб напрямую включается в Docker через режим Swarm с встроенным DNS и балансировщиком нагрузки. Это означает, что больше нет необходимости во внешнем компоненте для управления обнаружением служб и балансировкой нагрузки.

Когда вы создаете службу и назначаете ее оверлею, ее DNS-имя регистрируется, и другие службы, входящие в состав оверлея, могут получить к ней доступ через ее имя службы. Задачи, выполняемые для службы, правильно сбалансированы по нагрузке с использованием встроенного LB.

Для режима Swarm «философия» заключается в том, чтобы включить все «из коробки» (управление и ротация сертификатов, обнаружение сервисов, балансировка нагрузки, метаданные кластера через встроенное хранилище данных, сеть, планирование), чтобы гарантировать, что у вас есть наиболее полная система возможна с первого дня. Вы по-прежнему можете менять и заменять некоторые компоненты, если это необходимо.

person abronan    schedule 24.11.2016

Действительно, начиная с версии docker 1.12, режим docker swarm реализует собственные возможности обнаружения сервисов.

Настройка на одном хосте (тестирование)

Чтобы изучить его и, например, возможности балансировки нагрузки, вы можете сделать следующее:

#Setup your docker engine as a docker swarm manager
docker swarm init
#Create an nginx service
docker service create --name nginx --publish 80:80 nginx

Теперь вы можете перечислить службы, используя docker service ls, и увидеть, что у вас есть служба nginx. Если вы сделаете docker ps, вы увидите, что ваш контейнер не предоставляет какие-либо порты непосредственно машине, но если вы попытаетесь проверить свою службу, порт действительно отображается как порт службы. Таким образом, чтобы получить доступ к вашему контейнеру, вам нужно подключиться к адресу менеджера роя докеров и вашему опубликованному порту. Здесь, поскольку ваша машина является менеджером, вам потребуется доступ к localhost:80 или к вашей $DOCKER_HOST:80, если вы используете докер-машину или эквивалентную ей.

> docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS               NAMES
7f9d93dbbce5        nginx:latest        "nginx -g 'daemon off"   About a minute ago   Up About a minute   80/tcp, 443/tcp     nginx.1.4zr3zacuw06ax9swuit4wbacd
> curl -X GET localhost:80
# Result showing nginx stuff

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

При настройке нескольких хостов

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

При взаимодействии с роем вы всегда будете напрямую разговаривать с менеджером роя докеров. Затем вы можете создать службу nginx, как указано выше, и служба будет создана либо на управляющем, либо на рабочем узле. Затем, чтобы получить доступ к вашему контейнеру через его порт, вам нужно будет получить доступ к узлу менеджера через его IP-адрес, который перенаправит запрос в контейнер, будь то рабочий узел или узел менеджера. Вы также можете масштабировать его и увидеть, как происходит балансировка нагрузки, поскольку он будет опрашивать оба контейнера в циклическом режиме.

Обнаружение внутренних служб

Начиная с версии Docker 1.12, также существует функция обнаружения внутренних служб, которая позволяет вам получать доступ к другим службам, используя свой служебный DNS.

Чтобы получить доступ к этой функции, вам необходимо создать оверлейную сеть и подключить к ней свой сервис.

 docker network create --driver overlay mynetwork
 docker service create --name nginx --network mynetwork nginx
 docker service create --name testing --network mynetwork node sleep 10000 #node because it already has ping cmd
 #locate your testing service's container, and ping the nginx host
 docker exec -ti ping nginx
 #See the magic happen

Опять же, многое есть в документации, в разделе Docker Engine > Manage a swarm. См. обзор режима Swarm

person MagicMicky    schedule 24.11.2016