prateekjaindev/homelab

Three-node HA Kubernetes homelab on Talos Linux: Cilium, Gateway API, cert-manager, Cloudflare Tunnel, Tailscale. Companion repo for the blog series.

24

10 commits

updated Oct 15, 2026

See the code

See what people are saying

SourceMessageScoreDate

Sidero Omni’s hobby plan is free now. Here’s how to move your existing Talos cluster to it (r/homelab)

https://preview.redd.it/o12w9wzppqvh1.png?width=1600&format=png&auto=webp&s=a6de07246491d75800fbc54f697079b90752dd92 Omni’s hobby plan is free now: up to 10 nodes and 2 users (it used to be $10 a month for 6 nodes). Nodes dial out over WireGuard, so nothing is open on the router, and you get…

0

Oct 16, 2026

Tailscale on Talos Linux: Secure Remote Access to a Kubernetes Homelab (r/homelab)

I run a 3-node Talos Kubernetes cluster at home, and until recently it only worked when I was at home too. So I added Tailscale to reach it from anywhere. Tailscale runs on the nodes themselves, and the tailnet can only reach the cluster, not the rest of my home network. kubectl and the lab apps…

0

Oct 12, 2026

Networking a 3-Node Kubernetes Homelab with Cilium, Gateway API and Cloudflare Tunnel (r/devops)

Part 2 of my Talos homelab (3 OptiPlex Micros, all control planes). Part 1 got the cluster up, this one is networking. I moved the running cluster from Flannel + kube-proxy to Cilium without rebuilding it. The default-deny policy that Flannel quietly ignored is now actually enforced, and Hubble…

23

Oct 10, 2026

README

Homelab

Cybertron: a three-node, highly available Kubernetes cluster on Talos Linux, with Cilium, cert-manager, Cloudflare Tunnel and Tailscale

validate Talos 1.14 Kubernetes 1.36 Cilium 1.20 License: MIT Blog

Commands and manifests for Cybertron, a three-node Talos Linux Kubernetes cluster on refurbished mini PCs, as built in the blog series. Each folder matches one part.

It's a cluster to break on purpose: networking, storage, observability, GitOps, upgrades and node failures on real machines, real Ethernet and real disks, without paying for cloud resources or breaking an environment someone else depends on.

PartPostFolder
1. A highly available cluster with Talos LinuxBuilding a 3-Node Highly Available Kubernetes Homelab with Talos Linuxtalos/
2. Networking: Cilium, Gateway API, cert-manager, Cloudflare TunnelNetworking a 3-Node Kubernetes Homelab with Cilium, Gateway API and Cloudflare Tunnelnetworking/
3. Remote access with TailscaleTailscale on Talos Linux: Secure Remote Access to a Kubernetes Homelabtailscale/
4. Storageplanned

The cluster

Cybertron: kubectl reaches the API through a virtual IP, talosctl talks to each node, etcd runs on all three, and the API survives one node powering off

Three identical machines, all control planes, all running workloads:

NodeAddressRole
optimus192.168.1.111Control plane, etcd, workloads
bumblebee192.168.1.112Control plane, etcd, workloads
ratchet192.168.1.113Control plane, etcd, workloads
  • Kubernetes API VIP: https://192.168.1.200:6443. Talos moves it to a healthy control plane, so kubectl doesn't depend on any one machine.
  • etcd: three members, quorum two. One node can go down; two can't.
  • No SSH: Talos is immutable and managed through its API. talosctl talks to each node's own IP (machine: config, disks, logs, upgrades); kubectl talks to the Kubernetes API through the VIP.
  • Node addresses come from DHCP reservations on the router. The VIP and the LoadBalancer range are reserved too, so DHCP never hands them to another device.

Hardware

Each node
MachineDell OptiPlex Micro (refurbished)
CPUIntel Core i5, 8th gen
Memory8 GB DDR4
Disk256 GB SATA SSD
NetworkWired Ethernet to the home router

