python-compute/README.md
2023-08-27 23:42:56 +03:00

95 lines
5.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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 конфиг и т.п.
- `QemuAgent` - понятно что это.
- `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 на тот же диск ничего не даст.
- Сетевой диск должен быть зарезервирован средствами распределённой ФС