SwarmKit — это набор инструментов для управления распределёнными системами любого масштаба. Он включает в себя примитивы для обнаружения узлов, консенсуса на основе Raft, планирования задач и многого другого.
Основные преимущества:
Машины, на которых работает SwarmKit, можно объединить в Swarm, координирующий задачи друг с другом. После присоединения машина становится узлом Swarm. Узлы могут быть рабочими или управляющими.
Некоторые из основных функций SwarmKit:
Планирование
Осведомлённость о ресурсах: SwarmKit знает о доступных ресурсах на узлах и будет размещать задачи соответствующим образом.
Ограничения: Операторы могут ограничить набор узлов, где может быть запланирована задача, определяя выражения ограничений. Несколько ограничений находят узлы, которые удовлетворяют каждому выражению, то есть соответствуют условию «И». Ограничения могут соответствовать атрибутам узла в следующей таблице. Обратите внимание, что engine.labels
собираются из Docker Engine с информацией, такой как операционная система, драйверы и т. д. node.labels
добавляются администраторами кластера для операционных целей. Например, некоторые узлы имеют метки соответствия требованиям безопасности для выполнения задач с соответствующими требованиями.
| Атрибут узла | Совпадения | Пример |
|:------------- |:-------------| :-------------|
| node.id | Идентификатор узла | node.id == 2ivku8v2gvtg4
|
| node.hostname | Имя хоста узла | node.hostname != node-2
|
| node.ip | IP-адрес узла | node.ip != 172.19.17.0/24
|
| node.role | Роль менеджера или рабочего узла | node.role == manager
|
| node.platform.os | Операционная система узла | node.platform.os == linux
|
| node.platform.arch | Архитектура узла | node.platform.arch == x86_64
|
| node.labels | Метки узла, добавленные администраторами кластера | node.labels.security == high
|
| engine.labels | Метки Docker Engine | engine.labels.operatingsystem == ubuntu 14.04
|
Стратегии: В настоящее время проект поставляется со стратегией распространения, которая будет пытаться планировать задачи на наименее загруженных узлах при условии соблюдения ограничений и требований к ресурсам.
Управление кластером
Безопасность
Требования:
make generate
)SwarmKit собирается на Go и использует стандартную структуру проекта для хорошей работы с инструментами Go. Если вы новичок в Go, пожалуйста, обратитесь к BUILDING.md для более подробного руководства.
После того как вы проверили SwarmKit в своём $GOPATH
, можно использовать Makefile
для общих задач.
Из корневого каталога проекта выполните следующие действия для сборки swarmd
и swarmctl
:
$ make binaries
Перед запуском тестов в первый раз настройте инструменты:
$ make setup
Затем запустите:
$ make all
Эти инструкции предполагают, что swarmd
и swarmctl
находятся в вашем PATH.
(Прежде чем начать, убедитесь, что /tmp/node-N
не существует)
Инициализируйте первый узел:
$ swarmd -d /tmp/node-1 --listen-control-api /tmp/node-1/swarm.sock --hostname node-1 Перед присоединением к кластеру необходимо получить токен:
$ export SWARM_SOCKET=/tmp/node-1/swarm.sock
$ swarmctl cluster inspect default
ID : 87d2ecpg12dfonxp3g562fru1
Name : default
Orchestration settings:
Task history entries: 5
Dispatcher settings:
Dispatcher heartbeat period: 5s
Certificate Authority settings:
Certificate Validity Duration: 2160h0m0s
Join Tokens:
Worker: SWMTKN-1-3vi7ajem0jed8guusgvyl98nfg18ibg4pclify6wzac6ucrhg3-0117z3s2ytr6egmmnlr6gd37n
Manager: SWMTKN-1-3vi7ajem0jed8guusgvyl98nfg18ibg4pclify6wzac6ucrhg3-d1ohk84br3ph0njyexw0wdagx
В двух дополнительных терминалах присоедините два узла. В примере ниже замените `127.0.0.1:4242` на адрес первого узла и используйте `<Worker Token>`, полученный выше. Если присоединяемые узлы работают на том же хосте, что и `node-1`, выберите другой удалённый порт прослушивания, например, `--listen-remote-api 127.0.0.1:4343`.
```sh
$ swarmd -d /tmp/node-2 --hostname node-2 --join-addr 127.0.0.1:4242 --join-token <Worker Token>
$ swarmd -d /tmp/node-3 --hostname node-3 --join-addr 127.0.0.1:4242 --join-token <Worker Token>
При присоединении в качестве менеджера также укажите listen-control-api.
$ swarmd -d /tmp/node-4 --hostname node-4 --join-addr 127.0.0.1:4242 --join-token <Manager Token> --listen-control-api /tmp/node-4/swarm.sock --listen-remote-api 127.0.0.1:4245
В четвёртом терминале используйте swarmctl
для изучения и управления кластером. Перед запуском swarmctl
, установите переменную среды SWARM_SOCKET
в путь к сокету менеджера, который был указан в --listen-control-api
при запуске менеджера.
Чтобы вывести список узлов:
$ export SWARM_SOCKET=/tmp/node-1/swarm.sock
$ swarmctl node ls
ID Name Membership Status Availability Manager Status
-- ---- ---------- ------ ------------ --------------
3x12fpoi36eujbdkgdnbvbi6r node-2 ACCEPTED READY ACTIVE
4spl3tyipofoa2iwqgabsdcve node-1 ACCEPTED READY ACTIVE REACHABLE *
dknwk1uqxhnyyujq66ho0h54t node-3 ACCEPTED READY ACTIVE
zw3rwfawdasdewfq66ho34eaw node-4 ACCEPTED READY ACTIVE REACHABLE
Запустите сервис redis:
$ swarmctl service create --name redis --image redis:3.0.5
08ecg7vc7cbf9k57qs722n2le
Выведите список запущенных сервисов:
$ swarmctl service ls
ID Name Image Replicas
-- ---- ----- --------
08ecg7vc7cbf9k57qs722n2le redis redis:3.0.5 1/1
Изучите сервис:
$ swarmctl service inspect redis
ID : 08ecg7vc7cbf9k57qs722n2le
Name : redis
Replicas : 1/1
Template
Container
Image : redis:3.0.5
Task ID Service Slot Image Desired State Last State Node
------- ------- ---- ----- ------------- ---------- ----
0xk1ir8wr85lbs8sqg0ug03vr redis 1 redis:3.0.5 RUNNING RUNNING 1 minutes ago node-1
Можно обновить любой атрибут сервиса.
Например, можно масштабировать сервис, изменив количество экземпляров:
$ swarmctl service update redis --replicas 6
08ecg7vc7cbf9k57qs722n2le
$ swarmctl service inspect redis
ID : 08ecg7vc7cbf9k57qs722n2le
Name : redis
Replicas : 6/6
Template
Container
Image : redis:3.0.5
Task ID Service Slot Image Desired State Last State Node
------- ------- ---- ----- ------------- ---------- ----
0xk1ir8wr85lbs8sqg0ug03vr redis 1 redis:3.0.5 RUNNING RUNNING 3 minutes ago node-1
25m48y9fevrnh77til1d09vqq redis 2 redis:3.0.5 RUNNING RUNNING 28 seconds ago node-3
42vwc8z93c884anjgpkiatnx6 redis
``` **Перевод текста на русский язык:**
3 redis:3.0.5 RUNNING RUNNING 28 секунд назад node-2 d41f3wnf9dex3mk6jfqp4tdjw redis 4 redis:3.0.5 RUNNING RUNNING 28 секунд назад node-2 66lefnooz63met6yfrsk6myvg redis 5 redis:3.0.5 RUNNING RUNNING 28 секунд назад node-1 3a2sawtoyk19wqhmtuiq7z9pt redis 6 redis:3.0.5 RUNNING RUNNING 28 секунд назад node-3
Изменение *replicas* с *1* на *6* вынудило *SwarmKit* создать *5* дополнительных задач, чтобы соответствовать желаемому состоянию.
Можно изменить и другие поля, такие как image, args, env и т. д.
Давайте изменим образ с *redis:3.0.5* на *redis:3.0.6* (например, обновим):
$ swarmctl service update redis --image redis:3.0.6 08ecg7vc7cbf9k57qs722n2le
$ swarmctl service inspect redis ID : 08ecg7vc7cbf9k57qs722n2le Name : redis Replicas : 6/6 Update Status State : COMPLETED Started : 3 минуты назад Completed : 1 минута назад Message : обновление завершено Template Container Image : redis:3.0.6
Task ID Service Slot Image Desired State Last State Node
0udsjss61lmwz52pke5hd107g redis 1 redis:3.0.6 RUNNING RUNNING 1 минуту назад node-3 b8o394v840thk10tamfqlwztb redis 2 redis:3.0.6 RUNNING RUNNING 1 минуту назад node-1 efw7j66xqpoj3cn3zjkdrwff7 redis 3 redis:3.0.6 RUNING RUNNING 1 минуту назад node-3 8ajeipzvxucs3776e4z8gemey redis 4 redis:3.0.6 RUNNING RUNNING 1 минуту назад node-2 f05f2lbqzk9fh4kstwpulygvu redis 5 redis:3.0.6 RUNNING RUNNING 1 минуту назад node-2 7sbpoy82deq7hu3q9cnucfin6 redis 6 redis:3.0.6 RUNNING RUNNING 1 минуту назад node-1
По умолчанию все задачи обновляются одновременно.
Это поведение можно изменить, задав параметры обновления.
Например, чтобы обновлять задачи по две за раз и ждать не менее 10 секунд между обновлениями:
$ swarmctl service update redis --image redis:3.0.7 --update-parallelism 2 --update-delay 10s $ watch -n1 "swarmctl service inspect redis" # наблюдать за обновлением
Это обновит 2 задачи, дождётся, пока они станут *RUNNING*, затем подождёт дополнительные 10 секунд, прежде чем перейти к другим задачам.
Параметры обновления можно задать при создании службы и обновить позже. Если команда обновления не указывает параметры обновления, будет использоваться последний набор параметров.
### Управление узлами
*SwarmKit* отслеживает работоспособность узлов. В случае сбоя узла он перераспределяет задачи на другие узлы.
Оператор может вручную определить *Доступность* узла и *Приостановить* и *Осушить* узлы.
Переведём узел `node-1` в режим обслуживания:
$ swarmctl node drain node-1
$ swarmctl node ls ID Name Membership Status Availability Manager Status
3x12fpoi36eujbdkgdnbvbi6r node-2 ACCEPTED READY ACTIVE 4spl3tyipofoa2iwqgabsdcve node-1 ACCEPTED READY DRAIN REACHABLE * dknwk1uqxhnyyujq66ho0h54t node-3 ACCEPTED READY ACTIVE
$ swarmctl service inspect redis ID : 08ecg7vc7cbf9k57qs722n2le Name : redis Replicas : 6/6 Update Status State : COMPLETED Started : 2 минуты назад Completed : 1 минута назад Message : обновление завершено Template Container Image : redis:3.0.7
Task ID Service Slot Image Desired State Last State Node
8uy2fy8dqbwmlvw5iya802tj0 redis 1 redis:3.0.7 RUNNING RUNNING 23 секунды назад node-2 Как вы можете видеть, каждая задача, работающая на узле node-1, была перебалансирована циклом согласования на узлы node-2 или node-3.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )