← К программе курса

Модуль 13 / 24

Placement constraints и preferences

DOCKER SWARM

Содержание
01

1. Цели и результат модуля

После модуля вы сможете моделировать topology через node labels, применять обязательные constraints и мягкие placement preferences и исправлять Pending tasks.

  • создавать namespaced labels
  • различать eligibility и ranking
  • проверять spread
  • читать scheduler rejection
02

2. Теория: node labels

Node label — operator-controlled metadata в node spec. Он описывает zone, rack, storage или capability и отличается от Engine labels. Имена с префиксом курса уменьшают риск конфликта.

Label не проверяет реальное свойство машины. Оператор отвечает за соответствие metadata инфраструктуре и за удаление устаревших значений.

03

3. Теория: placement constraints

Constraint — жёсткий фильтр eligible nodes. Поддерживаются равенство и неравенство для node labels, hostname, role, platform и других атрибутов. Все constraints должны выполняться одновременно.

Если подходящих nodes нет, desired task остаётся Pending. Orchestrator продолжает попытки и запускает его, когда label, availability или spec исправлены.

04

4. Теория: placement preferences

Preference ранжирует eligible nodes, но не запрещает размещение. spread стремится равномерно распределить tasks по значениям label. Сначала применяются constraints, затем preferences.

Отсутствующее значение образует отдельную группу, поэтому неполная маркировка может дать неожиданный spread. Preference не является строгой anti-affinity.

05

5. Placement и отказоустойчивость

Constraint уменьшает доступную ёмкость и failure domains. В проверке zone=a исключил manager-3, а четыре tasks распределились 2+2 между rack r1/r2.

Labels не резервируют CPU/RAM и не гарантируют уникальный node. Capacity и max replicas per node проектируют вместе с placement.

06

6. Методические указания

  • Сначала документируйте смысл label
  • Проверяйте labels через node inspect
  • Начинайте с constraints, затем добавляйте preference
  • Сравнивайте фактическое распределение, не порядок строк
  • Pending исследуйте через service ps --no-trunc
  • Cleanup удаляет service раньше labels
07

7. Лабораторная работа: topology labels

Разметьте две zones и два rack. Все labels имеют префикс swarm.m13 и используются только этим модулем.

terminal
ssh swarm-manager-3 docker node update --label-add swarm.m13.zone=a --label-add swarm.m13.rack=r1 swarm-manager-1
ssh swarm-manager-3 docker node update --label-add swarm.m13.zone=a --label-add swarm.m13.rack=r2 swarm-manager-2
ssh swarm-manager-3 docker node update --label-add swarm.m13.zone=b --label-add swarm.m13.rack=r1 swarm-manager-3
ssh swarm-manager-3 docker node inspect swarm-manager-1 swarm-manager-2 swarm-manager-3 --format '{{.Description.Hostname}} {{json .Spec.Labels}}'
08

8. Лабораторная работа: constraint и spread

Разрешите только zone=a и запросите четыре replicas со spread по rack. Ожидается 2+2 на manager-1/2 и ни одного task на manager-3.

terminal
ssh swarm-manager-3 docker service create --detach=true --name swarm-m13-placed --replicas 4 --constraint node.labels.swarm.m13.zone==a --placement-pref spread=node.labels.swarm.m13.rack alpine:3.22 sleep 3600
ssh swarm-manager-3 docker service ps swarm-m13-placed
ssh swarm-manager-3 docker service inspect swarm-m13-placed --pretty
09

9. Диагностика Pending и исправление

Не существующая zone=c даёт no suitable node. Замените constraint на zone=b; task должен стать Running на manager-3 без пересоздания service.

terminal
ssh swarm-manager-3 docker service create --detach=true --name swarm-m13-pending --replicas 1 --constraint node.labels.swarm.m13.zone==c alpine:3.22 sleep 3600
ssh swarm-manager-3 docker service ps swarm-m13-pending --no-trunc
ssh swarm-manager-3 docker service inspect swarm-m13-pending --pretty
terminal
ssh swarm-manager-3 docker service update --detach=false --constraint-rm node.labels.swarm.m13.zone==c --constraint-add node.labels.swarm.m13.zone==b swarm-m13-pending
ssh swarm-manager-3 docker service ps swarm-m13-pending
  • constraints not satisfied — labels/spec
  • insufficient resources — reservations
  • node unavailable — availability/status
  • platform mismatch — image/platform
10

10. Контроль, критерии освоения и cleanup

  • Чем label отличается от реального свойства?
  • Constraint или preference определяет eligibility?
  • Почему spread не anti-affinity?
  • Как неполные labels влияют на группы?
  • Почему Pending может исправиться сам?
  • Как placement сокращает capacity?

Модуль освоен, если вы прогнозируете eligible nodes, получаете 2+2 spread и устраняете Pending изменением spec.

terminal
ssh swarm-manager-3 docker service rm swarm-m13-placed swarm-m13-pending
ssh swarm-manager-3 docker node update --label-rm swarm.m13.zone --label-rm swarm.m13.rack swarm-manager-1
ssh swarm-manager-3 docker node update --label-rm swarm.m13.zone --label-rm swarm.m13.rack swarm-manager-2
ssh swarm-manager-3 docker node update --label-rm swarm.m13.zone --label-rm swarm.m13.rack swarm-manager-3
ssh swarm-manager-3 docker service ls