Go to file
2023-08-31 21:55:34 +03:00
node_agent upd 2023-08-31 20:37:41 +03:00
.gitignore upd 2023-08-27 23:42:56 +03:00
config.toml upd 2023-08-27 23:42:56 +03:00
Makefile various updates 2023-08-24 22:36:12 +03:00
poetry.lock cool updates 2023-07-22 23:59:49 +03:00
pyproject.toml various updates 2023-08-24 22:36:12 +03:00
README.md upd 2023-08-31 21:55:34 +03:00

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-конфига, возможно будет выброшен на мороз.
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 на тот же диск ничего не даст.
  • Сетевой диск должен быть зарезервирован средствами распределённой ФС