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:

  1. Commit a change to the infrastructure repo
  2. Flux (running on the server) detects the commit
  3. 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.