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
- cube2, cube3 – worker nodes
The network layout includes:
- MetalLB IP pool:
10.0.0.25 – 10.0.0.49
- NFS Server:
10.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!