Вы можете определить резервирование ресурсов для контейнеров, которые вы запускаете, и docker позволит избежать планирования контейнеров - это узлы, у которых нет ресурсов в соответствии с этими памятью и резервированием ЦП. Обратите внимание, что это должно быть сделано для всех запланированных контейнеров, и вам нужно будет профилировать свои приложения, чтобы определить соответствующее резервирование и предельную сумму. Имейте в виду, что во время большой нагрузки эти числа будут увеличиваться, и в ответ на превышение лимита памяти нужно уничтожить контейнер и перезапустить другой экземпляр, что было бы плохо во время пиковой нагрузки, поэтому сделайте свои ограничения достаточно большими.
Вот пример из документации Docker :
version: "3.7"
services:
redis:
image: redis:alpine
deploy:
resources:
limits:
cpus: '0.50'
memory: 50M
reservations:
cpus: '0.25'
memory: 20M
См. Также документацию по ограничениям ресурсов Docker: https://docs.docker.com/config/containers/resource_constraints/
Второй, менее идеальный вариант - определить метки узлов, которые разделяют узлы на группы равного размера, где размер основан на ресурсах. Затем вы можете злоупотреблять функциональностью, которая позволяет распределять рабочую нагрузку по зонам высокой доступности, чтобы разделить рабочую нагрузку между компьютерами на основе их ресурсов. Для этого вы должны использовать политику распространения настроек размещения, чтобы распределить рабочую нагрузку между различными значениями метки:
version: "3.7"
services:
db:
image: postgres
deploy:
placement:
preferences:
- spread: node.labels.zone