88 lines
6.2 KiB
Markdown
88 lines
6.2 KiB
Markdown
# 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` - датакласс хранящий информацию о диске, с помощью метода `to_xml()` получаем XML описание.
|
||
- `GuestAgent` - понятно что это.
|
||
- `ConfigLoader` - загрузчик TOML-конфига.
|
||
|
||
# TODO
|
||
|
||
- [x] Установка ВМ (всратый вариант)
|
||
- [x] Конструктор XML (базовый)
|
||
- [x] Автоматический выбор модели процессора
|
||
- [x] Метод создания дисков
|
||
- [x] Дефайн, запуск и автостарт ВМ
|
||
- [x] Работа со StoragePool
|
||
- [x] Создание блочных устройств
|
||
- [x] Подключение/отключение устройств
|
||
- [ ] Метод install()
|
||
- [ ] Установка ВМ (нормальный вариант)
|
||
- [x] Управление дисками (всратый вариант)
|
||
- [x] Удаление ВМ
|
||
- [x] Изменение CPU
|
||
- [x] Изменение RAM
|
||
- [ ] Миграция ВМ между нодами
|
||
- [x] Работа с qemu-ga
|
||
- [x] Управление питанием
|
||
- [x] Вкл/выкл автостарт ВМ
|
||
- [ ] Статистика потребления ресурсов
|
||
- [ ] Получение инфомрации из/о ВМ
|
||
- [ ] SSH-ключи
|
||
- [ ] Сеть
|
||
- [ ] Создание снапшотов
|
||
- [ ] Поддержка выделения гарантированной доли CPU
|
||
|
||
# Заметки
|
||
|
||
## Что там с LXC?
|
||
|
||
Можно добавить поддержку LXC, но только после реализации основного функционала для QEMU/KVM.
|
||
|
||
## Будущее этой библиотеки
|
||
|
||
Нужно ей придумать название.
|
||
|
||
## Failover
|
||
|
||
В перспективе для ВМ с сетевыми дисками возможно организовать Failover решение — ВМ будет автоматически запускаться на другой ноде из пула при отключении оригинальной ноды. Технически это можно реализовать как создание ВМ с аналогичными характеристиками на другой ноде с подключением к тому же самому сетевому диску. Сразу нужно отметить, что для реализации:
|
||
|
||
- Нужно где-то хранить и регулярно обновлять информацию о конфигурации ВМ для воссоздания ВМ
|
||
- Нужно иметь "плавающие адреса", чтобы переключить трафик на новую ноду
|
||
- Необходимо выполнять failover по чётким критериям: нода полностью недоступна более X времени, маунт сетевого диска отвалился и т.п.
|
||
- Как быть с целостностью данных на сетевом диске? При аварии на ноде, данные могли быть повреждены, тогда failover на тот же диск ничего не даст.
|
||
- Сетевой диск должен быть зарезервирован средствами распределённой ФС
|