Skip to content

Home Kubernetes Cluster

Part 1: Overview and Goals

As a homelab enthusiast, I’ve always looked for ways to refine my infrastructure. After running Docker Swarm successfully for a while, I decided it was time to move on to something more powerful. Kubernetes was the obvious next step—but setting up and managing a full-blown k8s cluster can be overkill for a home setup. That’s where k3s came in.

In this blog series, I’ll walk you through how I transitioned from Docker Swarm to a full-featured, self-hosted k3s cluster on Ubuntu Server. We’ll integrate tools like MetalLB for LoadBalancer IPs, Longhorn for dynamic storage provisioning, NFS for media storage, and Portainer for a clean visual interface. All while maintaining cost-effectiveness and maximizing existing hardware.


Goal of the Series

The main objective of this series is to document how I:

  • Set up a lightweight Kubernetes cluster using k3s
  • Use MetalLB to expose services with static IPs
  • Implement Longhorn for persistent app/config storage
  • Mount an NFS share for media storage
  • Use Portainer to manage deployments and resources
  • Deploy apps like WordPress, Plex, Kavita, and more
  • Use Cloudflare Tunnel to expose select apps to the internet securely

All of this will be presented with step-by-step instructions and example YAML files so you can replicate or adapt the setup for your own homelab.


Hardware Overview

Here’s what I’m working with:

  • Proxmox Host: Minisforum MS-01
    • CPU: Intel Core i9 with 20 cores
    • RAM: 96 GB
    • Storage: 1 TB NVMe SSD dedicated to Proxmox
  • Storage:
    • TrueNAS VM running on Proxmox with passthrough
    • 2x 2TB drives in a ZFS mirror pool
    • NFS exports are shared from TrueNAS to the Kubernetes cluster

With this setup, I can run multiple VMs and containers while keeping data separated and resilient.


Network Topology and Services (Preview)

The k3s cluster consists of 3 nodes:

  • cube1 – master node
  • cube2cube3 – worker nodes

The network layout includes:

  • MetalLB IP pool: 10.0.0.25 – 10.0.0.49
  • NFS Server10.0.0.3:/mnt/tank/data
  • Traefik as the default ingress controller
  • Portainer exposed via MetalLB
  • Longhorn providing dynamic PVCs

Coming up next, we’ll walk through installing Ubuntu Server, prepping the nodes, and getting them ready for k3s installation.


Next Post: Installing Ubuntu and Preparing the Nodes

In the next part, we’ll cover:

  • Ubuntu Server install and network config
  • Setting static IPs and hostnames
  • Installing basic tools and SSH setup

Stay tuned!

Published inKubernetes