About

I run a small bare metal Kubernetes cluster for various experiments in storage and networking.

As of this writing in 2025, the homelab environment is made up of four diskless Raspberry Pi 4 nodes connected to a shared NAS over iSCSI. All nodes share the same network switch, which incidentally is just large enough to function as a stand for the nodes. A home router provides a TFTP server for network booting.

A stack of Raspberry Pi machines on top of a network switch next to two NASes
The homelab, roughly 10 minutes before a bad kernel update took out a node.

Configuration

The raspberry-pi-netboot repository contains the necessary scripts and Packer template to configure a Raspberry Pi for diskless operation. k8s-ansible-rpi is an Ansible playbook for provisioning Kubernetes clusters on a fleet of Raspberry Pi machines. A Git repository hosted on a separate NAS contains Helm charts and YAML manifests for cluster components.

Networking

The Kubernetes cluster supports IPv4/IPv6 dual-stack networking using Cilium. All LoadBalancer services receive IPv6 addresses from a shared pool. To expose these services to the public internet, each node peers with the home router using BGP; the router itself runs a BIRD instance for peering. All homelab traffic is on a separate VLAN and IP address space to ensure it is isolated from personal devices.

Storage

Pods that require persistent volumes use iSCSI LUNs manually provisioned on the same NAS the Raspberry Pi nodes use for storage. All pods use CHAP for mutual authentication with the iSCSI target.

Back