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:

WatWaarom
HP EliteDesk 800 G3Betrouwbaar, goedkoop, beschikbaar
Lenovo ThinkCentre M720qGoede thermals, stil
Dell OptiPlex 3060 MicroGoede 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:

  1. K3s service draait: sudo systemctl status k3s
  2. Firewall staat 6443 toe: sudo ufw status
  3. kubeconfig heeft correcte server URL

Node NotReady

Check:

  1. Kubelet logs: sudo journalctl -u k3s -f
  2. Container runtime: sudo crictl ps
  3. 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.