Как создать кластер Docker-контейнеров с Docker Swarm и DigitalOcean на CentOS 7

Вступление

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

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

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

Предпосылки

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

  • Локальный компьютер с установленным Docker. На вашем локальном компьютере может работать любой дистрибутив Linux или даже Windows или macOS. Для Windows и macOS установите Docker с помощью official installer. Если на вашем локальном компьютере работает CentOS 7, но Docker не установлен, см. Https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-on-centos-7 [ Как установить и использовать Docker на CentOS 7] для получения инструкций.

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

  • На вашем локальном компьютере установлена ​​Docker Machine, которую вы будете использовать для создания трех хостов. В Windows и macOS установка Docker включает Docker Machine. Если вы используете CentOS 7 локально, см. Https://www.digitalocean.com/community/tutorials/how-to-provision-and-manage-remote-docker-hosts-with-docker-machine-on-centos- 7 [Как подготовить и управлять удаленными хостами Docker с помощью Docker Machine на CentOS 7] для инструкций по установке.

Шаг 1 - Предоставление узлов кластера

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

docker-machine create --driver digitalocean --digitalocean-image centos-7-0-x64 --digitalocean-access-token $

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

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

for i in ; do docker-machine create --driver digitalocean \
--digitalocean-image  centos-7-0-x64 \
--digitalocean-access-token  $i; done

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

docker-machine ls

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

OutputNAME     ACTIVE   DRIVER         STATE     URL                          SWARM   DOCKER    ERRORS
  -        digitalocean   Running   tcp://             v1.12.2
  -        digitalocean   Running   tcp://             v1.12.2
  -        digitalocean   Running   tcp://             v1.12.2

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

Шаг 2. Настройка правил брандмауэра для разрешения трафика Docker Swarm

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

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

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

Шаг 3 - Инициализация менеджера кластеров

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

docker-machine ssh

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

docker swarm init --advertise-addr

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

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

OutputSwarm initialized: current node () is now a manager.

To add a worker to this swarm, run the following command:

   docker swarm join \
   --token SWMTKN-1-57m6beujakwyx0t2j5mglpi9juf8czapp8kf2tj3gudkgjkoda-0eg0x08w7uvyxiacmmx0zv67o \
   111.111.111.111:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

В выходных данных находится идентификатор узла, который в данном примере равен * 2n4y8bwu6s7c1kwdryd945zv1 *, и инструкции по добавлению других узлов в кластер.

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

Шаг 4 - Добавление узлов в кластер

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

Сначала подключитесь к + node-2 + с вашего локального компьютера:

docker-machine ssh

Затем выполните эту команду, где + your_swarm_token + - токен, полученный вами при создании кластера на предыдущем шаге, а + manager_node_ip_address + - IP-адрес менеджера Swarm:

docker swarm join \
--token  \
:2377

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

OutputThis node joined a swarm as a worker.

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

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

Шаг 5 - Управление кластером

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

docker node ls

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

OutputID                           HOSTNAME  STATUS  AVAILABILITY  MANAGER STATUS
4smt8qechkvb8qp02nwo2oe6t *      Ready   Active        Leader
5wzik3knakgj0c24jmtmiy5oq        Ready   Active
7f6ws6oladh94xnmbfdhanokm        Ready   Active

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

docker node --help

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

docker info

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

Output...

Network: null host overlay bridge
Swarm: active
NodeID: 4smt8qechkvb8qp02nwo2oe6t
Is Manager: true
ClusterID: 31i554ti23njgxg28av52hv47
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: 111.111.111.111
Runtimes: runc
Default Runtime: runc
Security Options: seccomp
Kernel Version: 3.10.0-327.22.2.el7.x86_64
Operating System: CentOS Linux 7 (Core)
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  nginx

В этой команде мы сопоставляем порт + 80 + в контейнере Nginx с портом + 80 + в кластере, чтобы мы могли получить доступ к странице по умолчанию Nginx из любого места.

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

docker service ls

Вывод должен принять эту форму. Столбец * REPLICAS * показывает, сколько экземпляров службы запущено:

OutputID            NAME       REPLICAS  IMAGE  COMMAND
ch7xnvy8upho  webserver  1/1       nginx

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

docker service ps

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

OutputID                         NAME         IMAGE         NODE    DESIRED STATE  CURRENT STATE           ERROR
4pfbvs7sh5mugtzckw4czhcfm  webserver.1  nginx         node-1  Running        Running 2 minutes ago

В этом примере служба + webserver + работает на + node-1 +. Поскольку это веб-сервер, работающий на портах по умолчанию, вы можете получить к нему доступ, указав в браузере + http: // +. Попробуйте. Вы увидите страницу по умолчанию Nginx.

С помощью магии ячеистой сети служба, работающая на узле, может быть доступна на любом другом узле кластера. Например, к этой службе Nginx можно также получить доступ, указав вашему браузеру IP-адрес любого узла в кластере, а не только того, на котором он работает. Попробуйте.

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

docker service scale =5

И вывод + docker service ps + покажет, на каких узлах были запущены новые экземпляры:

OutputID                         NAME             IMAGE  NODE    DESIRED STATE  CURRENT STATE               ERROR
4pfbvs7sh5mugtzckw4czhcfm  webserver.1      nginx  node-1  Running        Running 3 minutes 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 document. И обязательно ознакомьтесь с другими Docker- связанной статьями статьями DigitaloOcean.

Related