Homelab
Starting the homelab
I found an old mini PC (ASUS Mini PC PN30), left in a drawer from when I thought I needed it to run a Plex media server. With a sudden (unexpected) burst of motivation I decided to run a local kubernetes cluster on it. (In hindsight, I think I might also have been inspired to try self-hosting an RSS reader by this post. I just got distracted, by deciding to self-host using kubernetes).
Making a plan
I asked ChatGPT and Claude for help on how to set up a simple kubernetes setup at home.
After some back-and-forth I landed on installing Debian with no graphical desktop environment, and then installing k3s
.
The choice of k3s
was mainly made to limit the resource requirements. The Mini PC is not exactly beefy, with an underpowered CPU and only 4GB RAM (While trying to confirm this number, I found the listing for this on Amazon and it claims that I can upgrade to 8GB RAM. I might do that at some point).
Install Debian
I downloaded an ISO of Debian 12 and made a bootable usb.
I connected the Mini PC to a monitor, keyboard and mouse and booted the Debian installer from the usb stick.
I selected graphical installer and followed the guidance.
I did not create a root user, instead letting my own user get sudo privileges.
I did not install a desktop environment.
I gave it the hostname tyr
.
I made sure to select SSH, to allow access after I unplug the peripherals.
Install tools
I tried accessing the mini PC over shh from my desktop.
This did not work, but using the local IP directly works fine.
I really want to use the hostname.local
thing, I learned that it is called mDNS, and I need a mDNS service.
I installed Avahi, both on my desktop and on the Mini PC
Install k3s
Now, to install k3s
. Following docs at https://k3s.io/.
After a minute, the kubernetes cluster is running and I can query it from tyr
$ sudo k3s kubectl get node
NAME STATUS ROLES AGE VERSION
tyr Ready control-plane,master 15h v1.31.4+k3s1
Next, I want to access it from my desktop.
Following the k3s guide I copy /etc/rancher/k3s/k3s.yaml
from tyr
to ~/.kube/config
my desktop with scp
, and edit the server
field to point to IP of tyr
.
I tried a lot get tyr.local
to resolve instead of the IP, but as far as I can tell, kubectl
is not using the mDNS stuff from above.
Here is the last chat message (in a long back-and-forth) from o1
on why .local
does not work.
A statically compiled binary often does not use the system's usual NSS (Name Service Switch) mechanisms—like
/etc/nsswitch.conf
andlibnss-mdns
—for hostname resolution. Instead, it typically performs "pure DNS" lookups.That explains why:
- ping tyr.local succeeds, because it honors
nsswitch.conf
and uses Avahi/mDNS.- kubectl fails on
tyr.local
, because it bypasses your local mDNS setup and tries querying a DNS server that doesn't know about.local
names.'
ChatGPT suggest some ways to fix it, but the simplest seemed to be to just plug in the IP.
I made sure to go to my router and reserve the local IP address of tyr
, so it does not change after a reboot or something.
And finally, I can run the following from my desktop