, ,. ,-. | ,--. . . ,-. ,-. ,---. ,-. ,-. . , | , , . , ,--.
| / \ | ) | | |\ | / ( ` | | ) / \ |\ /| | | | | / |
| |--| |-< | |- | \| | -. `-. | |-< | | | V | | | | | / |-
| | | | ) | | | | \ | . ) | | \ \ / | | | | | |/ |
`--' ' ' `-' | `--' ' ' `-' `-' ' ' ' `-' ' ' | `--' ' ' `--'
Welcome to my Home Lab repository — the digital scrapbook of my questionable life choices involving Kubernetes, Proxmox, OPNsense, and Cisco gear that probably belongs in a small business rather than my house.
This repo is the source of truth for my Talos‑powered Kubernetes cluster running on a Proxmox virtualization stack, all glued together with VLANs, YAML, and sheer stubbornness.
My mission? Learn modern infrastructure, automate everything, break things in creative ways, and pretend I know what I’m doing.
| System | Role | CPU | RAM | Graphics | Disk (boot) | Disk (storage) |
|---|---|---|---|---|---|---|
| px-node01 | Proxmox Node | 1× Xeon E5-2697 v2 | 32GiB | Nvidia Quadro T400 | Kingston 120GB | 2× PNY 1TB |
| px-node02 | Proxmox Node | 2× Xeon E5-2690 v2 | 64GiB | - | Kingston 120GB | PNY 1TB, Kingston 1TB |
| px-node03 | Proxmox Node | 2× Xeon E5504 | 32GiB | - | Kingston 120GB | PNY 1TB, Kingston 1TB |
| px-node04 | Proxmox Node | 1× Xeon E5-2683 v4 | 48GiB | Nvidia Quadro P2000, Tesla K80 | WDC 120GB | PNY 1TB, Kingston 1TB |
| srv-talos01 running on px-node01 | k3s Control Plane + Worker | 4 vCPU | 16GiB | - | vg_system 80GB | vg_storage 700GB |
| srv-talos02 running on px-node02 | k3s Control Plane + Worker | 4 vCPU | 32GiB | - | vg_system 80GB | vg_storage 700GB |
| srv-talos03 running on px-node03 | k3s Control Plane + Worker | 6 vCPU | 16GiB | - | vg_system 80GB | vg_storage 700GB |
| srv-talos04 running on px-node04 | k3s Worker (GPU) | 4 vCPU | 16GiB | Nvidia P2000, Tesla K80 | vg_system 80GB | vg_storage 700GB |
Everything is wired into a Cisco network with VLANs for IoT, Management, LAN, Servers, and Cameras — because nothing says “home” like enterprise‑grade segmentation.
All routing and firewalling is handled by OPNsense, which I lovingly refer to as “the box that decides whether packets deserve to live.”
Talos is an immutable, API‑driven operating system designed specifically for Kubernetes.
No SSH. No package manager. No “just quickly logging in to fix something.”
Talos forces me to behave like a responsible adult and manage everything declaratively. It’s GitOps‑friendly, predictable, and occasionally terrifying — in a good way.
This home lab is my personal dojo for learning Kubernetes. I wanted a place where I could experiment, scale, break things safely, and eventually run useful self‑hosted apps for myself and my family.
Kubernetes gives me:
-
a playground
-
a production‑ish environment
-
and a reason to explain to guests why the lights flicker when I reboot a node
Networking inside the cluster is powered by Cilium, because if I’m going to confuse myself with networking, I might as well use eBPF while I’m at it.
Cilium gives me fast, modern networking and enough observability tools to feel like I’m running a small cloud provider.
The backbone of this entire setup is Flux CD — the GitOps controller that ensures my cluster always matches what’s in Git.
Flux is like a very strict librarian:
-
It sees everything
-
It remembers everything
-
It puts everything back where it belongs
-
And it gets annoyed when I touch things manually
Together with Renovate, most updates happen automatically — sometimes faster than I can read the release notes.
Flux continuously compares the cluster state with Git. If something drifts, Flux fixes it. If I break something, Flux fixes it. If I think about making a manual change, Flux senses it and prepares to fix it.
See Flux in action
flowchart TD
Dev["👩💻 You push YAML to Git"] --> Git[("📂 Git Repo
Source of Truth")]
Git -->|"Flux polls ~every 1 min"| Fetch["Flux fetches
latest manifests"]
Fetch --> Diff{"Cluster state = Git state?"}
Diff -->|"✅ Already in sync"| Idle["Flux idles"]
Idle -.->|"next poll"| Fetch
Diff -->|"❌ Out of sync"| Apply["Flux applies manifests to Kubernetes"]
Apply --> Cluster["☸️ Kubernetes creates / updates resources"]
Cluster -->|"sync complete"| Diff
Drift["⚠️ Someone manually changes the cluster"] -.->|"causes drift"| Diff
classDef gitNode fill:#6e40c9,stroke:#4a2d8c,color:#fff
classDef fluxNode fill:#326ce5,stroke:#1e4db3,color:#fff
classDef k8sNode fill:#81D4FA,stroke:#0277BD,color:#000
classDef devNode fill:#2ea44f,stroke:#1a7036,color:#fff
classDef driftNode fill:#FFE082,stroke:#F57C00,color:#000
class Git gitNode
class Fetch,Diff,Idle fluxNode
class Apply,Cluster k8sNode
class Dev devNode
class Drift driftNode
GitOps magic: The cluster always converges back to Git — even if I don’t.
Massive thanks to onedr0p/cluster-template. It gave me a clean, modern foundation for Talos + Flux and taught me how to structure manifests, use SOPS, and avoid turning my repo into a YAML graveyard.
If you’re even remotely curious about home labs, build one. It doesn’t have to be Kubernetes. It doesn’t have to be fancy. It doesn’t even have to make sense.
Grab an old computer, install something, and see where the rabbit hole leads.
You’ll learn a ton. You’ll break things. You’ll fix things. And eventually, you’ll end up explaining to your family why the TV stopped working because you “accidentally deleted the wrong VLAN.”