Skip to main content

Edge cluster

The edge cluster is the homelab's public-facing Kubernetes cluster. Single-node, single-purpose: terminate inbound traffic from the internet, then forward it to the production cluster over the NetBird mesh using PROXY-protocol-v2 to preserve the real client IP.

Stack

┌──────────────────────────────────┐
│ Public-facing apps + sidecars │ ← docs/apps (the small set)
└──────────────┬───────────────────┘

┌──────────────▼───────────────────┐
│ Platform controllers │
│ Cilium · Envoy · CNPG · cert-mgr│
└──────────────┬───────────────────┘

┌──────────────▼───────────────────┐
│ Talos Linux on a single VM │ ← docs/foundation/talos
└──────────────┬───────────────────┘

┌──────────────▼───────────────────┐
│ Hetzner Cloud (cx33, nbg1) │ ← docs/foundation/hetzner
│ VPC + floating IP │
└──────────────────────────────────┘

Layers at a glance

LayerWhatDoc
Computecx33 Hetzner instance (control-plane-1), nbg1foundation/hetzner
Cluster OSTalos Linux, single-node configfoundation/talos
GitOpsFlux pulling from the same Gitea repo, separate clusters/edge/ pathfoundation/flux
NetworkCilium (CNI + kube-proxy replacement)platform/cilium
IngressEnvoy Gateway terminating TLS; forwards to production via PROXY-protocol-v2platform/envoy-gateway · topics/envoy-gateway-proxy-protocol-v2
Certscert-manager + ACME via cert-manager-webhook-all-inklplatform/cert-manager
DatabaseCNPG (small, only for sidecar app state)platform/cloudnative-pg
Inter-siteNetBird edge peer routes back to production over WireGuardfabric/netbird

Cluster machine

RoleNameSpecNetwork
Control + workercontrol-plane-1cx33, Talos imagePublic IP + floating IP (edge-1); private 172.30.0.11/24

A single node is intentional — the edge cluster's blast radius is its own. If it dies, the production cluster carries on; only public traffic is interrupted.

Networking summary

PlaneWhat
VPCedge (172.30.0.0/16), subnet k8s (172.30.0.0/24 in eu-central)
Public IPFloating IP edge-1 — survives instance replacement
Inter-siteNetBird edge network — control-plane-1 acts as routing peer
Cross-networkedge_sidecar_envoyproduction public subnet for upstream

Cloud firewalls are label-selected: talos-control, talos-internal, allow-http, allow-ssh. See Hetzner for ports.

What runs here

  • Public ingress — the Envoy Gateway that the world hits.
  • TLS termination + ACME — cert-manager + the all-inkl webhook (DNS-01).
  • Sidecar apps that need an internet entry point but back-end state in production (Gatus, Homepage in their public-edge variants).

Apps with persistent state never live here — that's production's job.

Lifecycle commands

# Render & apply Talos config (uses talos/edge/)
talhelper -f talos/edge/talconfig.yaml genconfig
talhelper -f talos/edge/talconfig.yaml gencommand apply | sh

# Reconcile Flux
flux reconcile kustomization flux-system --kubeconfig ~/.kube/edge

# Provision / drift-check the underlying Hetzner resources
cd tofu/environment/edge && tofu plan

Recovery

If the cx33 instance is lost:

  1. tofu apply re-creates the instance with the same name + label set; cloud firewalls reattach automatically.
  2. talhelper gencommand apply pushes the Talos config; the new node bootstraps.
  3. Re-attach the floating IP if it didn't follow.
  4. Flux reconciles everything else from Git.

End-to-end recovery is in the order of minutes — there's nothing stateful on the box that can't be regenerated.

See also