Почему 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

Ссылки

Телеграм

Блог на Дзене