Welcome to the (Kubernetes) Humble Home Lab repo. The source of truth for my bare metal cluster running on Talos Linux. The goal here is to deepen my understanding of k8s, become the GitOps mindset, and share what I learn along the way.
| System | Role | CPU | RAM | Graphics | Disk (boot) | Disk (storage) |
|---|---|---|---|---|---|---|
| Minisforum MS-01 (3x) | Control Plane/Worker | Intel i9-12900H | 96GB DDR5 | Intel Iris XE | Samsung PM983 960GB M.2 NVME | Crucial 1TB M.2 NVME |
| HL15 2.0 | NAS | AMD Epyc 7452 | 256GB DDR4 | Intel ARC A310 | 512GB NVME Mirror | ZFS RaidZ2 Pool (12x 8TB Disks) |
I'm running Talos Linux, which is an immutable, API driven operating system designed specifically for Kubernetes. Talos is configured declaritively and is a great choice for a GitOps driven workflow.
For me, a home lab about tinkering and learning. So I set off to learn Kubernetes with a goal to grow my skillset and have an infrastructure that allows me to scale and provide useful, locally hosted applications for my family.
My homelab network stack consists of Ubiquiti equipment with VLANS configured for IoT, Management, DMZ, and Cameras. Networking in my cluster is handled by Cilium. I'm using Envoy Gateway to manage application traffic coming into the cluster.
To keep a pulse on the cluster, I'm using: Prometheus, Grafana, VictoriaLogs, Alertmanager, Gatus, and Fluentbit.
Persistent storage is provided by Rook-Ceph, utilizing the 1TB NVMe drives on each node. Volumes are replicated across each node so if an app is rescheduled to a different node it will have access to it's data.
The backbone of this cluster is Flux CD — a GitOps controller that reconciles my entire Kubernetes state from a Git repository Flux and Renovate handle most of the deployments and updates to the cluster.
The core idea: Git is the single source of truth. Flux continuously compares what's in Git against what's running in the cluster, and corrects any difference — whether that's a new commit you pushed, or a "drift" caused by a manual change someone made directly on the cluster.
See Flux in action
flowchart TD
%% MEANING: the GitOps loop — Git is the source of truth, Flux reconciles the cluster to match it
Dev("You — edit YAML and git push") --> Git[("Git repository<br/>single source of truth")]
subgraph FluxLoop["Flux — runs inside the cluster, never sleeps"]
Pull("Pull the latest manifests") --> Diff{"Does the cluster<br/>match Git?"}
Diff -->|" yes — in sync "| Wait("Wait for the next check")
Wait -.-> Pull
Diff -->|" no — out of sync "| Apply("Apply what changed")
end
Git -->|" Flux checks ~every minute "| Pull
Apply --> K8s("Kubernetes updates<br/>pods, services and config")
K8s -->|" cluster now matches Git "| Diff
Drift("Manual kubectl edit") -.->|" drift! Flux puts it back "| Diff
classDef human fill:#A7F3D0,stroke:#047857,stroke-width:2px,color:#000
classDef git fill:#DDD6FE,stroke:#6D28D9,stroke-width:2px,color:#000
classDef flux fill:#BFDBFE,stroke:#1D4ED8,stroke-width:2px,color:#000
classDef k8s fill:#A5F3FC,stroke:#0E7490,stroke-width:2px,color:#000
classDef warn fill:#FDE68A,stroke:#B45309,stroke-width:2px,color:#000
class Dev human
class Git git
class Pull,Diff,Wait,Apply flux
class K8s k8s
class Drift warn
style FluxLoop fill:#EFF6FF,stroke:#93C5FD,color:#1E3A8A
I made a Youtube video that gives a general overview of my configuration and the core components.
Special thanks to the most excellent onedr0p/cluster-template. It provides a clean, modern foundation for Talos + Flux-based clusters — and taught me how to organize manifests properly, use SOPS, and implement GitOps the right way.
If you're interested in this type of thing, I encourage you to build your own home lab. It doesn't have to be Kubernetes. Grab ANY old computer and see what you can deploy on it.
Embrace the process. It will be infuriating at times, blissful at others.
You'll build some really cool stuff along the way. And your brain waves will expand.
