This repository is the source of truth for my personal homelab Kubernetes cluster. I try to keep things simple and reproducible by following Infrastructure as Code (IaC) and GitOps practices with tools like Talos, Kubernetes, Argo CD, and Renovate.
My Kubernetes cluster is deployed with Talos Linux. It is a small Talos cluster built to stay simple, low-maintenance, and reliable for the services I actually run. It currently has two nodes with a single control-plane node.
- MetalLB: Provides
LoadBalancerIPs on the local network. - Envoy Gateway: Handles in-cluster ingress and HTTP routing.
- Cloudflare Tunnel: Publishes selected services externally without opening inbound ports.
- ExternalDNS: Syncs DNS records to Cloudflare.
- External Secrets Operator: Syncs Kubernetes secrets from Bitwarden Secrets Manager.
- Longhorn: Provides persistent volumes for stateful workloads.
- CloudNativePG: Runs PostgreSQL workloads in-cluster.
- VolSync: Handles scheduled PVC backups.
- Garage: Provides S3-compatible object storage for backup workflows.
- kube-prometheus-stack: Provides Prometheus, Grafana, and Alertmanager.
- VictoriaLogs: Stores cluster logs.
- Fluent Bit: Collects and forwards logs into VictoriaLogs.
For a compact overview of what is currently deployed, see the Kubernetes Inventory.
Argo CD watches the manifests in my kubernetes
folder and makes changes to my cluster based on the state of my Git repository.
Renovate watches my repository for dependency updates, and when they are found a pull request is automatically created. When pull requests are merged Argo CD applies the changes to my cluster.
flowchart LR
github["🐙 GitHub Repo"] --> argo["🚀 Argo CD"]
internet["🌍 Internet"] --> cf["☁️ Cloudflare Tunnel"]
subgraph cluster["🧱 Talos Kubernetes Cluster"]
argo
apps["📦 Apps"]
infra["🧩 Infrastructure"]
end
argo --> infra
argo --> apps
cf --> infra
infra --> apps
This Git repository contains the following directories.
.
├── 📁 kubernetes/
│ ├── 📁 clusters/homelab/ # Cluster root and top-level Argo CD applications
│ ├── 📁 infra/ # Shared platform services
│ └── 📁 apps/ # User-facing workloads
├── 📁 talos/ # Talos machine config and patches
├── 📁 docs/ # Practical runbooks and notes
└── 📁 linux/ # Local workstation/helper files
While most of my infrastructure and workloads are self-hosted, I do rely upon the cloud for a few key parts of my setup. This keeps the setup simpler and avoids making the cluster responsible for every critical dependency.
| Service | Use | Cost |
|---|---|---|
| Cloudflare | Domain, DNS, Zero Trust Tunnel | ~€22/yr |
| Bitwarden Secrets Manager | External secret source for Kubernetes | ~€18/yr |
| SMTP2GO | Outbound email delivery for cluster apps | Free |
| GitHub | Git hosting and Argo CD source of truth | Free |
| Total: ~€3.35/mo |
This cluster currently runs on two small-form-factor nodes.
| Hardware | Model | CPU | GPU | Memory | Storage |
|---|---|---|---|---|---|
| K8s Node 1 | MINIS FORUM UN1245 Mini-PC | Intel Core i5-12450H | Intel UHD Graphics | 16 GB DDR4 RAM | 512 GB SSD |
| K8s Node 2 | Blackview MP-80 | Intel Processor N97 | Intel UHD Graphics | 16 GB DDR5 RAM | 512 GB SSD |
| Router | UniFi Express 7 (UX7) | - | - | - | - |
| Switch | 2.5 Gbps switch | - | - | - | - |
- Kubernetes Inventory
- Talos Runbook
- Bitwarden External Secrets Bootstrap
- Longhorn Notes
- Kubernetes Layout Notes
- VolSync Restic Notes
- Garage Notes
- Linux Init Notes
- Renovate Config
Star ⭐ this repo if you found it useful.
