# 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.2 - `python3-docopt` 0.6.2 - `python3-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-конфига, возможно будет выброшен на мороз. ```python 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 - [ ] Установка ВМ - [x] Конструктор XML (базовый) - [x] Автоматический выбор модели процессора - [ ] Метод создания дисков - [x] Дефайн, запуск и автостарт ВМ - [ ] Работа со StoragePool - [ ] Создание блочных устройств - [ ] Подключение/отключение устройств - [ ] Управление дисками - [ ] Удаление ВМ - [x] Изменение CPU - [x] Изменение RAM - [ ] Миграция ВМ между нодами - [x] Работа с qemu-ga - [x] Управление питанием - [x] Вкл/выкл автостарт ВМ - [ ] Статистика потребления ресурсов - [ ] Получение инфомрации из/о ВМ - [ ] SSH-ключи - [ ] Сеть - [ ] Создание снапшотов - [ ] Поддержка выделения гарантированной доли CPU # Заметки ## Будущее этой библиотеки Либа ## Failover В перспективе для ВМ с сетевыми дисками возможно организовать Failover решение — ВМ будет автоматически запускаться на другой ноде из пула при отключении оригинальной ноды. Технически это можно реализовать как создание ВМ с аналогичными характеристиками на другой ноде с подключением к тому же самому сетевому диску. Сразу нужно отметить, что для реализации: - Нужно где-то хранить и регулярно обновлять информацию о конфигурации ВМ для воссоздания ВМ - Нужно иметь "плавающие адреса", чтобы переключить трафик на новую ноду - Необходимо выполнять failover по чётким критериям: нода полностью недоступна более X времени, маунт сетевого диска отвалился и т.п. - Как быть с целостностью данных на сетевом диске? При аварии на ноде, данные могли быть повреждены, тогда failover на тот же диск ничего не даст. - Сетевой диск должен быть зарезервирован средствами распределённой ФС