runtimeClassName: k7 run inside k7d microVMs instead of plain containers. Four steps register the runtime on a k3s node.
The release installer does all four steps for you:
sudo ./install.sh --with-k3s. The manual steps below are for understanding what it does, or for non-k3s containerd setups.1
Install and start the daemon
The shim is a thin client: sandbox
Create calls the daemon over /run/k7d/k7d.sock and fails loudly if it is not running.2
Install the shim binary
io.containerd.k7.v1 → containerd-shim-k7-v1).3
Register the runtime in containerd
Add to Two things matter here:
/var/lib/rancher/k3s/agent/etc/containerd/config-v3.toml.tmpl:pod_annotationsforwards thek7d.katakate.org/*pod annotations (cluster-id,fork-vm-index, …) into the sandbox OCI spec so the shim can see them — required for cluster-mode pods deployed via kubectl.- Do not add an
[options]section withBinaryName— the option value leaks into the cgroup path and breaks shim startup.
4
Restart k3s and create the RuntimeClass
kubectl get runtimeclass k7 — it should show HANDLER: k7.Using it
kubectl logs, kubectl exec (including -it with PTY, resize, Ctrl-C, detach), pod IPs, Services, DNS, ConfigMaps/Secrets, emptyDir/hostPath/PVC volumes, memory/CPU limits, init containers, natural exit / restartPolicy, and multi-vCPU guests all work — see the feature matrix for the full support table and what’s still to come (hostNetwork, NetworkPolicy, IPv6, cross-node fork).
CPU limits and vCPUs: the shim derives the guest’s vCPU count from the pod’s CPU limit (
cpu: "2" boots a 2-vCPU guest), and the limit is additionally enforced on the host via a CFS quota on the VM’s vCPU threads. Fork and snapshot preserve multi-vCPU state.Because VMs outlive shims
The daemon owns the VMs, so a containerd restart or shim crash does not kill your workloads: a freshly respawned shim resolves its sandbox back to the still-running VM via the daemon’sreattach_sandbox operation, which also verifies the guest agent still answers before handing the VM back.