node_agent | ||
.gitignore | ||
config.toml | ||
Makefile | ||
poetry.lock | ||
pyproject.toml | ||
README.md |
Compute Node Agent
Агент для работы на ворк-нодах. В этом репозитории развивается базовая библиотека для взаимодействия с libvirt и выполнения основных операций.
Как это должно выглядеть
node-agent
должен стать обычным DEB-пакетом. Вместе с самим приложением пойдут вспомагательные утилиты:
na-vmctl
virsh на минималках, который дёргает код из Node Agent. Выполняет базовые операции с VM, установку и миграцию и т.п. Реализована частично.na-vmexec
. Обёртка для вызова QEMU guest agent на машинах, больше нчего уметь не должна. Реализована целиком.na-volctl
. Предполагается здесь оставить всю работу с дисками. Не реализована.
Этими утилитами нет цели заменять virsh, бцдет реализован только специфичный для Node Agent функционал.
Зависимости (версии из APT репозитория Debian 12):
python3-lxml
4.9.2python3-docopt
0.6.2python3-libvirt
9.0.0 (актуальная новее)
docopt
скорее всего будет выброшен в будущем, так как интерфейс CLI сильно усложнится.
Минимальная поддерживаемая версия Python — 3.11
, потому, что можем.
API
Кодовая база растёт, необходимо автоматически генерировать документацию в README её больше небудет.
В структуре проекта сейчас бардак, многое будет переосмыслено и переделано позже. Основная цель на текущем этапе — получить минимально работающий код, с помощью которого возможно выполнить установку виртуальной машины и как-то управлять ею.
Базовые сущности:
LivbirtSession
- обёртка над объектомlibvirt.virConnect
.VirtualMachine
- класс для работы с доменами, через него выполняется большинство действий.VirtualMachineInstaller
- класс для установки ВМ, выполняет кучу проверок, генерирует XML конфиг и т.п.StoragePool
- обёртка дляlibvirt.virStoragePool
.Volume
- объект для управления дисками.VolumeInfo
- датакласс хранящий информацию о диске, может собрать XML.GuestAgent
- понятно что это.ConfigLoader
- загрузчик TOML-конфига, возможно будет выброшен на мороз.
from na import LibvirtSession
from na.vm import VirtualMachineInstaller
session = LibvirtSession('config.toml')
compute = VirtualMachineInstaller(session).install(
name='devuan',
vcpus=4,
vcpu_mode='host-model',
memory=2048,
)
print(compute)
session.close()
TODO
- Установка ВМ
- Конструктор XML (базовый)
- Автоматический выбор модели процессора
- Метод создания дисков
- Дефайн, запуск и автостарт ВМ
- Работа со StoragePool
- Создание блочных устройств
- Подключение/отключение устройств
- Управление дисками
- Удаление ВМ
- Изменение CPU
- Изменение RAM
- Миграция ВМ между нодами
- Работа с qemu-ga
- Управление питанием
- Вкл/выкл автостарт ВМ
- Статистика потребления ресурсов
- Получение инфомрации из/о ВМ
- SSH-ключи
- Сеть
- Создание снапшотов
- Поддержка выделения гарантированной доли CPU
Заметки
Будущее этой библиотеки
Либа
Failover
В перспективе для ВМ с сетевыми дисками возможно организовать Failover решение — ВМ будет автоматически запускаться на другой ноде из пула при отключении оригинальной ноды. Технически это можно реализовать как создание ВМ с аналогичными характеристиками на другой ноде с подключением к тому же самому сетевому диску. Сразу нужно отметить, что для реализации:
- Нужно где-то хранить и регулярно обновлять информацию о конфигурации ВМ для воссоздания ВМ
- Нужно иметь "плавающие адреса", чтобы переключить трафик на новую ноду
- Необходимо выполнять failover по чётким критериям: нода полностью недоступна более X времени, маунт сетевого диска отвалился и т.п.
- Как быть с целостностью данных на сетевом диске? При аварии на ноде, данные могли быть повреждены, тогда failover на тот же диск ничего не даст.
- Сетевой диск должен быть зарезервирован средствами распределённой ФС