Как создать кластер Docker-контейнеров с помощью Docker Swarm и DigitalOcean в Ubuntu 16.04

Вступление

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

До версии Docker 1.12 для настройки и развертывания кластера хостов Docker требовалось использовать внешнее хранилище ключей и значений, напримерetcd илиConsul, для обнаружения служб. Однако в Docker 1.12 внешняя служба обнаружения больше не требуется, поскольку Docker поставляется с хранилищем значений ключей в памяти, которое работает «из коробки».

В этом руководстве вы узнаете, как развернуть кластер компьютеров Docker с помощью функции Swarm в Docker 1.12 в DigitalOcean. Каждый узел Docker в кластере будет работать под управлением Ubuntu 16.04. Хотя вы можете запустить кластер, состоящий из десятков, сотен или тысяч хостов Docker, кластер, который мы будем настраивать в этом руководстве, будет состоять из узла менеджера и двух рабочих узлов, что в общей сложности составит три члена кластера. , Завершив этот урок, вы сможете с легкостью добавлять больше узлов в ваш кластер.

Предпосылки

Для этого урока вам понадобятся:

  • Локальный компьютер с установленным Docker. На вашем локальном компьютере может работать любой дистрибутив Linux или даже Windows или macOS. Для Windows и macOS установите Docker с помощьюofficial installer. Если на вашем локальном компьютере запущена Ubuntu 16.04, но Docker не установлен, см. Инструкции вHow To Install and Use Docker on Ubuntu 16.04.

  • Токен API DigitalOcean. Если у вас его нет, сгенерируйте его с помощьюthis guide. Когда вы генерируете токен, убедитесь, что он имеет область чтения-записи. Это значение по умолчанию, поэтому, если вы не измените какой-либо параметр при его создании, он будет иметь возможности чтения-записи. Чтобы упростить использование в командной строке, обязательно назначьте токен переменной, как указано в этой статье.

  • На вашем локальном компьютере установлена ​​Docker Machine, которую вы будете использовать для создания трех хостов. В Windows и macOS установка Docker включает Docker Machine. Если вы используете Ubuntu 16.04 локально, см.How To Provision and Manage Remote Docker Hosts with Docker Machine on Ubuntu 16.04 для инструкций по установке.

[[step-1 -—- provisioning-the-cluster-nodes]] == Шаг 1 - инициализация узлов кластера

Нам нужно создать несколько хостов Docker для нашего кластера. Напоминаем, что следующая команда подготавливает один Dockerized хост, где$DOTOKEN - это переменная среды, которая оценивает ваш токен API DigitalOcean:

docker-machine create --driver digitalocean --digitalocean-image ubuntu-16-04-x64 --digitalocean-access-token $DOTOKEN machine-name

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

Мы можем автоматизировать процесс подготовки любого количества хостов Docker с помощью этой команды в сочетании с некоторыми простыми сценариями Bash. Выполните эту команду на своем локальном компьютере, чтобы создать три хоста Docker с именамиnode-1,node-2 иnode-3:

for i in 1 2 3; do docker-machine create --driver digitalocean \
--digitalocean-image  ubuntu-16-04-x64 \
--digitalocean-access-token $DOTOKEN node-$i; done

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

docker-machine ls

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

OutputNAME     ACTIVE   DRIVER         STATE     URL                          SWARM   DOCKER    ERRORS
node-1   -        digitalocean   Running   tcp://111.111.111.111:2376             v1.12.2
node-2   -        digitalocean   Running   tcp://111.111.111.112:2376           v1.12.2
node-3   -        digitalocean   Running   tcp://111.111.222.222:2376         v1.12.2

На этом этапе все три хоста Dockerized были созданы, и у вас есть IP-адрес каждого хоста. Все они также работают под управлением Docker 1.12.x, но еще не являются частью кластера Docker. На следующих шагах мы настроим правила брандмауэра, которые позволят узлам функционировать как члены кластера, выберем один из узлов и сделаем его менеджером Docker Swarm, а остальные настроим как работников Docker Swarm.

[[step-2 -—- configuring-firewall-rules-to-allow-docker-swarm-traffic]] == Шаг 2. Настройка правил брандмауэра для разрешения трафика Docker Swarm

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

