Предположим, кластер Docker из 3 узлов. Один из этих узлов, ресурсы ограничены. Несколько служб, которые могут быть довольно жадными с точки зрения ЦП или ОЗУ, запустились на одном и том же хосте.
Будет ли Docker в какой-то момент проверять, меньше ли работы над остальными узлами, и переносить ли одну или несколько служб с узла, на который оказывается давление, на один из узлов, на которые давление меньше?
Есть ли в Docker какие-либо встроенные функции для решения этой проблемы, или в конечном итоге миграция будет результатом, например, убийца OOM вынимает контейнер?
Swarm не перемещает задачи (контейнеры). Его цель - «не навредить», перемещая контейнеры, о которых вы явно не указывали. Если вы сделаете service update
он воссоздает контейнер, возможно, на других узлах на основе 1. обеспечения распределения задач в этой службе по узлам и 2. плотности контейнера на узел.
Но AFAIK эта оценка не основана на использовании ресурсов каждый момент времени.
Вы жестяная банка использовать --limit-cpu/memory
и --reserve-cpu/memory
варианты на вашем service create/update
команды, которые помогут. reserve
заставит Swarm отслеживать это резервирование, и если вы установите резервирование для нескольких сервисов, он будет следить за тем, чтобы они были запланированы на узлах, у которых есть эти доступные ресурсы, но, опять же, он просто использует таблицу резервирования, а не использование в реальном времени, чтобы определить это (AFAIK ).
Я видел, как люди использовали Prometheus для мониторинга и запуска предупреждений, которые масштабируют службу, поэтому вполне возможно, что эти предупреждения также могут запускать перемещение контейнера.