Создание службы с ограничениями и предпочтениями размещения
На этом этапе вы научитесь использовать ограничения и предпочтения размещения для управления тем, где будут развернуты задачи вашей службы в рамках Docker Swarm. Ограничения размещения - это жесткие требования, которые узел должен удовлетворять, чтобы на нем можно было запланировать задачу. Предпочтения размещения - это мягкие требования, которые влияют на планирование, но не препятствуют запланированию задачи, если ни один узел не удовлетворяет предпочтению.
Сначала проверим текущий узел, чтобы увидеть его метки (labels). Метки - это пары ключ-значение, которые вы можете прикрепить к узлам для предоставления метаданных.
docker node inspect self --format '{{ .Spec.Labels }}'
Эта команда проверяет текущий узел (идентифицируемый как self
) и форматирует вывод для отображения его меток. По умолчанию может не быть каких-либо пользовательских меток.
Добавим метку к текущему узлу. Мы добавим метку node_type=app
.
docker node update --label-add node_type=app self
Эта команда обновляет текущий узел и добавляет метку node_type=app
.
Теперь проверим, что метка была добавлена.
docker node inspect self --format '{{ .Spec.Labels }}'
В выводе вы должны увидеть map[node_type:app]
, что указывает на то, что метка была успешно добавлена.
Теперь создадим реплицируемую службу с именем my-constrained-service
с ограничением размещения, которое требует, чтобы узел имел метку node_type=app
. Мы будем использовать образ nginx
.
docker service create \
--name my-constrained-service \
--replicas 1 \
--constraint 'node.labels.node_type == app' \
nginx:latest
Эта команда создает службу с ограничением. --constraint 'node.labels.node_type == app'
указывает, что задачи для этой службы могут быть запланированы только на узлах, где метка node_type
равна app
. Поскольку мы добавили эту метку к текущему узлу, задача должна быть запланирована здесь.
Проверьте статус службы и задачи:
docker service ls
docker service ps my-constrained-service
Вы должны увидеть службу my-constrained-service
в списке и ее задачу, запущенную на текущем узле.
Теперь создадим другую службу с предпочтением размещения. Предпочтения размещения используются для направления планировщика, но не строго применяются. Мы будем использовать образ busybox
и предпочтать узлы с меткой node_type=database
. Поскольку наш текущий узел не имеет этой метки, задача все равно будет запланирована на текущем узле, но если бы были другие узлы с этой меткой, планировщик бы предпочел их.
Сначала загрузите образ busybox
.
docker pull busybox:latest
Теперь создайте службу с предпочтением размещения.
docker service create \
--name my-preferred-service \
--replicas 1 \
--placement-pref 'spread=node.labels.node_type' \
busybox:latest sleep infinity
Опция --placement-pref 'spread=node.labels.node_type'
сообщает планировщику распределять задачи между узлами на основе значения метки node_type
. В мультиузельном кластере с разными метками node_type
это позволило бы более равномерно распределить задачи. В этом одноузельном окружении задача просто будет запланирована на доступном узле.
Проверьте статус службы и задачи:
docker service ls
docker service ps my-preferred-service
Вы должны увидеть службу my-preferred-service
в списке и ее задачу, запущенную на текущем узле.