Найти тему

Домашняя лаборатория SRE на Incus

Оглавление

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

Список инстансов с кастомными колонками

~# incus list -c nsm4cPtd
-3

Использование инстансов

Доступ к шеллу инстанса с хостовой машины:

~# incus exec ubuntu2404 -- bash

Если в Incus ещё не сконфигурированы ACL, то инстансы, подключённые к одному мосту, видят друг друга и могут обмениваться трафиком без ограничений:

root@ubuntu2404:~# 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

Ссылки

Телеграм