This episode covers microVM orchestration: firectl as a simple CLI to launch Firecracker from an OCI image, Flintlock from liquidmetal to manage many microVMs as a service, and Kubernetes integration via containerd and the microvm runtime class with the sandbox-per-user/job pattern.

In episode 11 we ran containers inside microVMs with firecracker-containerd. But managing microVMs one by one will never scale to production. Episode 12 introduces the orchestrator layer: firectl for ease of use, Flintlock for scale, and Kubernetes as the control plane — so hundreds of microVMs can be born and die like ordinary containers.
Why is this episode important? Firecracker is just an engine; without an orchestrator it can't be a platform. Understanding firectl gives you the fastest way to spin up a microVM for experiments; understanding Flintlock and the microvm runtime class gives you the architecture to serve thousands of users with fully isolated sandboxes.
firectl is a simple CLI that wraps the Firecracker API so you can launch a microVM without writing dozens of lines of curl. It takes an OCI container image, unpacks it into a microVM rootfs, and boots Firecracker:
firectl \
--firecracker-binary=/usr/local/bin/firecracker \
--kernel=vmlinux.bin \
--root-drive=rootfs.ext4 \
--kernel-opts="console=ttyS0 reboot=k panic=1 pci=off" \
--vcpus=2 \
--memory=1024With firectl, the flow we did in episodes 4-5 with 5 curls becomes a single command. It can even use a container image as the rootfs source:
firectl --firecracker-binary=/usr/local/bin/firecracker \
--kernel=vmlinux.bin \
--root-drive=docker:alpine:latest \
--vcpus=1 --memory=512When to use firectl? For labs, experiments, and scripts — any time you need a fast microVM without API boilerplate. It's not a production control plane, but it's the perfect gateway for understanding what the big orchestrators really do behind the scenes.
Flintlock (from liquidmetal — a CNCF microVMs project) is a service that manages the lifecycle of many microVMs on one or many hosts. It offers MicroVM as a Service (MVMaaS): an API to create, delete, and manage microVMs, with Firecracker (or Cloud Hypervisor) as the VMM behind it.
The Flintlock flow:
Because Flintlock is a service (not a per-VM process), it becomes a layer that orchestrators above it can hold on to — including Kubernetes. Its design mimics container runtimes: a consistent API, centralized state, and each microVM having a trackable identity.
curl -s -X POST http://flintlock:9090/v1/microvms \
-H 'Content-Type: application/json' \
-d '{
"namespace": "default",
"spec": {
"kernel": { "image": "registry.example.com/kernel:1.16", "filename": "vmlinux.bin" },
"rootVolume": { "image": "registry.example.com/rootfs:latest", "filename": "rootfs.ext4" },
"vcpus": 2,
"memoryMb": 1024,
"interfaces": [{ "deviceId": "eth0", "type": "tap" }]
}
}'microvm Runtime ClassThe most convenient pattern for putting microVMs into production is through Kubernetes. With containerd + a microVM plugin, each Pod can run inside its own microVM. The key is a RuntimeClass:
apiVersion: node.k8s.io/v1
kind: RuntimeClass
metadata:
name: microvm
handler: firecrackerThen a Pod asks for microVM isolation via runtimeClassName:
apiVersion: v1
kind: Pod
metadata:
name: sandbox-a
spec:
runtimeClassName: microvm
containers:
- name: app
image: docker.io/library/nginx:latestThe consequence: the sandbox-a Pod runs inside a Firecracker microVM — its own guest kernel, full isolation from the node. This is the same pattern as firecracker-containerd in episode 11, but now lifted into the Kubernetes API: Pod = microVM.
The benefits of this pattern in Kubernetes:
Important
The microvm RuntimeClass in Kubernetes requires containerd with a microVM plugin (e.g. firecracker-containerd or Kata Containers with the Firecracker VMM). Without the right runtime handler, runtimeClassName will cause the Pod to fail scheduling. Make sure the handler is registered in the node's containerd configuration.
With Kubernetes + the microvm runtime class, the business pattern that powers Firecracker becomes easy to realize: a sandbox per user or per job. Every user (or every task) gets its own fully isolated microVM:
runtimeClassName: microvm → a dedicated microVM, deleted when done.The benefit over sharing VMs: a single user downloading malware or exhausting resources doesn't affect other users. This is the same pattern as AWS Lambda MicroVMs (episode 18) — VM-level isolation per user — now available for your own platform.
A useful comparison map:
| Tool | Function | When to use |
|---|---|---|
firectl | Launch a single microVM from the CLI | Experiments, labs, scripts |
firecracker-containerd | OCI containers in microVMs | Per-container runtime |
Flintlock | MicroVM as a Service | Orchestrator-managed service |
| Kubernetes + runtime class | Pod = microVM | Production platform, sandbox per user |
They all use the Firecracker API underneath; what differs is the abstraction level and scale. Start with firectl to learn, then move up to Flintlock or Kubernetes when you need centralized control.
The key takeaways:
firectl simplifies launching a microVM into a single command — ideal for learning.Flintlock offers MicroVM as a Service with a centralized API.microvm RuntimeClass makes Pod = microVM, isolation per Pod.In the next episode 13 we'll deepen network security: Network Isolation & Filtering — building a bridge and TAP per guest, filtering traffic with eBPF and iptables, blocking unnecessary outbound traffic, and tuning virtio-net with vhost, TSO/GSO, and ring sizes for peak performance.