Je hebt geen cloud provider nodig om Kubernetes te draaien. Je hebt geen dure servers nodig. Je hebt drie mini-PCs en een middag nodig.
Dit is hoe ik mijn homelab cluster bouwde — hetzelfde cluster dat mijn GitLab, monitoring, home automation, en alles wat ik weiger toe te vertrouwen aan andermans computer draait.
Waarom K3s?
K3s is Kubernetes, vereenvoudigd:
- Single binary — ~70MB, bevat alles
- Low resource — Draait op Raspberry Pi, draait geweldig op mini-PCs
- Production ready — Dezelfde API, dezelfde workloads, minder overhead
- Batteries included — Ingebouwde ingress, load balancer, storage
Het is geen “Kubernetes lite.” Het is Kubernetes zonder de enterprise rommel.
Hardware Selectie
De Sweet Spot: Refurbished Mini-PCs
Ik raad refurbished business mini-PCs aan:
| Wat | Waarom |
|---|---|
| HP EliteDesk 800 G3 | Betrouwbaar, goedkoop, beschikbaar |
| Lenovo ThinkCentre M720q | Goede thermals, stil |
| Dell OptiPlex 3060 Micro | Goede uitbreidingsopties |
Doel specs per node:
- CPU: Intel i5 6e-8e gen (4-6 cores)
- RAM: 16-32GB (DDR4 upgradeable)
- Storage: 256GB+ NVMe/SSD
- Netwerk: Gigabit Ethernet
Kosten: €100-200 per node. Drie nodes voor €300-600.
Waarom Geen Raspberry Pi?
Pis werken, maar:
- ARM compatibiliteitsproblemen met sommige images
- SD kaart corruptie is veelvoorkomend
- Beperkt RAM (8GB max op Pi 4)
- USB-attached storage is lastig
Mini-PCs geven je x86, NVMe, echt RAM, en daadwerkelijke betrouwbaarheid.
Mijn Cluster
Node 1: HP EliteDesk 800 G3 Mini
i5-7500T, 32GB RAM, 512GB NVMe
Rol: Control plane + Worker
Node 2: HP EliteDesk 800 G3 Mini
i5-7500T, 32GB RAM, 512GB NVMe
Rol: Control plane + Worker
Node 3: HP EliteDesk 800 G3 Mini
i5-7500T, 16GB RAM, 256GB NVMe
Rol: Control plane + Worker
Totaal: ~€450, 12 cores, 80GB RAM, 1.2TB storage.
Netwerk Setup
Statische IPs of DHCP Reserveringen
Elke node heeft een voorspelbaar IP nodig:
192.168.1.10 k3s-node-1
192.168.1.11 k3s-node-2
192.168.1.12 k3s-node-3
192.168.1.100 k3s-api # VIP voor API server
DNS Entries
Voeg toe aan je lokale DNS (of /etc/hosts als het moet):
192.168.1.10 k3s-node-1.home.lan
192.168.1.11 k3s-node-2.home.lan
192.168.1.12 k3s-node-3.home.lan
192.168.1.100 k3s.home.lan
OS Installatie
Optie 1: Ubuntu Server (Makkelijkst)
Installeer Ubuntu Server 22.04 LTS minimal:
# Na installatie, update
sudo apt update && sudo apt upgrade -y
# Installeer handige tools
sudo apt install -y curl wget vim htop
# Disable swap (vereist voor Kubernetes)
sudo swapoff -a
sudo sed -i '/ swap / s/^/#/' /etc/fstab
Optie 2: Talos Linux (Meest Veilig)
Voor een echt immutable setup, gebruik Talos Linux. Maar dat is een apart onderwerp — Ubuntu werkt prima om te beginnen.
K3s Installatie
Initialiseer Eerste Node (HA Mode)
# Op node 1
curl -sfL https://get.k3s.io | sh -s - server \
--cluster-init \
--tls-san k3s.home.lan \
--tls-san 192.168.1.100 \
--disable traefik \
--disable servicelb
Flags uitgelegd:
--cluster-init: Enable embedded etcd voor HA--tls-san: Voeg SANs toe voor API toegang--disable traefik: We installeren onze eigen ingress--disable servicelb: We gebruiken MetalLB
Haal het token op voor joining nodes:
sudo cat /var/lib/rancher/k3s/server/node-token
Join Extra Control Plane Nodes
# Op node 2 en 3
curl -sfL https://get.k3s.io | sh -s - server \
--server https://192.168.1.10:6443 \
--token <TOKEN_VAN_NODE_1> \
--tls-san k3s.home.lan \
--tls-san 192.168.1.100 \
--disable traefik \
--disable servicelb
Verifieer Cluster
# Haal kubeconfig op
sudo cat /etc/rancher/k3s/k3s.yaml
# Kopieer naar je workstation, update server URL
export KUBECONFIG=~/.kube/k3s-config
# Check nodes
kubectl get nodes
NAME STATUS ROLES AGE VERSION
k3s-node-1 Ready control-plane,etcd,master 5m v1.28.5+k3s1
k3s-node-2 Ready control-plane,etcd,master 3m v1.28.5+k3s1
k3s-node-3 Ready control-plane,etcd,master 2m v1.28.5+k3s1
High Availability Setup
API Server Load Balancing
Met 3 control plane nodes heb je een VIP of load balancer nodig. Opties:
Optie A: kube-vip (Aanbevolen)
# Op elke control plane node
kubectl apply -f https://kube-vip.io/manifests/rbac.yaml
# Maak kube-vip manifest
cat <<EOF | sudo tee /var/lib/rancher/k3s/server/manifests/kube-vip.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: kube-vip
namespace: kube-system
spec:
selector:
matchLabels:
app: kube-vip
template:
metadata:
labels:
app: kube-vip
spec:
hostNetwork: true
tolerations:
- key: node-role.kubernetes.io/control-plane
operator: Exists
effect: NoSchedule
containers:
- name: kube-vip
image: ghcr.io/kube-vip/kube-vip:latest
args:
- manager
env:
- name: vip_interface
value: eth0
- name: vip_address
value: 192.168.1.100
- name: vip_arp
value: "true"
- name: lb_enable
value: "true"
EOF
Optie B: HAProxy op Router
Als je router het ondersteunt, configureer HAProxy:
frontend k3s-api
bind *:6443
default_backend k3s-servers
backend k3s-servers
balance roundrobin
server node1 192.168.1.10:6443 check
server node2 192.168.1.11:6443 check
server node3 192.168.1.12:6443 check
Essentiële Componenten
MetalLB voor Load Balancer Services
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.14.3/config/manifests/metallb-native.yaml
Configureer IP pool:
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
name: default
namespace: metallb-system
spec:
addresses:
- 192.168.1.200-192.168.1.250
---
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
name: default
namespace: metallb-system
Ingress Controller (Traefik of Nginx)
# Traefik (via Helm)
helm repo add traefik https://traefik.github.io/charts
helm install traefik traefik/traefik \
--namespace traefik \
--create-namespace \
--set service.type=LoadBalancer
Storage (Longhorn)
helm repo add longhorn https://charts.longhorn.io
helm install longhorn longhorn/longhorn \
--namespace longhorn-system \
--create-namespace
Zie mijn Longhorn vs Rook-Ceph vergelijking voor meer.
Kubeconfig voor Remote Access
Kopieer kubeconfig naar je workstation:
# Op node 1
sudo cat /etc/rancher/k3s/k3s.yaml
# Sla lokaal op, edit server URL
# Verander: server: https://127.0.0.1:6443
# Naar: server: https://k3s.home.lan:6443
# Set permissions
chmod 600 ~/.kube/k3s-config
export KUBECONFIG=~/.kube/k3s-config
Onderhoud
K3s Upgraden
# Op elke node, één voor één
curl -sfL https://get.k3s.io | sh -s - server \
# zelfde flags als initiële install
Of gebruik de system-upgrade-controller:
kubectl apply -f https://github.com/rancher/system-upgrade-controller/releases/latest/download/system-upgrade-controller.yaml
etcd Backup
# Handmatige snapshot
k3s etcd-snapshot save --name manual-backup
# Geplande backups (voeg toe aan k3s config)
# /etc/rancher/k3s/config.yaml
etcd-snapshot-schedule-cron: "0 */6 * * *"
etcd-snapshot-retention: 5
Node Onderhoud
# Drain node voor onderhoud
kubectl drain k3s-node-2 --ignore-daemonsets --delete-emptydir-data
# Doe onderhoud...
# Uncordon als klaar
kubectl uncordon k3s-node-2
Veelvoorkomende Problemen
“Unable to connect to server”
Check:
- K3s service draait:
sudo systemctl status k3s - Firewall staat 6443 toe:
sudo ufw status - kubeconfig heeft correcte server URL
Node NotReady
Check:
- Kubelet logs:
sudo journalctl -u k3s -f - Container runtime:
sudo crictl ps - Disk space:
df -h
etcd Problemen
# Check etcd health
sudo k3s etcd-snapshot list
# Forceer nieuw cluster als etcd corrupt (GEVAARLIJK)
# sudo k3s server --cluster-reset
Wat Te Draaien
Zodra je cluster up is:
- GitLab voor code hosting
- Prometheus/Thanos voor monitoring
- ArgoCD voor GitOps
- Home Assistant voor automation
- Nextcloud voor file sync
- Vaultwarden voor wachtwoorden
Alles zelf-gehost, alles onder je controle.
Kosten Vergelijking
| Cloud (3 nodes) | Homelab (3 nodes) | |
|---|---|---|
| Maandelijks | €150-300 | €10-20 (elektriciteit) |
| Jaarlijks | €1800-3600 | €120-240 |
| 3 jaar | €5400-10800 | €360-720 + €450 hardware |
Homelab verdient zichzelf terug in 3-6 maanden.
Waarom Dit Ertoe Doet
Je eigen cluster draaien leert je:
- Hoe Kubernetes echt werkt (niet alleen hoe je het gebruikt)
- Wat er gebeurt als componenten falen
- Echte capacity planning
En je krijgt sovereignty over je infrastructuur. Jouw data, jouw regels, jouw verantwoordelijkheid.
Cloud is prima voor werk. Thuis is voor dingen die ertoe doen.
De beste manier om Kubernetes te begrijpen is het kapot te maken. De beste plek om het kapot te maken is je homelab.
