В большинстве случаев вы будете использовать несколько контейнеров в одной системе для разделения большего целого на более мелкие компоненты.
Имеет смысл ограничить количество ресурсов, которое может использовать каждый компонент.
Но почему?
Очевидно, что число причин столь же неограниченно, как и сценарии, для которых вы можете использовать контейнеры.
Когда ограничения на LXD-контейнеры могут быть полезны
- Предоставление службе и предоставление каждому клиенту экземпляр LXD. Например, это может быть большой сервер, и каждый веб-сайт клиента размещается в отдельном контейнере. Если веб-сайт получает внезапный всплеск трафика, это может замедлить другие контейнеры. С ограничениями замедлится только один контейнер, а остальные будут работать нормально.
- В аналогичном сценарии вы можете легко продать различные тарифные планы. Один клиент может заплатить за сумму X ресурсов, а другой может заплатить за сумму Y. И вы можете легко настроить это с помощью нескольких простых команд.
- Вы можете защитить себя от более простых форм атак типа «отказ в обслуживании». Когда один контейнер подвергается бомбардировке, он достигает пределов использования ресурсов. Другие контейнеры не будут затронуты.
- У вас есть два контейнера, каждый из которых будет использовать 100% доступного процессорного времени. Однако вы хотите, чтобы один закончил работу быстрее, чем другой. Например, необходимо сделать видео для проекта, который вам нужен завтра. Вы можете назначить 90% процессорной мощности первому и 10% второму.
Конечно, у вас могут быть свои причины.
И если вы используете только один контейнер во всей системе, вам это может даже не понадобиться.
Но если вы используете несколько контейнеров, вам почти всегда нужно устанавливать некоторые виды ограничений.
Потому что атака, ошибка или какая-либо другая форма неправильного поведения в одном экземпляре LXD может повлиять на всю систему и замедлить ее.
Чем больше у вас контейнеров, тем больше вероятность такого сценария.
Как установить ограничения ресурсов для контейнеров LXD
Для управления ресурсами, относящимися к дисковым операциям, необходимо установить ZFS.
sudo lxd init
Ограничить использование памяти
В приведенных ниже командах замените «container_name» на фактическое имя вашего контейнера.
Установить ограничение памяти так же просто, как ввести:
lxc config set container_name limits.memory 100MB
Введите «GB» вместо «MB», если вы хотите использовать гигабайты вместо мегабайтов.
Ограничить использование процессора
Если вы хотите ограничить количество ядер ЦП, которые может использовать контейнер, введите:
lxc config set container_name limits.cpu 2
Чтобы «закрепить» определенные ядра процессора, используйте:
lxc config set container_name limits.cpu 0-0
Это заставит контейнер использовать только первый процессор.
Чтобы использовать второй, вы должны набрать 1-1.
Чтобы использовать все ядра ЦП с первого по третье, вы должны набрать 0-3.
Другой тип ограничения – сколько процессорного времени может использовать контейнер.
lxc config set container_name limits.cpu.allowance 10ms/100ms
Это позволило бы контейнеру использовать только десять миллисекунд процессорного времени из каждых 100 миллисекунд, то есть около 10% одного ядра процессора.
Ограничить использование диска
Чтобы ограничить ресурсы, связанные с диском, вы должны сначала добавить устройство корневого диска в свой контейнер.
Он уже существует по умолчанию, унаследованный от профиля LXD по умолчанию.
Но вы не можете изменять его настройки для каждого контейнера, пока не сделаете это.
lxc config device add container_name root disk pool=default path=/
Если вы назвали свой пул по-другому, замените «default» на имя вашего пула хранения.
Если вы забыли его имя, вы можете отобразить его с помощью:
lxc storage list
Чтобы ограничить дисковое пространство,которое экземпляр LXD может использовать:
lxc config device set container_name root size 7GB
К сожалению, ограничения ввода / вывода (скорость чтения / записи и IOPS) в настоящий момент не работают.
Ограничить использование сети
Как и с дисками, сначала необходимо добавить виртуальное сетевое устройство, которое вы можете настроить.
Найдите имя вашего сетевого моста, который соединяет ваши экземпляры LXD с внешним миром.
lxc network list
При необходимости замените «lxdbr0» (если в вашем случае мост назван по-другому).
Если вы не выбрали тип сети как мост (ответ по умолчанию), на этапах настройки «lxd init» вам, возможно, придется адаптировать приведенную ниже команду, чтобы отразить ваш выбор.
Например, вам также может потребоваться заменить «nictype» тем, что вы использовали для своей сети LXD.
lxc config device add container_name eth0 nic name=eth0 nictype=bridged parent=lxdbr0
Наконец, установите ограничения на вход в сеть (скачивание) и / или выход (загрузка).
lxc config device set container_name eth0 limits.ingress 1Mbit
lxc config device set container_name eth0 limits.egress 1Mbit
Заключение
Это относится к наиболее часто используемым свойствам, связанным с ограничениями ресурсов.
Но есть гораздо больше переменных, которые вы можете установить с помощью lxc config device set и lxc config set.
Вы можете прочитать больше об этих настраиваемых свойствах контейнера на странице LXD GitHub.