Building my own K3s cluster — Part 1. First published on LinkedIn on 28 September 2025. Part 2 picks up eleven months later, with three control planes, a rack, and a six-day outage nobody noticed.
Over the past weeks I embarked on the journey of building my own Kubernetes cluster at home — not for fun, but as the foundation for my upcoming IoT architecture project.
Originally I was considering forming a Proxmox cluster on a server I already have. However, I realised that would require more space, more networking, and extra setup. At that moment I asked myself: why not build something lighter, scalable, and more aligned with my IoT goals?
That is when Kubernetes — K3s specifically — came to mind. With just a few old mini PCs I figured I could get started with limited resources and scale later as the project grows.
The hardware, and what it cost
I went for second-hand office machines rather than anything purpose-built:
- 3 × HP EliteDesk 800 G3 Mini PCs, 8 GB RAM — about $140 on eBay
- 3 × 256 GB NVMe SSDs — $48 total, eBay
- 3 × 90 W power supplies — $40, Amazon
- 6 × CR2032 CMOS batteries — $12, Walmart
Total: $240.
Second-hand hardware always fights back first
As always with used equipment, the issues came before the software did.
The machines would not boot. All three gave the dreaded three red beeps and four white flashes. The problem was the power supplies: I had bought 65 W units, and these machines require 90 W. Once the correct supplies arrived, they booted flawlessly.
The BIOS was full of errors. The CMOS batteries were dead, which explained most of them. Beyond that, the settings were inconsistent across the three machines — some would not boot from USB, others would not recognise the NVMe at all. A full reset and reconfiguration cleared every one of them.
Then the install. Ubuntu Server 24.04.3 LTS on all three. While they were open I cleaned them out and reapplied premium thermal paste, and tuned the BIOS on each for performance.
That left three clean, stable Ubuntu nodes, all reachable over SSH.
Installing K3s
With the hardware finally cooperating, the cluster itself took minutes.
On the master node at 192.168.30.10:
curl -sfL https://get.k3s.io | sh -
sudo systemctl status k3s
Then retrieve the join token, which the workers need:
sudo cat /var/lib/rancher/k3s/server/node-token
On each worker — 192.168.30.11 and 192.168.30.12 — point the installer at the master and hand it that token:
curl -sfL https://get.k3s.io | K3S_URL="https://192.168.30.10:6443" \
K3S_TOKEN="<the token from the master>" sh -
sudo systemctl status k3s-agent
And from the master, the moment it all pays off:
sudo k3s kubectl get nodes -o wide
All three nodes show Ready — one master, two workers.
Why this matters
This might sound like just a homelab project, but for me it is step one toward a scalable IoT solution: a single architecture that starts lean and grows as resources and requirements expand.
Next up is deploying real workloads, services and IoT components on top of it — networking with VLANs and the UniFi gateway, monitoring, and Rancher.
Those all arrived, along with a great deal I did not plan for. Part 2 is here.