Для правильной работы кластера необходимо открыть определенные сетевые порты на узлах, которые будут частью кластера. Это влечет за собой настройку брандмауэра для пропуска трафика через эти порты. Поскольку для выполнения этой задачи можно использовать три разных приложения брандмауэра, команды, которые необходимо выполнить на узлах для каждого приложения брандмауэра, описаны в отдельной статье. Следуйтеthis guide и настройте брандмауэры для каждого хоста. Откройте правильные порты на диспетчере, затем повторите, чтобы открыть порты на двух клиентских узлах.

Выполнив этот шаг, вы можете инициализировать диспетчер кластеров.

[[шаг-3 -—- инициализация-диспетчера-кластера]] == Шаг 3 - Инициализация диспетчера кластера

Мы решили, чтоnode-1 будет нашим менеджером кластера, поэтому войдите на узел со своего локального компьютера:

docker-machine ssh node-1

Командная строка изменится, чтобы отразить тот факт, что вы сейчас вошли в этот конкретный узел. Чтобы настроить узел как менеджер Swarm, введите следующую команду:

docker swarm init --advertise-addr node_ip_address

node_ip_address - это IP-адрес узла. Вы можете получить его из выводаdocker-machine ls или с панели инструментов DigitalOcean.

Вы увидите вывод, который выглядит следующим образом:

OutputSwarm 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.

В выходных данных содержится идентификатор узла, которым в этом примере являетсяa35hhzdzf4g95w0op85tqlow1, и инструкции по добавлению других узлов в кластер.

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

[[step-4 -—- add-nodes-to-the-cluster]] == Шаг 4 - Добавление узлов в кластер

Чтобы выполнить этот шаг, вы можете открыть другой терминал и оставить вкладку терминала или окно, которое вы использовали для входа в систему только в Swarm Manager.

Сначала подключитесь к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

После успешного выполнения команды вы увидите следующий ответ:

OutputThis node joined a swarm as a worker.

Выйдите изnode-2, а затем повторите этот процесс сnode-3, чтобы добавить его в свой кластер.

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

[[step-5 -—- management-the-cluster]] == Шаг 5 - Управление кластером

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

docker node ls

Вывод должен быть похож на это:

OutputID                           HOSTNAME  STATUS  AVAILABILITY  MANAGER STATUS
2qhg0krj00i4d3as2gpb0iqer    node-2    Ready   Active
6yqh4bjki46p5uvxdw6d53gc0    node-3    Ready   Active
a35hhzdzf4g95w0op85tqlow1 *  node-1    Ready   Active        Leader

Этот вывод показывает, что мы имеем дело с 3-х узловым Docker Swarm и его узлами - менеджером и двумя работниками. Чтобы просмотреть другие команды управления, которые вы можете запустить на узле менеджера, введите:

docker node --help

Для получения подробной информации о кластере вы можете использовать следующую команду для менеджера или сотрудников (это общая команда Docker):

docker info

Выходные данные должны быть такого рода и должны указывать на состояние кластера (active илиpending), количество узлов в кластере и то, является ли конкретный узел менеджером или рабочим.

Output...

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.

[.tip] #Tip: Вы можете добавлять или удалять узлы из кластера в любое время. Кроме того, рабочий узел может быть повышен до менеджера, а менеджер может быть преобразован в рабочего.
#

Теперь давайте запустим сервис в кластере.

[[step-6 -—- running-services-in-the-docker-swarm]] == Шаг 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 показывает, сколько экземпляров службы запущено:

OutputID            NAME       REPLICAS  IMAGE  COMMAND
0ymctkanhtc1  webserver  1/1       nginx

Вы можете определить, на каких узлах работают службы, используяdocker service ps, за которым следует имя службы.

docker service ps webserver

Вывод должен быть похож на следующее:

OutputID                         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 покажет, на каких узлах были запущены новые экземпляры:

OutputID                         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 и нового режима Swarm. Вы также видели, как выполнить несколько задач управления в кластере. Но это еще не все. Чтобы просмотреть доступные команды Docker Swarm, выполните следующую команду в вашем Swarm manager.

docker swarm --help

Для получения дополнительной информации о Docker Swarm посетитеofficial documentation page. И не забудьте проверить другиеDocker-related articles на DigitaloOcean.

Related