Модуль 13 / 24
Placement constraints и preferences
Содержание
1. Цели и результат модуля
После модуля вы сможете моделировать topology через node labels, применять обязательные constraints и мягкие placement preferences и исправлять Pending tasks.
- создавать namespaced labels
- различать eligibility и ranking
- проверять spread
- читать scheduler rejection
2. Теория: node labels
Node label — operator-controlled metadata в node spec. Он описывает zone, rack, storage или capability и отличается от Engine labels. Имена с префиксом курса уменьшают риск конфликта.
Label не проверяет реальное свойство машины. Оператор отвечает за соответствие metadata инфраструктуре и за удаление устаревших значений.
3. Теория: placement constraints
Constraint — жёсткий фильтр eligible nodes. Поддерживаются равенство и неравенство для node labels, hostname, role, platform и других атрибутов. Все constraints должны выполняться одновременно.
Если подходящих nodes нет, desired task остаётся Pending. Orchestrator продолжает попытки и запускает его, когда label, availability или spec исправлены.
4. Теория: placement preferences
Preference ранжирует eligible nodes, но не запрещает размещение. spread стремится равномерно распределить tasks по значениям label. Сначала применяются constraints, затем preferences.
Отсутствующее значение образует отдельную группу, поэтому неполная маркировка может дать неожиданный spread. Preference не является строгой anti-affinity.
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.
6. Методические указания
- Сначала документируйте смысл label
- Проверяйте labels через node inspect
- Начинайте с constraints, затем добавляйте preference
- Сравнивайте фактическое распределение, не порядок строк
- Pending исследуйте через service ps --no-trunc
- Cleanup удаляет service раньше labels
7. Лабораторная работа: topology labels
Разметьте две zones и два rack. Все labels имеют префикс swarm.m13 и используются только этим модулем.
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}}'8. Лабораторная работа: constraint и spread
Разрешите только zone=a и запросите четыре replicas со spread по rack. Ожидается 2+2 на manager-1/2 и ни одного task на manager-3.
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 --pretty9. Диагностика Pending и исправление
Не существующая zone=c даёт no suitable node. Замените constraint на zone=b; task должен стать Running на manager-3 без пересоздания service.
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 --prettyssh 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. Контроль, критерии освоения и cleanup
- Чем label отличается от реального свойства?
- Constraint или preference определяет eligibility?
- Почему spread не anti-affinity?
- Как неполные labels влияют на группы?
- Почему Pending может исправиться сам?
- Как placement сокращает capacity?
Модуль освоен, если вы прогнозируете eligible nodes, получаете 2+2 spread и устраняете Pending изменением spec.
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