Network truth — sites, VLANs, tunnel, DNS¶
Sites¶
Two sites, symmetric VLAN naming with 2nd-octet convention .1 = home, .2 = office.
| Site | WAN | Default (user) | LAN | Infra | Mgmt | K8s-Nodes | K8s-Services |
|---|---|---|---|---|---|---|---|
| home | 79.227.94.24 |
192.168.1.0/24 |
10.1.1.0/24 |
10.1.0.0/24 |
10.1.10.0/24 |
10.1.20.0/24 |
10.1.30.0/24 |
| office | 80.152.169.202 |
192.168.2.0/24 |
— | 10.2.0.0/24 |
10.2.10.0/24 |
10.2.20.0/24 |
10.2.30.0/24 |
Plus IoT VLAN 40 and Guest VLAN 50 per site (not used by k8s; not in the site-to-site tunnel — isolated).
Overlays: Pod CIDR 10.244.0.0/16, Service CIDR 10.96.0.0/12.
Site-to-site tunnel¶
- Always up at the firewall level (verified via Unifi Site Manager).
- UniFi gateway-to-gateway tunnel (Site Magic) between the home and office UDMs. Not IPsec; no IPsec daemon anywhere. Not yet in GitOps — Phase 9 adds
terraform/unifi/. - Latency: normally ~150-200ms RTT, sometimes high-jitter / slow under load. etcd is tuned for this (
heartbeat-interval=1000ms,election-timeout=10000ms). - Gateways route all VLANs freely between sites except
wlan-iotandwlan-guest.
Never invent a firewall ACL to "fix" reachability — if a workstation can't reach a cluster IP, the cause is local (see workstation.md §Troubleshooting).
Kubernetes API endpoints¶
| Endpoint | Path | Consumers |
|---|---|---|
10.1.20.10:6443 |
kube-vip ARP-announced | home-site kubectl + intra-cluster |
10.2.20.10:6443 |
kube-vip ARP-announced | office-site kubectl + intra-cluster |
api.cauda.dev → 10.106.124.25 |
in-cluster CoreDNS only | pods |
k8s.infra.cauda.dev |
cloudflared TCP tunnel → 10.2.20.200:6443 |
public / any-VLAN workstation / Nautik iOS |
Phase 5 (dual cloudflared) adds k8s-home.infra.cauda.dev + k8s-office.infra.cauda.dev as per-site fallbacks.
Cluster gateway VIPs¶
| Site | Pool name | CIDR | Gateway CR | Announcer |
|---|---|---|---|---|
| home | home-pool |
10.1.30.10–.250 |
main-home (10.1.30.10), main (10.1.30.12, primary cloudflared origin), private-home (10.1.30.13, LAN-only APIs) |
home worker nodes only |
| office | office-pool |
10.2.30.10–.250 |
main-office (10.2.30.10), private-office (10.2.30.12, LAN-only APIs) |
office worker nodes only |
Files: cluster/cilium-lb/, cluster/gateway/.
DNS¶
In-cluster CoreDNS (cluster/coredns/) — pods only:
*.cauda.dev→ A10.106.124.25(Cilium Gateway ClusterIP) viatemplateplugin.- AAAA blocked for
cauda.devuntil IPv6 rollout (Phase 7). - Upstreams:
1.1.1.1,8.8.8.8.
LAN split-DNS (cluster/coredns-lan/) — one instance per site, consumed by the Unifi firewalls:
- home: LB IP
10.1.30.11→*.cauda.dev=10.1.30.10 - office: LB IP
10.2.30.11→*.cauda.dev=10.2.30.10 - exact
sabnzbd-api.media.cauda.devoverride: home10.1.30.13, office10.2.30.12; these dedicated Gateways are not cloudflared origins.
Strict separation: cluster CoreDNS must not forward to LAN CoreDNS. Mixing them caused the sabnzbd "Server name does not resolve" regression (BUG-04).
Cloudflare¶
- Zone
cauda.devmanaged via terraform (terraform/cloudflare.tf). - Dual per-site cloudflared tunnels (
apps/infra/cloudflared-home/,apps/infra/cloudflared-office/), fully terraform-automated; the legacy single tunnel is decommissioned. - No click-ops. Everything via the
cloudflare/cloudflareterraform provider.
Known gaps¶
- Unifi config (VLANs, firewall rules, site-to-site tunnel, BGP) not in GitOps. Phase 9 adds
terraform/unifi/via thepaultyng/unifiprovider. - Cloudflared: hand-built single tunnel → Phase 5 dual automated.
- IPv6: fully disabled in cluster → Phase 7 after Cilium 1.20.