An earlier implementation of kezio lives on the
legacybranch. This tree replaced it and is the one to use.
Proof of concept. Do not deploy machines you care about.
kezio is under active development and has not run anywhere but its own labs. The API is not stable: field names, defaults and whole resources change between releases with no migration path. Deploying an image overwrites the target disk, so a mistake here costs data rather than uptime.
Start with docs/quick-start.md. It takes an
empty cluster and one machine to a deployed OS, one checked step at a
time.
kezio is a Kubernetes operator that deploys an OS onto bare-metal machines. It uses ezio as the deploy engine: disk partitions travel over BitTorrent, with partclone images as payload, so many machines can be written at once from one seeder.
kezio drives each machine through its BMC (Redfish or IPMI). It powers
the machine on, net boots it into a live agent, writes the disk, and
power-cycles it into the deployed OS. A Machine requires a BMC; kezio
has no mode that deploys a machine without one.
- Upload a disk image with
kezioctl image upload. An in-cluster Job slices every partition once with partclone and builds a.torrentper partition. The result is an immutableImageover onePartitionContentper partition. - Create a
Machine(BMC address, credentials, boot MAC, and theSubnetit boots on). kezio net boots it once to inspect it; the agent reports its disks and NICs as aMachineHardware, and theMachinebecomesAvailable. - Bind a
MachineClaimto theMachine: whichImage, which disk, whichPostHooks. kezio starts a seeder for thatImageat the machine'sSite, net boots the machine again, and the agent writes every partition over BitTorrent, replays the partition table, runs the hooks, and sets the UEFI boot entry. - kezio power-cycles the machine into the deployed disk. The
MachineisProvisioned; the seeder stops a few minutes after the last deploy of thatImagefinishes.
The objects behind this - Site, Subnet, Machine, MachineHardware,
MachineClaim, Image, ImageImport, PartitionContent, DeployRun,
PostHook - are described field by field in
docs/crd-reference.md.
docs/quick-start.md: the step-by-step bring-up from an empty cluster to one deployed machine.docs/crd-reference.md: every custom resource, how they relate, and the rules the schema enforces.docs/network-model.md: what aSiteguarantees, data-plane-onlySubnets, the no-NAT rule, and the address-pool sizing rule.docs/image-boot-contract.md: what a deployable image must ship on its EFI System Partition.docs/bmc.md: theredfish://andipmi://BMC drivers and how power actions are driven.docs/secure-boot.md: the UEFI Secure Boot signature chain of the net boot path.
Each GitHub Release
ships the container images on ghcr.io, install.yaml (the controller
manager alone - the quick start builds the net boot overlay on top of
it), and prebuilt kezioctl binaries for Linux, macOS, and Windows.
To build from source (Go 1.26+):
make build # compile the manager binary into bin/
make build-kezioctl
make test # run unit tests
make lint # run golangci-lintmain.yaml builds, lints, tests, and runs KubeVirt-based e2e lanes
(single subnet in both DHCP modes, routed multi-segment, two sites,
three concurrent machines) on every push and pull request. release.yaml
publishes the images and the release assets on v* tags.
Apache-2.0. See LICENSE.