Skip to content

Flatcar Homelab

Homelab Logo

Six machines in a rack, a pile of YAML, and a stubborn refusal to pay a cloud provider for something that fits under a desk. This is a bare metal Kubernetes cluster that provisions itself over PXE, keeps its entire state in Git, and is documented here mostly so that Future Me, at 02:00, with one hand holding a phone flashlight, does not have to re-derive any of it.

It is a real cluster doing real work, built the way a production cluster is built, at a scale where breaking it is a learning experience rather than an incident review.

Start here

  • I want to build this


    Adapt It to Your Cluster first — the repository URL, domain and addresses are hardcoded — then the Quickstart. Set aside an afternoon.

  • I know Kubernetes, not this repo


    Architecture for how it fits together, Design Decisions for why, and Known Limitations for what it does not do.

  • I am learning Kubernetes


    Core Concepts covers the five ideas underneath this cluster — immutable OS, first-boot provisioning, sysexts, network boot, GitOps — and what each one costs.

  • Something is broken


    Operations has the health check and the symptom-to-cause table. If it is a stalled install, the PXE troubleshooting table.

The stack in one table

Layer Choice Why it is not the obvious one
OS Flatcar Container Linux Read-only /usr. You cannot apt install your way out of a problem, which turns out to be the feature
Cluster Kubernetes via kubeadm Stock upstream, so the upstream docs apply verbatim
Network Cilium eBPF, no kube-proxy, no iptables archaeology. Also supplies Gateway API and the LoadBalancer addresses bare metal does not come with
Storage Rook-Ceph Replicated block storage across the nodes, and the component most likely to teach you humility
Secrets OpenBao Nothing sensitive in Git, at the price of a manual unseal after every reboot
Delivery ArgoCD If it is not in Git it is not real, and it will not survive the next reconcile

Every one of those had a simpler alternative that was rejected on purpose. The reasoning, and what each choice costs, is in Design Decisions.

What is in each section

  • Get Started


    Concepts, the eleven-command build, and what to change before pointing any of it at your own hardware.

  • Architecture


    The boot process arrow by arrow, the GitOps strategy, the security posture it assumes, and the limitations written down deliberately — because the ones you have not admitted to are the ones that page you.

  • Platform


    The fifteen components that make the cluster more than a very expensive way to run nginx, with the sync-wave order that lets a fresh bootstrap converge rather than deadlock.

  • Operations


    Health checks, node reboots, how updates actually get applied, and what is and is not backed up — the last of which is the only page here that will ever matter on your worst day.

  • Development


    Working on the repository: the checks that run, how this site is built, what Renovate is allowed to merge, and how to add a workload.