The Kubernetes Homelab Architecture
Why Talos Instead of a General-Purpose Linux Distribution
- talosctl owns the node lifecycle, including machine configuration, Kubernetes versions, and Talos upgrades.
- Flux owns Kubernetes resources after the cluster exists.
Flux Owns Desired State, Not My Memory
1Password and External Secrets Keep Values Out of Git
Storage Classes Are Policy
- longhorn-ha for small, portable ReadWriteOnce volumes that benefit from replicas across worker disks
- truenas-nfs for dynamically provisioned ReadWriteMany directories whose natural home is the NAS
- local-ssd as a static-only option for scratch data or latency-sensitive workloads where binding the pod to one worker is an acceptable trade-off
- A static NFS PV for an existing TrueNAS dataset whose lifecycle should remain independent from Kubernetes provisioning
Where Longhorn Fits
Where TrueNAS Fits
What Stayed Out of Kubernetes
- Which layer owns its configuration?
- Which storage path matches its data?
- How is it backed up?
- What recovery path have I actually proven?
The Operational Boundary Matters More Than Installation
- Talos node health and lifecycle through talosctl
- Kubernetes desired state and drift through Flux
- Persistent data health through Longhorn and TrueNAS
Tech Stack
- Proxmox for the virtual machine layer
- Talos Linux for immutable, API-managed Kubernetes nodes
- Kubernetes across 3 control-plane nodes and 4 workers
- Flux for GitOps reconciliation from a private GitHub repository
- 1Password + External Secrets Operator for application and runtime secrets
- SOPS + age for the 1Password bootstrap Secret
- Longhorn for replicated worker-local block storage
- TrueNAS NFS for shared ReadWriteMany datasets
- Local SSD storage reserved for explicitly node-bound scratch and latency-sensitive data
- Grafana, Prometheus, Loki, and Alloy for cluster and storage observability