I built a three-node Kubernetes cluster in my spare room because I wanted to "learn it properly", and the honest summary two years later is: I did learn it properly, and most of what I learned was that I did not need it. If you came here for permission to tear yours down, you have it. If you came here to be talked out of building one, I am afraid I cannot quite manage that, because I would do it again. Just smaller.
Let me be precise about what I actually had, because "homelab Kubernetes" covers everything from a single Raspberry Pi running k3s to a rack that draws more than the oven.
the setup
Three second-hand Intel NUCs, 32GB each, bought off eBay over a few months. A managed switch that was overkill. A Synology for shared storage over NFS, which I will come back to because it caused most of the pain. The control plane and workers were colocated, because three nodes, so every node was doing everything.
I ran full upstream Kubernetes via kubeadm at first, then gave up and moved to k3s after the second time a kubeadm upgrade went sideways on a weeknight. That move alone tells you something. The "proper" thing was too much faff, so I quietly adopted the lightweight thing and pretended that had been the plan.
On top of it: Traefik as ingress, MetalLB for load-balancer IPs on a flat home network, cert-manager doing Let's Encrypt, Longhorn for a while and then back to NFS, and ArgoCD watching a Git repo so I could pretend I had a platform team. Workloads were the usual self-hosted suspects. Pi-hole, a Gitea, Home Assistant, a couple of media things, Prometheus and Grafana, and Vaultwarden.
what it actually cost
Time first, because time is the real currency here. The initial build was a long weekend, which I expected and enjoyed. The problem was the steady-state cost. A cluster is not a thing you set up. It is a thing you maintain, and a single-admin home cluster has no one to share the pager with.
Things that ate evenings I will not get back:
- Certificate renewals failing silently because cert-manager could not solve a challenge after I changed something in Traefik and forgot.
- Longhorn volumes degrading when a node rebooted, then taking an age to rebuild over gigabit, during which everything backed by them was slow or wedged.
- NFS being NFS. Stale handles, a pod stuck in
Terminatingforever, the classic. More than once the fix was a hard reboot and a quiet apology to the dog for the language. - An upgrade that drained a node and then could not reschedule because I had been sloppy with resource requests and the remaining two nodes did not have room. Self-inflicted, but Kubernetes is very good at turning your sloppiness into an outage.
Then electricity, which matters more now than it did when I started. Three NUCs plus the switch plus the NAS idled around 90 to 110 watts measured at the wall. Call it 100W average. That is roughly 876 kWh a year. At what I am now paying per unit, and with the cap moving the way it is this autumn, that is real money for what is mostly Pi-hole and a password manager. I did not build a cluster to think about my electricity bill, and yet here we are, on the first of September, thinking about very little else.
the bit nobody warns you about
The failure mode that actually hurt was not Kubernetes breaking. It was Kubernetes breaking the things my household depends on.
When DNS lives in a pod, and the pod lives on a cluster, and the cluster is mid-upgrade, then "the internet is broken" becomes a support ticket from the people I live with while I am elbow-deep in kubectl describe. That is the cardinal sin of homelabbing. Do not put the things people actually use behind the most fragile thing you own. Pi-hole moved off the cluster onto a boring little dedicated box, and the temperature of the house dropped a degree, metaphorically.
what I kept
I did not throw it all away, because some of it genuinely earned its keep.
I kept the declarative habit. Having everything in a Git repo, applied automatically, is the single best thing about the whole exercise, and it has nothing intrinsically to do with Kubernetes. I get the same feeling now from a tidy compose file under version control with a small script to apply it.
I kept Prometheus and Grafana, because once you have lived with proper metrics you cannot go back to guessing. I kept the discipline of resource limits and health checks, because thinking about what "healthy" means for a service is good for you even when the orchestrator is just Docker.
And I kept k3s, but shrunk. The cluster is one node now. A single mini PC running k3s, with the genuinely cluster-shaped workloads on it and the household-critical things deliberately outside, on hardware that does not get touched. One node means no quorum, no node-drain dance, no distributed storage. It is, in effect, Docker Compose with a worse YAML dialect and a much better dashboard, and I am at peace with that.
the actual lesson
The mistake was not learning Kubernetes. Learning it was great, and it has paid off at work many times over, because the muscle memory of debugging a real cluster is hard to fake. The mistake was running a production-shaped, multi-node, highly-available system to host a handful of low-stakes apps for one household, and then being surprised when it demanded production-shaped attention.
Run the smallest thing that teaches you what you want to learn, and host the things your family relies on on something so boring it never makes the news. If that is a single Compose file on a NUC, you have my blessing and probably my envy. I will be over here, paying the electricity bill on my education.