Introducation to my homelab journey

Hi there! I'm Huy, a software engineer passionate about software architecture in general. This post is a reflection on my journey of learning Kubernetes and setting up my own homelab for personal use.

Motivation

  • Curiosity about how to bootstrap and maintain a Kubernetes cluster
  • The need to deploy my own applications
  • A desire to bridge my knowledge gap in networking

The Journey so far

Before delving into my current cluster setup, I’d like to highlight some key steps I’ve gone through on this journey.

Single node cluster on VPS:

  • I started with a single-node cluster on a Debian VM rented from a local VPS provider. This setup was a great starting point — no need to worry about a high-availability control plane or networking between nodes (as would be required in a hybrid cluster).
  • At this stage, I simply cloned an existing template from GitHub and began bootstrapping a cluster based on it.
  • The template included many components whose responsibilities I didn’t fully understand at the time. However, with some basic knowledge of Helm, deployments, pods, etc., I was still able to deploy and run some of my own applications. That said, debugging issues was tough due to gaps in my understanding.

Selfhosted journey

  • I started finding joy in self-hosting applications at home.
  • The first step, of course, was getting a machine to host everything. After exploring several options, I finally decided to buy an HP Elitedesk G5 — it had an affordable price, decent performance, and reasonable power consumption.
  • I installed Proxmox on this machine and began bootstrapping several Debian VMs

Jumping Straight Into a Hybrid Cluster

My next attempt was to build a simple hybrid cluster. The goal was:

  • 1× control plane node on a VPS
  • 2× control plane nodes at home
  • With a lot of knowledge gaps still in place, I spent several days trying to make this setup work. I used Tailscale to connect all the nodes together, and kube-vip (ARP mode) for bootstrapping the load balancer.
  • Eventually, I gave up due to networking issues between the nodes — and to be honest, I didn’t fully understand what kube-vip was even used for at the time.

Docker Compose and Home Networking

  • Shortly after giving up on the hybrid cluster, I decided to start fresh. This time, my goals were:
  • Separate the IP range of my home network (Wi-Fi, PC, laptop, etc.) from the worker network (VMs hosted on Proxmox)
  • Allow remote access to my worker VMs for a friend
  • Ensure the worker network has internet access but cannot access the home network
  • Network ranges:
    • Home network: 192.168.1.1/24
    • Worker network: 10.11.0.1/24

I was able to meet these goals by doing the following:

Network Separation:

  • Set up VLANs — now I just assign a VLAN tag when creating a new VM, and it will be placed in the appropriate network.
  • Used OPNsense as a router and firewall for the worker network.

Remote Access for Friends:

  • Set up a WireGuard VPN to give access to the worker network, integrated with OPNsense to route traffic correctly.
  • Used a free-tier EC2 instance on AWS as the VPN entry point, acting as a bridge for remote access.