K3s Homelab¶
Three-node Kubernetes homelab running on physical HP T630 machines. All nodes are k3s servers, control-plane nodes, etcd members and workload nodes.
Hardware¶
| Node | Address | Roles | Hardware |
|---|---|---|---|
master |
192.168.55.10 |
control-plane, etcd, workloads | HP T630, 8 GB RAM, 128 GB SSD |
worker1 |
192.168.55.11 |
control-plane, etcd, workloads | HP T630, 8 GB RAM, 128 GB SSD |
worker2 |
192.168.55.12 |
control-plane, etcd, workloads | HP T630, 8 GB RAM, 128 GB SSD |
The node names are historical. master, worker1 and worker2 have the same Kubernetes roles.
HAProxy runs in an LXC container on the Proxmox server and uses 192.168.0.45.
Traffic paths¶
Kubernetes API:
Application traffic:
client
โ HAProxy:80/443
โ node:80/443
โ K3s ServiceLB / klipper-lb
โ Service/traefik
โ Traefik Pod
โ application Pod
HAProxy forwards API and HTTPS traffic in TCP mode. Traefik terminates application TLS and performs HTTP routing.
Current platform¶
State as of 2026-09-29, incorporating the Day 33 monitoring update.
| Area | Component | Current role |
|---|---|---|
| Host OS | Ubuntu 24.04.5 LTS |
Kernel 6.8.0-139-generic |
| Container runtime | containerd 2.3.4-k3s1.36 |
Runtime on all three K3s servers |
| Kubernetes | K3s v1.36.4+k3s1 |
Kubernetes distribution and embedded etcd |
| External entry point | HAProxy | Selects an API server or ingress node |
| CNI | Cilium v1.20.2 |
Pod networking, NetworkPolicy and VXLAN transport |
| Service dataplane | kube-proxy and Cilium | iptables for tested host traffic; eBPF for tested Pod traffic |
| Ingress | Traefik 3.7.8 |
TLS termination and L7 routing |
| Bare-metal LoadBalancer | K3s ServiceLB | Exposes Traefik on node ports 80/443 |
| TLS | cert-manager v1.21.2 |
Let's Encrypt certificates through DNS-01 |
| Storage | Longhorn v1.12.1 |
Replicated persistent volumes |
| GitOps | Flux v2.9.5 |
Reconciliation and image automation |
| Secrets | Sealed Secrets v0.40.0 |
Encrypted secrets stored in Git |
| Resource metrics | metrics-server v0.9.0 |
Metrics API for kubectl top and HPA |
| Monitoring | kube-prometheus-stack 91.8.1 |
Prometheus, Grafana and Alertmanager |
| Logging | Loki 3.7.6, Alloy 1.19.2 |
Central log collection |
| Databases | CloudNativePG 1.30.0, PostgreSQL 17.4 |
Two instances per production and staging database |
| Object storage | Garage v2.2.0 on Logos |
S3 storage for Loki and Longhorn backups |
| Firewall | UFW managed with Ansible | Restricts node access and cluster ports |
Network state¶
Cilium uses Kubernetes IPAM:
Each node receives its own /24 PodCIDR from k3s:
Repositories¶
- homelab โ this documentation and the Polish journal.
- k3s-homelab โ Flux manifests and Kubernetes desired state.
- homelab-ansible playbooks โ host configuration, firewall and cluster power lifecycle.
- clients-api โ Spring Boot application, Helm chart and CI pipeline.
- k8s-badge โ lightweight cluster-status API and SVG badge.
Flux is the source of truth for Kubernetes resources managed by the repository. Ansible owns host-level configuration. Built-in k3s components remain managed by k3s unless explicitly stated otherwise.
Documentation map¶
| File | Scope |
|---|---|
| Cluster architecture | Nodes, control plane, etcd and API access |
| Networking | Cilium, kube-proxy, Service datapath and NetworkPolicy |
| Ingress and TLS | HAProxy, ServiceLB, Traefik, Ingress and certificates |
| Storage | Longhorn, StorageClasses and volume operations |
| GitOps | Flux structure and deployment workflow |
| Security | UFW, Sealed Secrets and time synchronization |
| Observability | Metrics, logs, alerts and Hubble |
| Backup | etcd, volume and sealing-key recovery |
| Applications | clients-api, k8s-badge and delivery workflow |
The files above describe the current state. Migration history, incidents and experiments are kept in the journal.
Each Kubernetes learning session produces a Polish journal entry. A reusable failure and its verified solution may also become a troubleshooting article. The state documentation is updated only when the current architecture or operating procedure changes.