k8s -- 联邦集群
客户期望将两个机房的k8s集群打通作为联邦集群,需要k8s内的pod网络互通。
讨论如下:
- 主要业务pod的地址不能做NAT转换,必须相互间三层路由可达。
- 如果K8S使用underlay网络,又或者两个K8S集群内的容器间都是三层路由可达,也是可以的。
- 两个K8S集群通过VPN网关互联(VXLAN网关等),集群容器间三层路由可达也行。
具体可行的方案有哪些?
针对跨机房Kubernetes联邦集群的Pod网络三层互通需求,结合“禁止NAT”和“三层路由可达”的核心原则,以下是可行的技术方案及实施要点:
方案1:Underlay网络 + BGP路由分发(生产级推荐)
适用场景
机房之间具备专线互联,且网络设备支持BGP协议。
实现原理
- Pod IP全局规划
- 为每个集群分配唯一的Pod CIDR(如Cluster1:
10.1.0.0/16, Cluster2:10.2.0.0/16),确保无重叠。
- 为每个集群分配唯一的Pod CIDR(如Cluster1:
- Underlay网络插件
- 使用 Calico 或 Cilium 的 BGP模式,将Pod CIDR通过BGP通告至机房核心路由器。
- 跨机房路由同步
- 机房核心路由器建立BGP Peer,互相学习对方集群的Pod CIDR路由。
- 流量路径
Pod1(Cluster1)→ 主机网卡 → Cluster1核心路由器 → 专线 → Cluster2核心路由器 → 目标主机 → Pod2(Cluster2)
优势
- 性能最优:无隧道封装开销,低延迟。
- 网络透明:路由路径清晰,易排查问题。
- 无NAT:全程使用Pod真实IP通信。
要求
- 网络设备需支持BGP(如Cisco/Juniper/Huawei路由器)。
- 运维团队具备BGP配置能力。
方案2:VXLAN/IPsec隧道 overlay(通用型方案)
适用场景
机房之间无专线BGP支持,需通过加密隧道互联(如公网VPN)。
实现原理
- 隧道网关部署
- 在每个机房部署隧道端点(如:
Calico的Typha+VXLAN,Cilium的VXLAN/Geneve,或独立Linux VTEP)。
- 在每个机房部署隧道端点(如:
- 隧道建立
- VXLAN:在机房网关间建立VXLAN隧道,封装Pod流量(需开放UDP 8472端口)。
- IPsec:叠加IPsec加密(如StrongSwan/WireGuard),保障公网传输安全。
- 路由同步
- 通过静态路由或BGP over隧道(如Calico的
BGP over VXLAN)通告Pod CIDR。
- 通过静态路由或BGP over隧道(如Calico的
- 流量路径
Pod1 → 主机 → VXLAN隧道端点 → IPsec加密 → 公网 → 对端隧道端点 → 解封装 → Pod2
优势
- 安全加密:IPsec保障公网传输安全。
- 灵活部署:不依赖底层网络设备。
- 无NAT:Pod IP端到端可达。
工具选择
- Calico:
ipipMode: CrossSubnet+VXLAN+BGP(跨机房BGP Peering)。 - Cilium:
tunnel: vxlan+clusterPool IPAM+ 跨集群路由同步。 - 独立方案:Flannel VXLAN + 自定义路由脚本。
方案3:SDN控制器统一路由(云厂商/高级方案)
适用场景
多机房归属同一云服务商,或已部署SDN控制器(如VMware NSX、Juniper Contrail)。
实现原理
- 全局SDN控制平面
- SDN控制器统一管理所有机房的虚拟网络(如NSX-T的Global Manager)。
- 逻辑路由器分发路由
- 创建跨机房逻辑路由器,自动同步Pod CIDR路由。
- 隧道封装
- 使用Geneve/VXLAN封装流量,底层通过专线或VPN传输。
- 流量路径
Pod1 → 主机Hypervisor → SDN隧道封装 → 物理网络 → 对端SDN网关 → 解封装 → Pod2
优势
- 集中管理:统一策略、路由、安全配置。
- 自动化:动态响应Pod IP变化。
要求
- 云厂商SDN支持(如阿里云CEN/Terway)或自建SDN基础设施。
关键配置验证点
- 路由表检查
- 在集群Node上执行
ip route,确认对端集群Pod CIDR路由指向正确隧道/网关。
# 示例:Cluster2的Pod CIDR(10.2.0.0/16)应通过隧道接口 $ ip route show 10.2.0.0/16 10.2.0.0/16 via 192.168.100.1 dev vxlan0 - 在集群Node上执行
- 隧道连通性
- 使用
tcpdump抓取VXLAN流量(UDP 8472端口):tcpdump -i eth0 udp port 8472 -nn
- 使用
- 跨集群Pod通信测试
- 在Cluster1的Pod中直接Ping Cluster2的Pod IP:
kubectl exec -it pod-cluster1 -- ping 10.2.1.5
- 在Cluster1的Pod中直接Ping Cluster2的Pod IP:
避坑指南
- Pod CIDR冲突
- 绝对禁止:若两集群Pod网段重叠(如都用
10.244.0.0/16),需重新规划或使用NetworkPolicy隔离。
- 绝对禁止:若两集群Pod网段重叠(如都用
- MTU问题
- VXLAN/IPsec会减少有效MTU(通常需调小至
1400),否则导致分片丢包:# Calico配置示例 apiVersion: crd.projectcalico.org/v1 kind: FelixConfiguration metadata: name: default spec: vxlanMTU: 1400 # 根据隧道开销调整
- VXLAN/IPsec会减少有效MTU(通常需调小至
- 防火墙规则
- 开放隧道端口(VXLAN: UDP 8472, IPsec: UDP 500/4500)。
- 非对称路由
- 确保出向流量与回程流量路径一致,避免状态防火墙丢弃报文。
总结推荐
| 场景 | 推荐方案 | 复杂度 | 性能 |
|---|---|---|---|
| 机房有专线+BGP支持 | Underlay + BGP路由分发 | ★★★☆☆ | ⭐⭐⭐⭐⭐ |
| 公网互联需加密 | VXLAN/IPsec隧道 | ★★★★☆ | ⭐⭐⭐☆ |
| 云厂商统一SDN架构 | 云SDN全局路由 | ★★☆☆☆ | ⭐⭐⭐⭐ |
最终决策:
- 若追求极致性能且网络可控 → 方案1(BGP Underlay)
- 若需加密且无专线 → 方案2(VXLAN/IPsec)
- 若为公有云多地域 → 直接使用云厂商的全球加速+容器网络互通服务(如AWS VPC Peering + Calico)。

浙公网安备 33010602011771号