diff --git a/kubernetes/talos/patches/k8s-1.yaml b/kubernetes/talos/patches/k8s-1.yaml index e9dbb4a6..8c74ab05 100644 --- a/kubernetes/talos/patches/k8s-1.yaml +++ b/kubernetes/talos/patches/k8s-1.yaml @@ -20,6 +20,29 @@ machine: # un-translated SYN-ACK -> client kernel RST, verified live 2026-07-23). # This disables v6 entirely on that link, including link-local. net.ipv6.conf.ens19.disable_ipv6: "1" + # Same argument, applied to the physical ports rather than a VLAN child. + # + # enp2s0f0np0 is nothing but the trunk parent for mgmt0 and ens19, and + # enp87s0 is unused. Both sit on the untagged fallback network, where by + # design nothing is supposed to run — and both were autoconfiguring + # themselves from its router advertisements: an fd00::/64 ULA each, plus + # an IPv6 default route each. + # + # The result was four IPv6 default routes per node at identical priority + # 1024 — mgmt0, enp2s0f0np0, enp87s0 and lo — of which only mgmt0 has a + # globally routable source address. With nothing to break the tie, + # outbound IPv6 mostly left through an interface whose only usable source + # was a ULA, so the cluster had no IPv6 egress at all while IPv4 worked + # normally. It surfaced as two NetBird probes reporting the proxies down + # for 30 hours; the proxies were fine and answered IPv6 in 13 ms from + # outside. + # + # Verified on k8s-1 before rolling to the others: disabling v6 on a VLAN + # parent leaves the VLAN child alone. mgmt0 kept its global address and + # its fd40:: address, Ceph did not notice, and every failing probe + # recovered on the next scrape. + net.ipv6.conf.enp2s0f0np0.disable_ipv6: "1" + net.ipv6.conf.enp87s0.disable_ipv6: "1" install: # Three NVMe drives are ordinary block devices to Talos here: the Kingston # OM8PGP41024Q-A0 system disk, the Samsung PM983 that Rook claims as the diff --git a/kubernetes/talos/patches/k8s-2.yaml b/kubernetes/talos/patches/k8s-2.yaml index 9a2e076d..8c00c4de 100644 --- a/kubernetes/talos/patches/k8s-2.yaml +++ b/kubernetes/talos/patches/k8s-2.yaml @@ -9,6 +9,15 @@ machine: # macvlan parent for the v30iot pod attachments; host addresses on that L2 # make node replies bypass the UDM and break every UDM-DNATed flow. net.ipv6.conf.ens19.disable_ipv6: "1" + # Same argument for the physical ports: enp2s0f0np0 is only the trunk + # parent for mgmt0 and ens19, enp87s0 is unused, and both sit on the + # untagged fallback network where nothing is supposed to run. Both were + # taking an fd00::/64 and an IPv6 default route from its router + # advertisements, leaving four equal-priority default routes per node of + # which only mgmt0 has a globally routable source. See k8s-1.yaml for the + # full reasoning and how it was verified. + net.ipv6.conf.enp2s0f0np0.disable_ipv6: "1" + net.ipv6.conf.enp87s0.disable_ipv6: "1" install: # Three NVMe drives are visible on bare metal. Select the installer target # by serial so it cannot land on the OSD drive or on EPHEMERAL, whatever diff --git a/kubernetes/talos/patches/k8s-3.yaml b/kubernetes/talos/patches/k8s-3.yaml index 08e3bf4a..4053ebea 100644 --- a/kubernetes/talos/patches/k8s-3.yaml +++ b/kubernetes/talos/patches/k8s-3.yaml @@ -8,6 +8,15 @@ machine: sysctls: # v30iot NIC carries no host addressing — see k8s-1.yaml. net.ipv6.conf.ens19.disable_ipv6: "1" + # Same argument for the physical ports: enp2s0f0np0 is only the trunk + # parent for mgmt0 and ens19, enp87s0 is unused, and both sit on the + # untagged fallback network where nothing is supposed to run. Both were + # taking an fd00::/64 and an IPv6 default route from its router + # advertisements, leaving four equal-priority default routes per node of + # which only mgmt0 has a globally routable source. See k8s-1.yaml for the + # full reasoning and how it was verified. + net.ipv6.conf.enp2s0f0np0.disable_ipv6: "1" + net.ipv6.conf.enp87s0.disable_ipv6: "1" install: # Three NVMe drives are visible on bare metal. Select the installer target # by serial so it cannot land on the OSD drive or on EPHEMERAL, whatever