Почему Incus?
- умеет создавать системные контейнеры или виртуальные машины
- умеет работать на одном хосте или в кластере, на железе или виртуальноё машине
- FOSS форк испытанного в продакшене проекта LXD (после того как Canonical вернула контроль над LXD)
- поддерживает восстановление инстанса из снапшота, что полезно при экспериментах
Онлайн-лаборатория
Если нет желания или возможности настраивать Incus у себя - в него можно потыкать и без установки - на сайте Incus.
Установка
На сайте проекта можно найти инструкции по установке под популярные дистрибутивы Linux. По большей части incus есть в официальных репозитариях и установка сводится к
apt install incus qemu-system
или его аналогам
Для MacOS и Windows доступны пакеты с клиентской частью, но не серверной.
На моём винтажном стабильном дистрибутиве Linux Incus устанавливается из бэкпортов:
- Добавляем в sources.list
deb http://deb.debian.org/debian bookworm-backports main
- Устанавливаем пакеты
apt update && apt install incus/bookworm-backports qemu-system
Инициализация и настройка
Управление демоном от не-root пользователя
Серверной частью incus - демоном - можно управлять через локальный Unix-сокет или, после соответствующей настройки, по сети через TLS-сокет.
Подключение в Unix-сокету доступно для root и членов группы incus-admin
Добавление пользователя user в группу incus-admin
выглядит
usermod -aG incus-admin user
Инициализация Incus
Перед использованием демон необходимо инициализировать
- подключить к кластеру Incus при необходимости
- создать сетевой мост, который будет использоваться контейнерами и виртуальными машинами
- создать дефолтный пул, в котором incus будет создавать вольюмы для хранения корня файловых систем контейнеров и ВМ
- разрешить сетевой доступ к API серверной части в дополнение к UNIX-сокету
- сгенерировать YAML файл с результатом конфигурирования, который можно использовать на других хостах
Сконфигурируем Incus в не-кластерном режиме, согласившись с настройками, предлагаемыми по умолчанию:
incus admin init
Would you like to use clustering? (yes/no) [default=no]:
Do you want to configure a new storage pool? (yes/no) [default=yes]:
Name of the new storage pool [default=default]:
Would you like to create a new local network bridge? (yes/no) [default=yes]:
What should the new bridge be called? [default=incusbr0]:
What IPv4 address should be used? (CIDR subnet notation, “auto” or “none”) [default=auto]:
What IPv6 address should be used? (CIDR subnet notation, “auto” or “none”) [default=auto]:
Would you like the server to be available over the network? (yes/no) [default=no]:
Would you like stale cached images to be updated automatically? (yes/no) [default=yes]:
Would you like a YAML "init" preseed to be printed? (yes/no) [default=no]: yes
Полученный YAML потом можно будет использовать для настройки других хостов
cat init.yaml | incus admin init --preseed
Результат
- создан сетевой мост incusbr0
- в рамках сетевого моста запущен dnsmasq, отвечающий за выдачу IP и разрешение имён хостов
- создан дисковый пул default
ls -lha /var/lib/incus/storage-pools/default/
total 40K
drwx--x--x 10 root root 4.0K Jul 24 05:40 .
drwx--x--x 3 root root 4.0K Jul 24 05:40 ..
drwx--x--x 2 root root 4.0K Jul 24 05:40 buckets
drwx--x--x 2 root root 4.0K Jul 24 05:40 containers
drwx--x--x 2 root root 4.0K Jul 24 05:40 containers-snapshots
drwx--x--x 2 root root 4.0K Jul 24 05:40 custom
drwx--x--x 2 root root 4.0K Jul 24 05:40 custom-snapshots
drwx--x--x 2 root root 4.0K Jul 24 05:40 images
drwx--x--x 2 root root 4.0K Jul 24 05:40 virtual-machines
drwx--x--x 2 root root 4.0K Jul 24 05:40 virtual-machines-snapshots
- запущен сервис incus и сконфигурирован его автозапуск при старте системы
Конфликты
Если Incus установлен на одном хосте с Docker и Docker запускается ДО Incus, то в инстансах Incus может не работать сеть. Причина кроется в правилах iptables, создаваемых Docker-ом. Простейшим решением будет не запускать Docker либо запускать Docker ПОСЛЕ Incus. Либо починить то, что работает.
Создание инстансов
Системный контейнер
Системный контейнер использует то же ядро, что и хостовая ОС, но может использовать другой дистрибутив или версию. В этом он больше похож не виртуальную машину. Системный контейнер, в отличие от контейнера приложений, не ограничен одним процессом. Системный контейнер имеет собственный PID 1 и дерево процессов, изолированных от хоста и других контейнеров. Запустим контейнер с Ubuntu 24.04 без ограничений по CPU/RAM
incus launch images:ubuntu/24.04 ubuntu2404
Или с ограничениями
incus launch images:ubuntu/24.04 ubuntu2404- --config limits.cpu=1 --config limits.memory=256MiB
Опции не обязательно задавать через параметры командной строки. Настройки можно брать из YAML-конфига
architecture: x86_64
config:
limits.cpu: "1"
limits.memory: 512MiB
devices:
eth0:
name: eth0
network: incusbr0
type: nic
root:
path: /
pool: incus-default
type: disk
ephemeral: false
profiles:
- default
stateful: false
description: "experimental host 1"
и использовать его при создании инстансов
incus launch images:ubuntu/24.04 host1 < host.yaml
Или даже абстрагировать наборы настроек в профили
incus profile create <profile_name>
incus profile set <profile_name> <option_key>=<option_value>
и выбирать один или более профилей при создании инстанса
incus launch images:ubuntu/24.04 host2 --profile <profile_name>
Виртуальная машина
Под капотом для запуска виртуальных машин используется QEMU/KVM Виртуалки подключаются к тому же сетевому мосту, что и системные контейнеры и могут резолвить их хостнеймы Помимо лимитов на vCPU и RAM для виртуальной машины можно ограничить размер диска
incus launch images:ubuntu/24.04 ubuntu-vm --vm --config limits.cpu=1 --config limits.memory=256MiB --device root,size=5GiB
Launching ubuntu-vm
Просмотр информации об инстансах
Посмотрим список инстансов
incus list
Список инстансов с кастомными колонками
incus list -c nsm4cPtd
Использование инстансов
Доступ к шеллу инстанса с хостовой машины:
incus exec ubuntu2404 -- bash
Если в Incus ещё не сконфигурированы ACL, то инстансы, подключённые к одному мосту, видят друг друга и могут обмениваться трафиком без ограничений:
ping ubuntu2404-limited -c 1
PING ubuntu2404-limited (fd42:d8a4:d2d2:a460:216:3eff:fed0:2338) 56 data bytes
64 bytes from ubuntu2404-limited.incus (fd42:d8a4:d2d2:a460:216:3eff:fed0:2338): icmp_seq=1 ttl=64 time=0.022 ms
Удаление инстансов
Остановка инстансов и всех запущенных в них процессов
incus stop ubuntu2404 ubuntu2404-limited
Удаление остановленных инстансов
incus delete ubuntu2404 ubuntu2404-limited