K3s on a Low-Power Home Server
Not every workload needs a beefy server. Some things just need to run 24/7 on minimal power.
I have a small, low-power box dedicated to “always-on” services. It’s not a powerhouse, but it needs to be reliable. K3s — the lightweight Kubernetes distribution — is perfect for this.
The Use Case
This server hosts lifecycle services that need constant uptime but don’t require massive compute:
- VS Code Server - Remote IDE access from anywhere
- Uptime Kuma - Monitoring and alerting
- Mosquitto - MQTT broker for IoT sensors
- Zigbee2MQTT - Home automation bridge
Total resource usage: under 5GB RAM for all of it.
Installation
Single-node K3s cluster with a few custom flags:
curl -sfL https://get.k3s.io | sh -s - server \
--disable traefik \
--node-name homeserver \
--write-kubeconfig-mode 644
Why disable Traefik?
I prefer managing my own Ingress Controller (Nginx or a custom gateway) to integrate with Cloudflare Tunnels for external access.
GitOps with Flux
No manual kubectl apply commands. That leads to configuration drift.
Instead, I use Flux CD:
- Commit a change to the infrastructure repo
- Flux (running on the server) detects the commit
- Flux pulls changes and reconciles cluster state
If the hardware dies, I provision a new box, install K3s, bootstrap Flux, and the entire stack rebuilds itself from Git. No manual intervention.
Storage
Single-node means simple storage. I use the built-in local-path-provisioner for persistent volumes.
Backups are handled by Restic, sending snapshots to the NAS nightly.
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: vscode-data
spec:
accessModes:
- ReadWriteOnce
storageClassName: local-path
resources:
requests:
storage: 10Gi
Current Status
- Uptime: 42 days
- Pods: 14 running
- Memory: 4.2GB / 16GB used
- Power draw: ~35W
It sits in a closet, runs silently, and just works.
Why K3s Over Docker Compose?
For simple services, Docker Compose works fine. But K3s gives me:
- Declarative config - Everything in YAML, version controlled
- Self-healing - Crashed pods restart automatically
- GitOps - Flux keeps state in sync with Git
- Future-proofing - Easy to add nodes later if needed
The learning curve is steeper, but the operational overhead is lower once it’s running.
For always-on services that don’t need much power, K3s on a small box is hard to beat.