Если вы когда-нибудь поднимали стек из нескольких ВМ на KVM, то знаете, как это выглядит на практике: XML-конфиги libvirt, ручная настройка сетей, отдельные cloud-init-образы для каждой машины. И всё это нужно держать в голове или раскидывать по скриптам.
holos решает именно эту проблему. Он берёт синтаксис, знакомый по docker compose, и применяет его к настоящим виртуальным машинам на KVM/QEMU без libvirt, без XML, без сетевых мостов с root-доступом.Что он делает
Вы описываете стек в
holos.yaml. Каждый сервис — это ВМ со своим образом, ресурсами и cloud-init-конфигом. Поддерживаются зависимости между сервисами, проброс портов, монтирование директорий, реплики и healthcheck.Пример:
name: my-stack
services:
db:
image: ubuntu:noble
vm:
vcpu: 2
memory_mb: 1024
cloud_init:
packages:
- postgresql
runcmd:
- systemctl enable postgresql
- systemctl start postgresql
web:
image: ubuntu:noble
replicas: 2
depends_on:
- db
ports:
- "8080:80"
cloud_init:
packages:
- nginx
runcmd:
- systemctl restart nginx
Затем одна команда:
holos up
И у вас работают две ВМ с nginx и одна с PostgreSQL, все видят друг друга по имени сервиса.
Как это работает внутри
Каждая ВМ получает два сетевых интерфейса: user-mode для проброса портов с хоста и socket multicast для L2-связи между машинами. Статические IP назначаются автоматически в подсети
10.10.0.0/24, а /etc/hosts прописывается через cloud-init. Ничего настраивать вручную не нужно.Для хранения данных между перезапусками есть named volumes, они живут как qcow2-файлы и не удаляются при
holos down.volumes:
pgdata:
size: 20G
services:
db:
image: ubuntu:noble
volumes:
- pgdata:/var/lib/postgresql
Внутри гостевой системы том появляется как
/dev/disk/by-id/virtio-vol-pgdata. cloud-init сам создаёт файловую систему и прописывает /etc/fstab при первом запуске.Основные команды:
holos up # запустить стек
holos down # остановить и удалить
holos ps # список запущенных проектов
holos exec web-0 # SSH в инстанс
holos logs web # логи сервиса
holos install --enable # автозапуск через systemd после ребута
Для SSH
holos генерирует пару ключей для каждого проекта и инжектирует публичный ключ через cloud-init. Порт пробрасывается автоматически.Поддержка GPU passthrough
Если нужно отдать физическую видеокарту виртуальной машине:
services:
ml:
image: ubuntu:noble
vm:
vcpu: 8
memory_mb: 16384
devices:
- pci: "01:00.0"
- pci: "01:00.1"
holos сам включает UEFI (OVMF), выставляет kernel-irqchip=on для совместимости с NVIDIA и создаёт отдельное хранилище EFI-переменных для каждого инстанса. Настройку IOMMU и привязку GPU к vfio-pci нужно сделать на хосте самостоятельно — holos devices --gpu поможет найти PCI-адреса.Что нужно на хосте
/dev/kvm, qemu-system-x86_64, qemu-img и любой из инструментов для создания cloud-init ISO: cloud-localds, genisoimage, mkisofs или xorriso.holos это не замена Kubernetes. Он не умеет в кластеры, live migration и service mesh. Его задача — сделать KVM удобным для одного хоста без операционной сложности оркестраторов. Если вам нужен воспроизводимый стек из нескольких ВМ на одной машине, это рабочий вариант.➡️ Репозиторий
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека devops'a
#арсенал_инженера