Networking
地址规划
站点 ULA 为 fdb5:92d0:b067::/48(RFC 4193,随机 40-bit global ID)。所有集群内部
地址都从中派生,唯一出处是 metal/inventories/prod.yml
的 all.vars。
| 用途 | 网段 | 定义位置 |
|---|---|---|
| 站点 ULA | fdb5:92d0:b067::/48 |
约定(文档) |
| 节点主接口 | fdb5:92d0:b067:1::/64 |
dualstack_ipv6_node_cidr + 各 host 的 node_ipv6 |
| Pod | fdb5:92d0:b067:4200::/56 |
dualstack_ipv6_pod_cidr(k3s cluster-cidr / Cilium clusterPoolIPv6PodCIDRList) |
| Service | fdb5:92d0:b067:4300::/112 |
dualstack_ipv6_service_cidr(k3s service-cidr) |
节点 IPv6 是固定值,不是运行时探测的 ISP GUA:
| 节点 | IPv4 | IPv6(node-ip) |
|---|---|---|
| n100-jumper-0 | 192.168.3.226 | fdb5:92d0:b067:1::11 |
| n100-jumper-1 | 192.168.3.174 | fdb5:92d0:b067:1::12 |
| n100-jumper-2 | 192.168.3.158 | fdb5:92d0:b067:1::13 |
| n100-cheshi-0 | 192.168.3.154 | fdb5:92d0:b067:1::14 |
为什么节点身份不用 ISP 下发的 GUA
ISP 的 240e: 委派前缀会随 PPPoE 重拨/重启漂移(2026-10-29 就从
240e:3a3:20ba:ae43::/64 变成 240e:3a3:2002:6440::/64)。而 k3s 的 node-ip
是字面量,不能动态解析。一旦用它做身份:
- kubelet 每 10 秒报
failed to validate secondaryNodeIP,Node 的 IPv6 InternalIP 停旧; - Cilium agent 把旧地址写进
CiliumNode,auto-direct-node-routes装不出跨节点 IPv6 直连路由 → 跨节点 IPv6 pod 通信静默失效; - hostNetwork pod 的 IPv6 EndpointSlice 指向不存在的地址;
- 每次漂移都要改 4 台
config.yaml并滚动重启 k3s + cilium agent。
所以节点身份锚定在站点 ULA 上;GUA 保留在接口上,只承担出站/NAT。 细节与回退见 specs/012-stable-node-ula-ipv6。
地址如何落地
- 已装机器的持久化:
metal/roles/prerequisites渲染/etc/netplan/60-homelab-ula.yaml(只写 ULA 一条;netplan 的addresses是追加语义,cloud-init 的 IPv4 与dhcp6: yes不受影响)并netplan apply。 - 新装机器:
metal/roles/pxe_server/templates/user-data.j2的 netplanaddresses直接包含 ULA。 - k3s:
node-ip与kubelet-arg: node-ip=引用 inventory 的node_ipv6; k3s role 会先断言该地址确实在接口上,缺地址直接失败(不静默降级)。
路由器
节点间 IPv6 走 LAN 的二层转发(br-lan 桥),路由器不参与该 /64 的路由,
不需要为 ULA 做任何配置:不需要静态路由、不需要 RA 下发、不需要防火墙放行。
外部访问走 Tailscale(node-external-ip 仍是 Tailscale 的 100.x / fd7a:)。
流量路径
flowchart TD
laptop/desktop/phone <-- Tailscale VPN Over Internet/Intranet --> Tailscale Ingress Pod
subgraph LAN
subgraph k8s[Kubernetes cluster]
Pod --> Service
Service --> Ingress
Tailscale Ingress Pod
Tailscale Funnel Ingress Pod
Tailscale Funnel Ingress Pod <--> Ingress
end
Tailscale Ingress Pod <--> Ingress
end
Tailscale Funnel Ingress Pod -- outbound --> ts.net
Internet -- inbound --> ts.net
- Pod↔Pod(跨节点):Cilium native routing,
auto-direct-node-routes按对方节点 ULA 装fdb5:…420N::/64 via fdb5:…1::N的直连路由,下一跳是本 LAN 的二层邻居。 - 节点→外网:GUA(SLAAC)经路由器。
- 集群外访问:Tailscale Ingress / Funnel。