Hatching liken

(backfilled 2026-08-25)

Heading into a 10-day stretch of relaxation and lake time, I started thinking about catching up on some maintenance on my homelab. My homelab has never been in better shape since the advent of AI coding agents. It has fully automated image updates with flux; the machines themselves were fairly well-maintained with Ansible. It was a shining beacon of Infrastructure-as-Code (perhaps even too much, given some serious circularity in the fact that my internal gitea instance runs on the same cluster it manages, but alas).

But not everything smelled like fresh cut grass here. The five mini PCs backing the k3s cluster were all running Ubuntu 22.04 and had a gajillion pending updates requiring reboots. I was 4 minor versions behind on k3s. My zigbee and UPS controllers were running on Raspberry Pi 2s (yes, 2s) and were literally still running Raspbian, which hasn’t even existed since 2020. I was drowning in updates, and there’s really no good time to take the cluster down to apply them.

I started thinking very hard about why I even had Ubuntu and Raspbian in the mix at all. Just about everything was already running in K8s, except a few oddballs, like WireGuard and bind9 for DNS. Surely any service that can run on a host OS can also run under K8s, right? Why do I even need SSH on these machines? Can’t I just boot straight from Linux to k3s?

It turns out that, yes, yes we can.

Almost.

So the gears start turning: k3s probably doesn’t actually expect itself to be pid 1 and it would be thoroughly unreasonable for Rancher to give it support for that. So maybe we’d just need a tiny little init shim. How does Linux even actually boot up anyway? And how on earth would we give a pod access to a device like a GPU or a zigbee dongle if there’s no udev running? Do there need to be users? What does systemd actually do?

So I started pulling threads to see what I could learn here. And it didn’t take long before Claude and I had a very small proof-of-concept booting up on QEMU. I’m not even sure when I could first run kubectl against it, but from that moment, I knew for sure I was going to take this to its logical conclusion.

(And yes, I did still spend plenty of time with my family by the lake!)