Навеено статьей в официальной документации
Что такое LXC контейнеры (CT в терминологии PVE)
Это контейнеризация в Linux, которая работает аналогично docker, но при этом, если внутри docker контейнера по-умолчанию крутится 1 процесс, то LXC держит полноценный init (да?) c SSH и прочими ништяками, но при этом ядро ОС одно как для контейнера, так и для хоста
Что такое KVM (VM в терминологии PVE)
Это паравиртуализированная виртуальная машина, которая с точки зрения гостя является полностью независимой от хоста, может быть как linux, так и любой другой ОС и даже иметь другую архитектуру (если мы говори про qemu, естественно, в этом случае уже ни о какой паравиртуализации речи не идет)
Плюсы CT по сравнению с VM
- Меньше оверхед, alpine linux прям очень легкий, сотни контейнеров тянуть проще, нежели сотни виртуалок, при этом ядро одно и переключений контекста меньше
- Быстрее и проще установка, по сути, надо распаковать архив и настроить параметры (в VM частично реализуется через cloud init)
- Консоль из коробки
- Лучше распределение ресурсов, в чистом LXC и LXD вообще может не быть ограничений на оперативку и процессор для контейнера и он может использовать все доступные ресурсы, резервирования нет, с одной стороны это хорошо, т.к. можно больше уместить в одном сервере, с другой стороны можно словить OOM когда не ожидаешь
Плюсы VM
- Выбор гостевых систем практически неограничен
- Практически идеальные изоляция и функционал, т.к. нет общего ядра, оперативки, файлов.
- Совместимость выше, NFS шара работает, какие-то приколюхи работают, например, у меня пока не получилось запустить podman в alpine linux внутри LXC контейнера в PVE, SSSD работает, в LXC freeIpa пользователи у меня не работали т.к ID пользователей слишком большие т.к. они транслируются в ID хоста
- Безопасность выше, особенно с учетом 3 пункта, когда не все работает в непривилегированном контейнера, а перевод его в привилегированный режим рушит изоляцию и безопасность
- Работают живые миграции между нодами когда без перезагрузки виртуалка переtзжает на другую ноду, у меня максимум 1 пинг терялся, в LXC миграция только с перезапуском
- Работает ZFS over ISCSI - это прям крутая штука, когда NAS или SAN выдает блочное устройство, я проверил дома и отзывчивость по сравнению с ZFS over NFS на порядок выше (вот проект)
Что по хостингам
- Сейчас цены выросли, а лет 10 назад многие любили продавать opvenVZ, это аналог LXC, при этом они были дешевле KVM за счет того, что можно было за счет массового обслуживания с оверсейлить ресурсы и заработать больше, например, через на 10 ГБ оперативки делится на 20 “VDSок” по 1-2-4 ГБ оперативки, но без гарантии выделеиня этих ресурсов. Но при этом, OpenVPN не поставить, какие-то сервисы, ктрубующие модули ядра не поставить и т.д. ну и постоянные ООМ
- Сейчас в том числе по причинам безопасности предлагают KVM, но все равно оверсейлят, еще я подозреваю, что для KVM проще подкинуть диск
Как снизить оверхед как в LXC так и в KVM режиме
- Я нашел для себя Alpine linux, (есть и другие варианты, можете накидать в комментах) раньше использовал в качестве базового образа для docker, а теперь перевел почти все LXC контейнера на него и попробовал в VM. Но там есть момент с libc, это может быть критичным.
- Ну понятно, что выкидывать ненужный функционал, с влучае с Alpine выкидывать нечего, надо добавлять только нужный, в случае Ubuntu/debian я находил скрипт, который удаляет лишне и оставляет только docker
- Смотреть в сторону легковесных альтернатив, например busybox заменяет кучу всего, dropbear вместо openssh и т.д. даже crond можно заменить на реализацию в busybox
- Для VM можно влкючать Balloning device, это когда часть оперативки гостевой ОС раздается другим системам, можно выделить, например, от 2 до 4 ГБ оперативки и при старте будет выделяться 4, а потом при помощи этого самого воздушного шара 2 ГБ резервироваться и этот резерв переиспользоваться, при этом, если гостю надо будет больше 2ГБ и эти ресурсы будут свободные на хосте, то это резервирование уменьшается и ПО внутри гостя может использовать эту оперативку
- Для VM использовать virtio и guest-agent, virtio для windows гостей дает прям большой буст производительности
Что я выбирают для себя
- У мня дома более 50 CT и VM на мини ПК, я использую подход Application Containers, но Proxmox это не рекомендуют, они за System Containers и VM
- Если есть неограниченные ресурсы и время на разворачивание, то однозначно VM, но даже если не заморачиваться с автоустановкой и провижинингом, то LXC развернуть пару минут надо, а VM чуть подольше
- Если не создавать под каждое приложение LXC контейнер, а по виртуалке на ноде и там развернуть K8S или его аналоги, то тоже лучше VM
- Очень не люблю расширять хост PVE, видел статьи где docker ставится на PVE и потом все крутиться там, но это дичь полная, удивляюсь, что PVE это позволяет, вот Truenas отключили apt и рады
Выводы
Пользуйте в качестве выводов предыдущий параграф, а если не согласны или хочется дополнить, то прошу высказать свои мысли в комментариях.