Had an idea on my Sunday morning's run: I keep telling myself I should practice CKA exam commands more often. Installing and upgrading Kubernetes with kubeadm isn't something you learn by reading about it. It's something you learn by typing it over and over until your fingers know it before your brain does. Same for the Linux tools the exam uses: vim, grep, awk, the stuff you reach for under time pressure. And I wanted to be able to do it anywhere whenever I've got some dull minutes and just my phone.
So I built a practice lab. A real Ubuntu terminal running in the browser, with real vim, grep, awk, jq. Genuine Linux tool muscle memory, no simulation. kubeadm, kubectl, systemctl, sudo, apt-mark, and apt-get (only for the Kubernetes-specific packages) are simulated instead, so typing the wrong thing at the wrong step fails the way it should, without needing to spin up an actual cluster. No waiting for a sandbox to provision, no session limits, no laptop required. Just open a browser tab, anywhere, even from my phone.
Each session spins up a new container, torn down again the moment you log out. Every practice run starts from a clean slate, exactly like walking into the real exam.
Started this on the run in the morning, had it working end to end in the evening, with Claude Code handling the boilerplate so I could focus on the integration problems that actually needed thinking through. A few things that surprised me along the way:
- Azure's container "exec" feature needs an undocumented 2-byte prefix on every keystroke you send. Not in any public docs, only in az's own source code.
- Cloudflare blocks its own login flow's preflight requests by default, because they can't carry the auth cookie. There's a toggle for it. Good luck finding it without knowing where to look.
- A container's main process has to stay alive on its own. "exec" starts a separate process on top of it, it doesn't wait around for your first one to be interactive.
The integration work and troubleshooting to get it all talking to each other was the part I enjoyed most, and a good excuse to keep sharpening the Kubernetes and Linux fundamentals myself. It's deployed as its own Container App in my Azure environment, shipped through two GitHub Actions workflows (API and Worker), with my Cloudflare (frontend) picking up changes to that branch automatically. I'm also looking at ACA's new sandbox resource type (which is not GA yet) as a stronger isolation boundary for the per-session lab containers than the general-purpose Container App I'm using today for version 2.
