Введение в Docker Swarm
Одна из особенностей Docker заключается в том, что вы можете запускать несколько сред Docker в одной и той же среде хоста. Однако Docker может поддерживать только определенное количество контейнеров, поскольку он работает на одном узле. Но что, если кто-то хочет работать с тысячами контейнеров или разрабатывать их? Именно здесь на сцену выходит Docker Swarm.
Docker Swarm — это виртуализация большого количества узлов (с движком Docker), работающих в кластере. Эти узлы могут взаимодействовать друг с другом, помогая разработчикам поддерживать несколько узлов в одной среде.
В режиме Swarm вы можете изменить конфигурацию службы, включая сети и тома, к которым она подключена, без необходимости перезапускать ее вручную. Docker обновит конфигурацию, избежит выполнения любых сервисных задач с устаревшими конфигурациями и запустит новые, соответствующие желаемой конфигурации.
Итак, разница между режимом Swarm и автономными докер-контейнерами заключается в том, что в режиме Swarm только менеджеры могут управлять контейнерами или роем, в отличие от автономных контейнеров, которые можно запустить на любом демоне. Но демон может участвовать в режиме Swarm в качестве менеджера или рабочего, или и того, и другого.
Архитектура Docker Swarm
Ранее мы использовали такие термины, как менеджер, рабочий, узлы и т. д. Теперь давайте попробуем понять, что это значит и как работает рой докеров.
Узел
Узел — это экземпляр движка Docker, который является частью swarm. Это также можно рассматривать как сервер Docker. Один или несколько узлов могут работать на одном физическом устройстве или облачном сервере. Но в процессе разработки эти узлы swarm кластера могут быть распределены по нескольким машинам в облаке.
Существует два типа узлов: управляющий узел и рабочий узел.
- Менеджер.
- На изображении выше мы видим менеджера роя, который отвечает за управление тем, что делает работник докера. Он отслеживает местонахождение всех своих работников. Docker Manager знает, над каким заданием работает воркер, какая задача ему назначена, как назначения распределяются по всем заданиям и работает ли воркер.
- API Docker Manager используется для создания нового сервиса и его оркестрации. Назначает задачи работникам, используя IP-адреса исполнителей.
- Worker
- Docker Manager имеет полную власть над Docker Worker. Docker Worker принимает и выполняет задачи/инструкции, делегированные ему Docker Manager. Docker Worker — это клиентский агент, который информирует менеджера о состоянии узла, на котором он работает, через REST API по протоколу HTTP.
Services
Задачи, которые должны выполняться на управляющих или рабочих узлах, описываются сервисом (службой). Это основной механизм swarm системы и основная точка взаимодействия пользователей с swarm.
Когда вы создаете сервис, вы также создаете контейнеры и указываете задачи, которые должны выполняться внутри них.
Менеджер swarm распределяет определенное количество задач реплики между узлами модели реплицируемых ресурсов в зависимости от масштаба, который вы установили в желаемом состоянии.
- Балансировка нагрузки - Чтобы предоставить swarm ресурсы, которые вы хотите сделать доступными извне, менеджер роя использует входящую балансировку нагрузки. Менеджер swarm может автоматически добавлять PublishedPort в службу или настраивать его вручную. Если вы не укажете порт, менеджер роя назначит операции порт от 30000 до 32767.
Внешние модули, такие как облачные балансировщики нагрузки, могут получить доступ к сервису через PublishedPort любого узла в кластере. независимо от того, действительно ли этот узел выполняет задачу службы. Входные ссылки направляются к экземпляру запущенной задачи всеми узлами в swarm.
Особенности swarm
После рассмотрения того, что такое рой докеров и связанной с ним терминологии, давайте посмотрим, какие различные функции предлагает режим роя в движке докера.
- Используйте интерфейс командной строки Docker Engine, чтобы создать множество модулей Docker Engine, в которых вы сможете развертывать службы приложений. Для создания роя или управления им не требуется дополнительное программное обеспечение для оркестрации.
- Docker Engine управляет некоторой специализацией во время выполнения, а не управляет различием между ролями узлов во время развертывания. Docker Engine можно использовать для развертывания как менеджерских, так и рабочих узлов. Это означает, что рой можно создать только на образе диска.
- Docker Engine использует декларативный подход к определению оптимального состояния различных ресурсов стека вашего приложения. Например, интерфейсный веб-сервер со службами очередей сообщений и внутренней базой данных можно описать как приложение.
- Вы должны объявить количество задач, которые необходимо выполнить с помощью каждого сервиса. Когда менеджер роя масштабируется вверх или вниз (это означает, что мы увеличиваем или уменьшаем количество сервисов или контейнеров), он автоматически адаптируется для сохранения желаемой среды, добавляя или удаляя задачи.
- Узел диспетчера роя постоянно проверяет состояние кластера и устраняет любые несоответствия между текущим состоянием и целевым состоянием. Например, вы настроили службу, запускающую 10 реплик контейнера на 5 рабочих, и две реплики на одном из рабочих вышли из строя. Затем менеджер создает еще две реплики и назначает их работающему работнику.
- Для ваших служб может быть указано сетевое наложение. Когда приложение инициализируется или изменяется, менеджер роя немедленно назначает адреса контейнерам в оверлейной сети. Порты могут быть показаны внешнему балансировщику нагрузки для утилит. Внутренне вы должны решить, как сервисные контейнеры могут быть распределены между узлами.
Теперь давайте перейдем к практическим вопросам: мы собираемся создать кластер, добавить два рабочих узла, а затем развернуть сервисы в этом swarm.
Предварительные условия:
- Три машины Linux, которые могут обмениваться данными по сети.
- Docker установлен на всех трёх.
В это руководство входят три хоста Linux с поддержкой Docker и сетевыми коммуникациями. Они могут быть физическими, виртуальными, экземплярами Amazon EC2 или размещаться иным образом.
Один будет менеджером, а двое других — рабочими.
Мы собираемся использовать три машины Linux, размещенные на AWS, то есть экземпляры EC2.
При создании экземпляров EC2 добавьте в группу безопасности следующие правила:
Следующие порты должны быть доступны. В некоторых системах эти порты открыты по умолчанию.
- TCP-порт 2377 для связи управления кластером.
- TCP и UDP-порт 7946 для связи между узлами.
- UDP-порт 4789 для наложения сетевого трафика
При создании машины-менеджера добавьте эти правила.
Затем при создании рабочих узлов используйте ту же группу безопасности, что и для компьютера-менеджера.
Затем подключитесь ко всем машинам по ssh и установите docker-engine.
Используйте следующие команды для установки docker-engine на всех трех машинах.
- Обновите и добавьте пакеты индекса установки apt, чтобы apt мог использовать репозиторий HTTPS.
$ sudo apt-get update
$ sudo apt-get install \ apt-transport-https \ ca-certificates \ curl \ gnupg \ lsb-release
- Добавьте официальный ключ GPG Docker:
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
- Используйте следующую команду для настройки стабильного репозитория
$ echo \ "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
- Установить механизм докера
$ sudo apt-get update $ sudo apt-get install docker-ce docker-ce-cli containerd.io
Повторите это для всех трех машин.
Вы сможете создать рой после того, как выполните все шаги настройки. Убедитесь, что на хост-компьютерах запущен демон Docker Engine. Откройте терминал и ssh на компьютере, где должен быть запущен узел менеджера.
Запустите следующую команду, чтобы создать новый рой:
$ docker swarm init --advertise-addr <MANAGER-IP>
У нас есть машина-менеджер с IP 172.31.80.181, поэтому команда:
$ docker swarm init --advertise-addr 172.31.80.181
Флаг --advertise-addr настраивает узел менеджера как 172.31.80.181 для публикации его адреса. Другие узлы роя должны иметь доступ к IP-адресу менеджера.
Выходные данные состоят из команд для присоединения новых узлов к рою. Узлы будут входить в качестве менеджеров или рабочих в зависимости от значения флага.
Чтобы увидеть текущее состояние, вы можете использовать информацию докера:
$ sudo docker info
На этом изображении выше мы видим, что на докер-сервере нет запущенных контейнеров и активен флаг swarm. Это также распечатывает идентификатор кластера, количество менеджеров, узлов и т. д.
Для просмотра информации об узлах используйте команду
$ docker node ls
* рядом с идентификатором означает, что это тот узел, к которому мы в данный момент подключены.
В режиме Swarm Docker Engine автоматически присваивается имя узлу имени хоста компьютера.
Добавление рабочих узлов
Пришло время добавить рабочие узлы в созданный выше кластер swarm.
ssh на машину, на которой вы хотите запустить своего работника.
Теперь мы должны запустить вывод docker swarm init как команду в этом рабочем терминале:
$ docker swarm join --token SWMTKN-1-05ikz9ituzi3uhn1dq1r68bywhfzczg260b9zkhigj9bubomwb-a003dujcz7zu93rlb48wd0o87 172.31.80.181:2377
Вы можете выполнить следующую команду на узле менеджера, чтобы получить команду присоединения работника, если ваша команда недоступна:
$ docker swarm join-token worker
Сделайте то же самое с другим работником. Подключитесь по SSH к другому компьютеру и запустите команду соединения.
Чтобы просмотреть рабочие узлы, откройте терминал и ssh на машине, на которой работает узел менеджера, и выполните команду Docker node ls:
$ docker node ls
Узлы-менеджеры в рое определяются столбцом MANAGER. Worker1 и Worker2 идентифицируются как рабочие узлы по пустому состоянию в этом столбце.
Развертывание сервиса в swarm
Теперь у нас есть кластер с менеджером и двумя воркёрами. Теперь мы можем развернуть сервисы в swarm кластере.
Откройте терминал на узле менеджера после SSH и выполните следующую команду:
$ docker service create --replicas 1 --name helloworld alpine ping docker.com
Давайте разберем приведенную выше команду:
- docker service create: создать службу
- --replicas: этот флаг указывает желаемое состояние одного работающего экземпляра.
- --name: используется для названия службы
- alpine ping docker.com: это указывает на то, что службы будут работать под управлением Alpine Linux, и основной командой, запускаемой внутри экземпляра или службы, является ping docker.com.
Чтобы просмотреть список запущенных служб, выполните следующую команду:
$ docker service ls
В этом изображении указано имя службы, которую мы только что создали, и количество реплик, а также базовый образ, который является alpine.
Заключение
В этой статье мы начали с описания докера, затем обсудили необходимость наличия нескольких хостов докера. Затем мы описали, что такое Docker Swarm, его использование и работу с архитектурой Docker Swarm, а также рассмотрели различные термины Docker Swarm, такие как узел менеджера и рабочий узел. После того, как мы полностью поняли суть роя докеров, мы решили реализовать его или запустить сервисы в роевом кластере. Мы начали с создания трех хостов Linux в AWS в качестве экземпляров EC2 вместе с настройкой группы безопасности (путем добавления правил TCP и UDP).
Мы рассмотрели, как создать или инициализировать кластер Swarm через узел-менеджер, затем добавили в тот же кластер пару рабочих узлов. В заключение мы добавили службу под управлением Linux alpine для запуска команды ping.