Создание кластера контейнеров Docker с помощью Docker Swarm в Ubuntu 16.04
Ubuntu | Комментировать запись
Docker Swarm – это средство для развертывания кластера хостов Docker. Вы можете использовать его для быстрого развертывания кластера хостов на вашем локальном компьютере, либо на поддерживаемых облачных платформах.
До Docker 1.12 для настройки и развертывания кластера Docker и для обнаружения сервисов необходимо было использовать внешнее хранилище типа «ключ-значение», например, etcd или Consul. Однако благодаря Docker 1.12 внешние средства обнаружения больше не нужны, поскольку Docker из коробки поставляется с хранилищем «ключ-значение».
Данный мануал поможет развернуть кластер машин Docker с помощью Swarm. Каждая нода Docker в кластере будет использовать Ubuntu 16.04. Конечно, вы можете запустить кластер из десятков, сотен или тысяч хостов Docker, но в данном мануале для демонстрации достаточно создать кластер из одной главной и двух рабочих нод. По завершении этого мануала вы сможете с легкостью добавлять в кластер новые ноды.
Требования
- Локальная машина с предустановленной платформой Docker. Локальная машина может использовать один из дистрибутивов Linux или же Windows или macOS. Установить Docker на Windows или macOS вам поможет официальный инсталлятор. Если на локальной машине используется Ubuntu 16.04, установить Docker вам поможет мануал Установка и использование Docker в Ubuntu 16.04.
- API-токен хостинга (read-write).
- Docker Machine на локальном компьютере. Для Windows и macOS официальный инсталлятор по умолчанию устанавливает Docker Machine вместе с Docker. Чтобы установить Docker Machine на локальную машину Ubuntu 16.04, читайте мануал Управление удалёнными хостами Docker с помощью Docker Machine в Ubuntu 16.04.
1: Оркестровка нод
Создайте несколько нод Docker для кластера. Чтобы следовать примерам в мануале, вам понадобится 3 ноды.
Когда машины будут созданы, убедитесь, что все прошло успешно:
docker-machine ls
Команда вернет список доступных нод:
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
node-1 - my-provider Running tcp://111.111.111.111:2376 v1.12.2
node-2 - my-provider Running tcp://111.111.111.112:2376 v1.12.2
node-3 - my-provider Running tcp://111.111.222.222:2376 v1.12.2
На каждой ноде должен быть Docker 1.12.x. пока что ноды еще не собраны в кластер. Далее нужно настроить правила брандмауэра, которые заставят ноды функционировать как единый кластер, выбрать одну из нод и сделать ее менеджером Docker Swarm и настроить остальные ноды как рабочие.
2: Настройка брандмауэра
Кластер должен иметь хотя бы одну ноду, которая работает в качестве менеджера.
Примечание: Для среды производства рекомендуется три менеджера.
Для этой настройки выделите первую ноду и сделайте ее менеджером Swarm. Другие две ноды станут рабочими.
На нодах, которые будут частью кластера, нужно открыть определенные сетевые порты. Для этого нужно изменить настройки брандмауэра. Поскольку для выполнения этой задачи можно использовать три разных приложения брандмауэра, все необходимые команды описаны в отдельной статье, Настройка брандмауэра Linux для Docker Swarm в Ubuntu 16.04. Повторите этот мануал и на двух рабочих нодах.
3: Инициализация менеджера кластера
Предположим, node-1 будет менеджером кластера; войдите на ноду с локального компьютера:
docker-machine ssh node-1
Командная строка изменится и вы увидите, что подключились к нужной ноде. Чтобы сделать ноду менеджером Swarm, введите:
docker swarm init --advertise-addr node_ip_address
Примечание: Вместо node_ip_address укажите IP-адрес вашей ноды.
Вы увидите такой вывод:
Swarm initialized: current node (a35hhzdzf4g95w0op85tqlow1) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join \
--token SWMTKN-1-3k7ighcfs9352hmdfzh31t297fd8tdskg6x6oi8kpzzszznffx-6kovxm3akca2qe3uaxtu07fj3 \
111.111.111.111:2377
To add a manager to this swarm, run ‘docker swarm join-token manager’ and follow the instructions.
В выводе вы найдете ID ноды (a35hhzdzf4g95w0op85tqlow1 в этом примере) и инструкции, как добавить другие ноды в кластер.
Итак, теперь у вас есть менеджер Docker Swarm. Настройте остальные ноды.
4: Добавление нод в кластер
На этом этапе можно открыть другой терминал и оставить вкладку или окно терминала, с помощью которого вы раньше подключились к менеджеру Swarm.
Сначала подключитесь к node-2 с локальной машины:
docker-machine ssh node-2
Затем выполните эту команду, где your_swarm_token – это токен, который вы получили при создании кластера, а manager_node_ip_address – это IP-адрес менеджера Swarm.
docker swarm join \
--token your_swarm_token \
manager_node_ip_address:2377
Если команда выполнена успешно, вы увидите:
This node joined a swarm as a worker.
Выйдите с node-2 и повторите этот раздел на ноде node-3.
Итак, вы добавили в кластер две рабочие ноды. Если брандмауэр настроен правильно, теперь у вас есть функционирующий кластер Docker Swarm, где все ноды синхронизированы.
5: Управление кластером
После того, как менеджер и рабочие ноды были добавлены в кластер, все команды управления Docker Swarm нужно выполнять на ноде-менеджере. Поэтому вернитесь к терминалу, который вы использовали для добавления менеджера, и введите эту команду, чтобы просмотреть список членов кластера:
docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
2qhg0krj00i4d3as2gpb0iqer node-2 Ready Active
6yqh4bjki46p5uvxdw6d53gc0 node-3 Ready Active
a35hhzdzf4g95w0op85tqlow1 * node-1 Ready Active Leader
Согласно выводу, в кластере Docker Swarm есть 3 ноды – один менеджер и две рабочие ноды. Чтобы просмотреть список доступных команд для управления кластером, введите:
docker node --help
Для получения подробной информации о кластере вы можете использовать следующую команду (это общая команда Docker, ее можно запускать на менеджере или на рабочих нодах):
docker info
Команда сообщает статус кластера (active или pending), количество нод в кластере и роль ноды, с которой она запущена (менеджер или рабочая нода).
...
Network: bridge host null overlay
Swarm: active
NodeID: a35hhzdzf4g95w0op85tqlow1
Is Manager: true
ClusterID: f45u0lh7ag4qsl4o56yfbls31
Managers: 1
Nodes: 3
Orchestration:
Task History Retention Limit: 5
Raft:
Snapshot Interval: 10000
Heartbeat Tick: 1
Election Tick: 3
Dispatcher:
Heartbeat Period: 5 seconds
CA Configuration:
Expiry Duration: 3 months
Node Address: 104.236.239.4
Runtimes: runc
Default Runtime: runc
Security Options: apparmor seccomp
Kernel Version: 4.4.0-38-generic
Operating System: Ubuntu 16.04.1 LTS
OSType: linux
...
Если вы запустите эту команду на рабочих нодах, строка Is Manager будет показывать false.
Примечание: Вы можете добавлять или удалять ноды из кластера в любое время. Кроме того, вы можете менять роли нод: сделать рабочую ноду менеджером и наоборот.
6: Запуск сервиса в кластере Docker Swarm
Теперь, когда у вас есть запущенный кластер Docker Swarm и запущен, попробуйте запустить тестовый контейнер и посмотрите, как менеджер справится с этой задачей. На машинах Docker Engine 1.12+ контейнеры развертываются как сервисы с помощью команды docker service. Подобно команде docker node, команда docker service может выполняться только на ноде-менеджере.
Итак, для примера разверните сервис веб-сервера, используя официальный образ контейнера Nginx:
docker service create -p 80:80 --name webserver nginx
Эта команда соединяет порт 80 в контейнере Nginx с портом 80 кластера, благодаря чему вы можете получить доступ к приветственной странице Nginx из любой точки.
Чтобы убедиться, что сервисы работают, введите:
docker service ls
Команда должна вернуть такой вывод. Столбец REPLICAS показывает, сколько экземпляров сервиса запущено:
ID NAME REPLICAS IMAGE COMMAND
0ymctkanhtc1 webserver 1/1 nginx
Вы можете определить, на каких нодах работает сервис, используя команду docker service ps и указав имя сервиса.
docker service ps webserver
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR
39yprxsaaekuif951cl0o4wau webserver.1 nginx node-1 Running Running 7 hours ago
В этом примере сервис webserver работает на node-1. Поскольку веб-сервер запущен на портах по умолчанию, вы можете получить к нему доступ в браузере по ссылке http://node-1_ip_address. Вы увидите страницу Nginx по умолчанию.
Благодаря ячеистой топологии доступ к сервису, запущенному на одной ноде, можно получить на любой другой ноды кластера. Например, доступ к сервису Nginx можно также получить, указав в браузере IP-адрес любой другой ноды.
Еще одна особенность Docker Swarm – это возможность масштабирования сервиса, то есть разворачивания его дополнительных экземпляров. Предположим, что вам нужно масштабировать сервис webserver до пяти экземпляров. Для этого просто введите следующую команду, и система создаст еще четыре экземпляра:
docker service scale webserver=5
Введите команду docker service ps, и вы увидите, на каких нодах запущены новые экземпляры сервиса:
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR
39yprxsaaekuif951cl0o4wau webserver.1 nginx node-1 Running Running 8 hours ago
1er2rbrnj6ltanoe47mb653wf webserver.2 nginx node-3 Running Running 14 seconds ago
evassgyvruh256ebv5pj3bqcz webserver.3 nginx node-3 Running Running 14 seconds ago
d453agrdpgng47klbl6yfjnka webserver.4 nginx node-1 Running Running 18 seconds ago
2hsdevx178rg15gqxhzrsnmg6 webserver.5 nginx node-2 Running Running 14 seconds ago
Вывод показывает, что два из четырех новых экземпляров были запущены на node-3, один был запущен на node-1, а другой – на node-2.
Наконец, если сервис отказывает, он автоматически перезапускается на той же ноде (или на другой ноде, если исходная нода больше не доступна).
Заключение
Теперь вы знаете, что настраивать Docker Swarm с помощью Docker Engine 1.12 очень легко. Вы научились создавать кластер и управлять им. Но пока что это только базовый уровень. Чтобы просмотреть все доступные команды Docker Swarm, выполните следующую команду на менеджере Swarm.
docker swarm --help
Для получения дополнительной информации о Docker Swarm посетите страницу официальной документации. Другие наши мануалы по Docker можно найти здесь.
Tags: Docker, Docker Machine, Docker Swarm, Ubuntu 16.04