Clustered Libvirt, simplified.
Matthew Stobbs
de93204e3d
- instead of getting all the data the hard way, use libvirtxml to parse the XML from libvirt - this makes it more accurate, and more future proof when schema changes occur - add pcidb to query devices better |
||
---|---|---|
cluster | ||
cmd | ||
config | ||
css | ||
lib | ||
public | ||
util | ||
view | ||
.air.toml | ||
.gitattributes | ||
.gitignore | ||
go.mod | ||
go.sum | ||
LICENSE | ||
main.go | ||
package-lock.json | ||
package.json | ||
README.md | ||
tailwind.config.js |
clustvirt - Libvirt cluster manager
Clustered virtualization has gotten to complicated. We have a great system for it built into the Linux kernel, with shared software stacks between whatever base distro you want to use.
Every other option has buy in, and buzzwords. I want something truly simple that can manage virtual machines on multiple hosts, integrating with existing tools, running from one/all of the hosts, a raspberry pi, or as a guest machine on the cluster itself.
The mission: Talk to libvirt hosts, coordinate them, manage them, and let people take their clusters back.
Overall goals:
- HA Cluster resource manager (simpler then existing options, just for libvirt)
- Share secrets
- Share VM configs
- know what VM is running on what cluster host
- trigger migrations of hosts
- most simple quorum algorithm possible, ability to run 2 hosts reliably,
up to ?? hosts without worry
- Simplest quorum: If the controller can't reach it, it's down.
- Shared Network management
- Shared storage managment
- Does not include clustered storage configuration
- Can use different clustered storage systems (just not configure them directly)
- Reliable backup and snapshotting
- The tools exist for this, just needs to be exposed
- Install on any libvirt system, as long as the basic requirements are met as
far as compatibility is concerned
- Should be able to have hosts on RedHat, Rocky, Arch, Ubuntu, Debian, whatever without worry
- Cloud-init configuration help to create useful and reusable cloud-init files, that don't need to be used by the system only. It's a standard, use it.
Existing tools and libraries to use
- [https://pkg.go.dev/libvirt.org/go/libvirt] Go Bindings for libvirt
- Not sure if it can be used without libvirt existing on the system it's running on. Worth a try.
Roadmap
- Create simple daemon that can run on 1 or more hosts that will keep track of things
- Libvirt daemon
- Host Capabilities
- Migration Capabilities
- Secret management
- Storage pool management
- Volume management
- Guest management
- Connection management (to other libvirt hosts)
- Libvirt daemon
- Create a simple WebUI with HTMX to monitor that stuff
- Add the ability to manage that stuff once we can monitor it, through the WebUI.
Special XMLNS definitions
Domain
xmlns:clustvirt="https://git.staur.ca/stobbsm/clustvirt"
<metadata>
<clustvirt:data xmlns:clustvirt="https://git.staur.ca/stobbsm/clustvirt/">
<clustvirt:created>true</clustvirt:created>
<clustvirt:managed>true</clustvirt:managed>
<clustvirt:currentHost>host01</clustvirt:currentHost>
<clustvirt:origHost>host02</clustvirt:origHost>
<clustvirt:baseGuest>rocky-9-base</clustvirt:baseGuest>
</clustvirt:data>
</metadata>
Open Source Projects
The following projects are being used as part of ClustVirt. Only those being used directly are listed, not the dependencies.
Go
Library | Use | License |
---|---|---|
xdg | XDG paths | MIT |
spf13/viper | Configuration | MIT |
spf13 | Command Pattern CLI | Apache 2.0 |
go-chart/v2 | Chart generation | MIT |
libvirt | Communications with Libvirtd | MIT |
libvirtxml | Libvirt XML parsing and generation | MIT |
templ | HTML Templating Engine | MIT |
chi/v5 | HTTP Routing | MIT |
Node NPM
Library | Use | License |
---|---|---|
tailwindcss | CSS UI library | MIT |
tailwindcss/forms | CSS UI library for forms | MIT |