Поиск по сайту:

Что такое режим Docker Swarm и когда его следует использовать?


Swarm Mode — это встроенная в Docker система оркестровки для масштабирования контейнеров в кластере физических машин. Несколько независимых клиентов, использующих Docker Engine, объединяют свои ресурсы, образуя рой.

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

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

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

Создание собственного роя

Прежде чем продолжить, убедитесь, что у вас установлен Docker. Вам понадобится полный пакет Docker CE на каждой машине, которую вы хотите добавить в рой.

Назначьте одного из ваших хостов менеджером роя. Этот узел будет управлять кластером, отправляя запросы на планирование контейнера другим узлам. Запустите docker swarm init в диспетчере, чтобы начать процесс настройки кластера:

docker swarm init --advertise-addr 192.168.0.1

Замените IP-адрес реальным IP-адресом вашего управляющего узла. Команда выдаст команду docker swarm join, которую вы должны запустить на своих вторичных узлах. Затем они присоединятся к рою и получат право размещать контейнеры.

После добавления узлов запустите docker info в диспетчере, чтобы проверить состояние кластера. Раздел Swarm вывода команды должен быть указан как «активный». Убедитесь, что количество «узлов» соответствует количеству добавленных вами узлов.

Вы можете получить более подробную информацию об узле, запустив docker node ls. Это показывает уникальный идентификатор каждого узла, его имя хоста и его текущий статус. Узлы, которые показывают доступность «активно» со статусом «готово», исправны и готовы поддерживать ваши рабочие нагрузки. В столбце «Статус менеджера» указаны узлы, которые также действуют как менеджеры роя. «Лидер» — это узел, несущий полную ответственность за кластер.

Развертывание контейнера

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

docker service create --replicas 3 --name apache httpd:latest

Эта команда создает службу, используя образ httpd:latest для веб-сервера Apache. Будут созданы три независимые реплики, обеспечивающие устойчивость к завершению работы контейнера и сбоям узлов. Реплики контейнеров называются «задачами» на языке Docker Swarm.

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

Услуги масштабирования

Вы можете масштабировать сервисы в любое время с помощью команды docker service scale:

docker service scale apache=5

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

Сервисы также можно масштабировать с помощью docker service update:

docker service update apache --replicas=5

При использовании этого варианта вы можете отменить изменение с помощью специальной команды:

docker service rollback apache

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

Последовательные обновления

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

Добавьте флаг --update-delay в команду docker service scale, чтобы активировать последовательные обновления. Задержка определяется как комбинация часов h, минут m и секунд s. Менеджер роя будет обновлять каждый экземпляр контейнера индивидуально. Вы можете настроить количество задач, обновляемых за одну операцию, с помощью флага --update-parallelism.

Вот как масштабировать службу до 10 реплик, обновляя три контейнера за раз с пятиминутной задержкой между каждым пакетом:

docker service scale --name apache --replicas=10 --update-delay 5m --update-parallelism 3

Управление службами

Многие знакомые команды Docker также работают со службами. Добавляйте в начале обычных команд управления контейнерами docker service, чтобы получить список служб, просмотреть их журналы и удалить их.

  • docker service inspect — проверка технических данных именованной службы.
  • журналы службы Docker — просмотр выходных данных журнала, связанных с именованной службой.
  • docker service ls — список всех запущенных служб.
  • docker service ps – показывает отдельные экземпляры контейнеров, инкапсулированные определенной службой.
  • docker service rm — удалить службу со всеми ее репликами. Нет запроса на подтверждение.

Помимо основных операций управления, описанных до сих пор, службы поставляются с богатым набором параметров конфигурации. Их можно применить при создании службы или позднее с помощью команды docker service update.

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

Открытие сетевых портов

Сетевые порты контейнера отображаются с флагом --publish для создания службы Docker и обновления службы Docker. Это позволяет указать порт целевого контейнера и общедоступный порт для его представления.

docker service create --name apache --replicas 5 --publish published=8080,target=80 nginx:latest

Теперь вы можете подключиться к порту 8080 на любом из ваших рабочих узлов, чтобы получить доступ к экземпляру службы NGINX. Это работает, даже если узел, к которому вы подключаетесь, на самом деле не выполняет одну из задач службы. Вы просто взаимодействуете с роем, и он заботится о сетевой маршрутизации. Такой подход называется «сеткой маршрутизации».

Альтернативный вариант позволяет публиковать порты контейнера на отдельных узлах, где выполняются задачи. Добавьте mode=host к флагу --published, чтобы включить это. Сервис будет доступен только на узлах, на которых он размещен. Это полезно в тех случаях, когда вы хотите подключиться к конкретному экземпляру службы. Сетка маршрутизации рандомизирует экземпляр, к которому вы подключаетесь, независимо от узла, который вы используете для подключения.

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

docker service create --name service1 --network demo-network my-image:latest
docker service create --name service2 --network demo-network my-image:latest

Задачи, созданные service1 и service2, смогут связываться друг с другом через оверлейную сеть. Сеть по умолчанию с именем ingress обеспечивает стандартную функциональность сетки маршрутизации, описанную выше.

Заключение

Режим Swarm — это оркестратор контейнеров, встроенный прямо в Docker. Поскольку он включен по умолчанию, вы можете использовать его на любом хосте с установленным Docker Engine.

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

Режим Docker Swarm выгодно отличается от альтернативных платформ оркестрации, таких как Kubernetes. С ним легче начать работу, поскольку он интегрирован с Docker и требует изучения меньшего количества концепций. Часто проще установить и обслуживать самоуправляемое оборудование, хотя предварительно упакованные решения Kubernetes, такие как MicroK8, подрывают фактор удобства Swarm. Несмотря на это, режим Swarm остается жизнеспособным оркестратором для самостоятельных рабочих нагрузок, особенно если вы ищете ориентированное на разработчиков решение на основе CLI, менее требовательное к операционным группам.