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