Lenovo ThinkCentre Tiny or HP EliteDesk/ProDesk Mini machines work the same way; nothing here depends on Dell.

Networking

Two front doors into Cybertron: public apps through Cloudflare Tunnel and the public Gateway, lab apps on the LAN through the internal Gateway, and lab names unreachable from the internet

Cilium is the CNI and replaces kube-proxy. Apps are reached through one of two Gateways, and the route's parentRef decides which:

Lab appsPublic apps
Names<app>.lab.prateek.cloud<app>.prateek.cloud
Reached fromThe home LAN onlyThe internet
PathLAN → 192.168.1.201 → Gateway internal → podsCloudflare edge → tunnel → cloudflared ×2 → Gateway public → pods
TLSLet's Encrypt wildcard from cert-manager (DNS-01, so no inbound access needed)Cloudflare's edge certificate
  • LoadBalancer IPs: Cilium LB IPAM hands out 192.168.1.201–205, and L2 announcements make one node answer ARP for each IP (it moves if that node goes down).
  • No open ports at home: public traffic arrives through one shared Cloudflare Tunnel that the cluster opens from the inside.
  • NetworkPolicy is enforced (it wasn't with Flannel), and Hubble shows every flow and drop.

Details and the full migration from Flannel: networking/.

Remote access

Five routes from anywhere: the phone and laptop reach the Gateway and the Kubernetes API through the tailnet and the active node; addresses that aren't routed stay unreachable; when the active node reboots another node takes over

Tailscale runs on all three nodes as a Talos system extension, so kubectl, talosctl and the lab apps work from anywhere with the same addresses, certificates, kubeconfig and talosconfig as at home.

  • Five /32 routes, not the LAN: the three node addresses (Talos API), the API VIP 192.168.1.200 and the internal Gateway 192.168.1.201. The router, phones and everything else on the network stay unreachable.
  • High availability: every node advertises the same routes; one is active and another takes over when it goes down.
  • Access policy: members of the tailnet reach only ports 80/443 on the Gateway, 6443 on the VIP and 50000 on the nodes. The nodes are tagged devices with no key expiry, and the auth key is revoked after they join.
  • No open ports at home, and the Talos API stays reachable even when Kubernetes is down.

Details, the gotchas (node IPs, Cilium MTU, extension config before the upgrade) and the failover test: tailscale/.

Versions

ComponentVersion
Talos Linux1.14.0
Kubernetes1.36.3
Cilium1.20.2
Gateway API CRDsv1.6.1
cert-managerv1.21.2
cloudflared2026.10.0
Tailscale (Talos extension)1.102.2

What's next

  • Storage: a Talos user volume on each node's SSD and Longhorn for replicated volumes.
  • Later: observability (Prometheus, Grafana), GitOps with Argo CD, backups, and security tooling.

Repository layout

PathWhat
talos/Part 1: install, bootstrap and validate the Talos cluster
networking/Part 2: Cilium, LB IPAM, Gateways, cert-manager, Cloudflare Tunnel, demo app and tests
tailscale/Part 3: Tailscale extension, subnet routes, access policy, failover
assets/Diagrams used in this README
.github/workflows/CI on every push: yamllint, kubeconform (Kubernetes 1.36 and the CRDs used), gitleaks, link check

Replace the domain and 192.168.1.x addresses with your own. Credentials never go in this repository: generated Talos configuration, talosconfig, kubeconfig, API tokens and tunnel credentials stay local (see .gitignore) or in Kubernetes Secrets created by hand.

License

MIT. Use, copy and adapt anything here for your own lab.

Follow the series

For the next parts, follow along on blog.prateekjain.dev, X (@PrateekJainDev) or LinkedIn (in/prateekjaindev).

bare-metal
cert-manager
cilium
cloudflare-tunnel
gateway-api
homelab
kubernetes
tailscale
talos

prateekjaindev/homelab

Three-node HA Kubernetes homelab on Talos Linux: Cilium, Gateway API, cert-manager, Cloudflare Tunnel, Tailscale. Companion repo for the blog series.

24

10 commits

updated Oct 15, 2026

See the code

See what people are saying

SourceMessageScoreDate

Sidero Omni’s hobby plan is free now. Here’s how to move your existing Talos cluster to it (r/homelab)

https://preview.redd.it/o12w9wzppqvh1.png?width=1600&format=png&auto=webp&s=a6de07246491d75800fbc54f697079b90752dd92 Omni’s hobby plan is free now: up to 10 nodes and 2 users (it used to be $10 a month for 6 nodes). Nodes dial out over WireGuard, so nothing is open on the router, and you get…

0

Oct 16, 2026

Tailscale on Talos Linux: Secure Remote Access to a Kubernetes Homelab (r/homelab)

I run a 3-node Talos Kubernetes cluster at home, and until recently it only worked when I was at home too. So I added Tailscale to reach it from anywhere. Tailscale runs on the nodes themselves, and the tailnet can only reach the cluster, not the rest of my home network. kubectl and the lab apps…

0

Oct 12, 2026

Networking a 3-Node Kubernetes Homelab with Cilium, Gateway API and Cloudflare Tunnel (r/devops)

Part 2 of my Talos homelab (3 OptiPlex Micros, all control planes). Part 1 got the cluster up, this one is networking. I moved the running cluster from Flannel + kube-proxy to Cilium without rebuilding it. The default-deny policy that Flannel quietly ignored is now actually enforced, and Hubble…

23

Oct 10, 2026

README

Homelab

Cybertron: a three-node, highly available Kubernetes cluster on Talos Linux, with Cilium, cert-manager, Cloudflare Tunnel and Tailscale

validate Talos 1.14 Kubernetes 1.36 Cilium 1.20 License: MIT Blog

Commands and manifests for Cybertron, a three-node Talos Linux Kubernetes cluster on refurbished mini PCs, as built in the blog series. Each folder matches one part.

It's a cluster to break on purpose: networking, storage, observability, GitOps, upgrades and node failures on real machines, real Ethernet and real disks, without paying for cloud resources or breaking an environment someone else depends on.

PartPostFolder
1. A highly available cluster with Talos LinuxBuilding a 3-Node Highly Available Kubernetes Homelab with Talos Linuxtalos/
2. Networking: Cilium, Gateway API, cert-manager, Cloudflare TunnelNetworking a 3-Node Kubernetes Homelab with Cilium, Gateway API and Cloudflare Tunnelnetworking/
3. Remote access with TailscaleTailscale on Talos Linux: Secure Remote Access to a Kubernetes Homelabtailscale/
4. Storageplanned

The cluster

Cybertron: kubectl reaches the API through a virtual IP, talosctl talks to each node, etcd runs on all three, and the API survives one node powering off

Three identical machines, all control planes, all running workloads:

NodeAddressRole
optimus192.168.1.111Control plane, etcd, workloads
bumblebee192.168.1.112Control plane, etcd, workloads
ratchet192.168.1.113Control plane, etcd, workloads
  • Kubernetes API VIP: https://192.168.1.200:6443. Talos moves it to a healthy control plane, so kubectl doesn't depend on any one machine.
  • etcd: three members, quorum two. One node can go down; two can't.
  • No SSH: Talos is immutable and managed through its API. talosctl talks to each node's own IP (machine: config, disks, logs, upgrades); kubectl talks to the Kubernetes API through the VIP.
  • Node addresses come from DHCP reservations on the router. The VIP and the LoadBalancer range are reserved too, so DHCP never hands them to another device.

Hardware

Each node
MachineDell OptiPlex Micro (refurbished)
CPUIntel Core i5, 8th gen
Memory8 GB DDR4
Disk256 GB SATA SSD
NetworkWired Ethernet to the home router

Lenovo ThinkCentre Tiny or HP EliteDesk/ProDesk Mini machines work the same way; nothing here depends on Dell.

Networking

Two front doors into Cybertron: public apps through Cloudflare Tunnel and the public Gateway, lab apps on the LAN through the internal Gateway, and lab names unreachable from the internet

Cilium is the CNI and replaces kube-proxy. Apps are reached through one of two Gateways, and the route's parentRef decides which:

Lab appsPublic apps
Names<app>.lab.prateek.cloud<app>.prateek.cloud
Reached fromThe home LAN onlyThe internet
PathLAN → 192.168.1.201 → Gateway internal → podsCloudflare edge → tunnel → cloudflared ×2 → Gateway public → pods
TLSLet's Encrypt wildcard from cert-manager (DNS-01, so no inbound access needed)Cloudflare's edge certificate
  • LoadBalancer IPs: Cilium LB IPAM hands out 192.168.1.201–205, and L2 announcements make one node answer ARP for each IP (it moves if that node goes down).
  • No open ports at home: public traffic arrives through one shared Cloudflare Tunnel that the cluster opens from the inside.
  • NetworkPolicy is enforced (it wasn't with Flannel), and Hubble shows every flow and drop.

Details and the full migration from Flannel: networking/.

Remote access

Five routes from anywhere: the phone and laptop reach the Gateway and the Kubernetes API through the tailnet and the active node; addresses that aren't routed stay unreachable; when the active node reboots another node takes over

Tailscale runs on all three nodes as a Talos system extension, so kubectl, talosctl and the lab apps work from anywhere with the same addresses, certificates, kubeconfig and talosconfig as at home.

  • Five /32 routes, not the LAN: the three node addresses (Talos API), the API VIP 192.168.1.200 and the internal Gateway 192.168.1.201. The router, phones and everything else on the network stay unreachable.
  • High availability: every node advertises the same routes; one is active and another takes over when it goes down.
  • Access policy: members of the tailnet reach only ports 80/443 on the Gateway, 6443 on the VIP and 50000 on the nodes. The nodes are tagged devices with no key expiry, and the auth key is revoked after they join.
  • No open ports at home, and the Talos API stays reachable even when Kubernetes is down.

Details, the gotchas (node IPs, Cilium MTU, extension config before the upgrade) and the failover test: tailscale/.

Versions

ComponentVersion
Talos Linux1.14.0
Kubernetes1.36.3
Cilium1.20.2
Gateway API CRDsv1.6.1
cert-managerv1.21.2
cloudflared2026.10.0
Tailscale (Talos extension)1.102.2

What's next

  • Storage: a Talos user volume on each node's SSD and Longhorn for replicated volumes.
  • Later: observability (Prometheus, Grafana), GitOps with Argo CD, backups, and security tooling.

Repository layout

PathWhat
talos/Part 1: install, bootstrap and validate the Talos cluster
networking/Part 2: Cilium, LB IPAM, Gateways, cert-manager, Cloudflare Tunnel, demo app and tests
tailscale/Part 3: Tailscale extension, subnet routes, access policy, failover
assets/Diagrams used in this README
.github/workflows/CI on every push: yamllint, kubeconform (Kubernetes 1.36 and the CRDs used), gitleaks, link check

Replace the domain and 192.168.1.x addresses with your own. Credentials never go in this repository: generated Talos configuration, talosconfig, kubeconfig, API tokens and tunnel credentials stay local (see .gitignore) or in Kubernetes Secrets created by hand.

License

MIT. Use, copy and adapt anything here for your own lab.

Follow the series

For the next parts, follow along on blog.prateekjain.dev, X (@PrateekJainDev) or LinkedIn (in/prateekjaindev).

bare-metal
cert-manager
cilium
cloudflare-tunnel
gateway-api
homelab
kubernetes
tailscale
talos