k8s -- 联邦集群

客户期望将两个机房的k8s集群打通作为联邦集群,需要k8s内的pod网络互通。

讨论如下:

  1. 主要业务pod的地址不能做NAT转换,必须相互间三层路由可达。
  2. 如果K8S使用underlay网络,又或者两个K8S集群内的容器间都是三层路由可达,也是可以的。
  3. 两个K8S集群通过VPN网关互联(VXLAN网关等),集群容器间三层路由可达也行。

具体可行的方案有哪些?

针对跨机房Kubernetes联邦集群的Pod网络三层互通需求,结合“禁止NAT”和“三层路由可达”的核心原则,以下是可行的技术方案及实施要点:


方案1:Underlay网络 + BGP路由分发(生产级推荐)

适用场景

机房之间具备专线互联,且网络设备支持BGP协议

实现原理

  1. Pod IP全局规划
    • 为每个集群分配唯一的Pod CIDR(如Cluster1: 10.1.0.0/16, Cluster2: 10.2.0.0/16),确保无重叠。
  2. Underlay网络插件
    • 使用 CalicoCiliumBGP模式,将Pod CIDR通过BGP通告至机房核心路由器。
  3. 跨机房路由同步
    • 机房核心路由器建立BGP Peer,互相学习对方集群的Pod CIDR路由。
  4. 流量路径
    • Pod1(Cluster1)→ 主机网卡 → Cluster1核心路由器 → 专线 → Cluster2核心路由器 → 目标主机 → Pod2(Cluster2)

优势

  • 性能最优:无隧道封装开销,低延迟。
  • 网络透明:路由路径清晰,易排查问题。
  • 无NAT:全程使用Pod真实IP通信。

要求

  • 网络设备需支持BGP(如Cisco/Juniper/Huawei路由器)。
  • 运维团队具备BGP配置能力。

方案2:VXLAN/IPsec隧道 overlay(通用型方案)

适用场景

机房之间无专线BGP支持,需通过加密隧道互联(如公网VPN)。

实现原理

  1. 隧道网关部署
    • 在每个机房部署隧道端点(如:Calico的Typha + VXLANCilium的VXLAN/Geneve,或独立Linux VTEP)。
  2. 隧道建立
    • VXLAN:在机房网关间建立VXLAN隧道,封装Pod流量(需开放UDP 8472端口)。
    • IPsec:叠加IPsec加密(如StrongSwan/WireGuard),保障公网传输安全。
  3. 路由同步
    • 通过静态路由BGP over隧道(如Calico的BGP over VXLAN)通告Pod CIDR。
  4. 流量路径
    • Pod1 → 主机 → VXLAN隧道端点 → IPsec加密 → 公网 → 对端隧道端点 → 解封装 → Pod2

优势

  • 安全加密:IPsec保障公网传输安全。
  • 灵活部署:不依赖底层网络设备。
  • 无NAT:Pod IP端到端可达。

工具选择

  • CalicoipipMode: CrossSubnet + VXLAN + BGP(跨机房BGP Peering)。
  • Ciliumtunnel: vxlan + clusterPool IPAM + 跨集群路由同步。
  • 独立方案:Flannel VXLAN + 自定义路由脚本。

方案3:SDN控制器统一路由(云厂商/高级方案)

适用场景

多机房归属同一云服务商,或已部署SDN控制器(如VMware NSX、Juniper Contrail)。

实现原理

  1. 全局SDN控制平面
    • SDN控制器统一管理所有机房的虚拟网络(如NSX-T的Global Manager)。
  2. 逻辑路由器分发路由
    • 创建跨机房逻辑路由器,自动同步Pod CIDR路由。
  3. 隧道封装
    • 使用Geneve/VXLAN封装流量,底层通过专线或VPN传输。
  4. 流量路径
    • Pod1 → 主机Hypervisor → SDN隧道封装 → 物理网络 → 对端SDN网关 → 解封装 → Pod2

优势

  • 集中管理:统一策略、路由、安全配置。
  • 自动化:动态响应Pod IP变化。

要求

  • 云厂商SDN支持(如阿里云CEN/Terway)或自建SDN基础设施。

关键配置验证点

  1. 路由表检查
    • 在集群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 
    
  2. 隧道连通性
    • 使用 tcpdump 抓取VXLAN流量(UDP 8472端口):
      tcpdump -i eth0 udp port 8472 -nn
      
  3. 跨集群Pod通信测试
    • 在Cluster1的Pod中直接Ping Cluster2的Pod IP:
      kubectl exec -it pod-cluster1 -- ping 10.2.1.5
      

避坑指南

  1. Pod CIDR冲突
    • 绝对禁止:若两集群Pod网段重叠(如都用 10.244.0.0/16),需重新规划或使用NetworkPolicy隔离。
  2. MTU问题
    • VXLAN/IPsec会减少有效MTU(通常需调小至1400),否则导致分片丢包:
      # Calico配置示例
      apiVersion: crd.projectcalico.org/v1
      kind: FelixConfiguration
      metadata:
        name: default
      spec:
        vxlanMTU: 1400  # 根据隧道开销调整
      
  3. 防火墙规则
    • 开放隧道端口(VXLAN: UDP 8472, IPsec: UDP 500/4500)。
  4. 非对称路由
    • 确保出向流量回程流量路径一致,避免状态防火墙丢弃报文。

总结推荐

场景 推荐方案 复杂度 性能
机房有专线+BGP支持 Underlay + BGP路由分发 ★★★☆☆ ⭐⭐⭐⭐⭐
公网互联需加密 VXLAN/IPsec隧道 ★★★★☆ ⭐⭐⭐☆
云厂商统一SDN架构 云SDN全局路由 ★★☆☆☆ ⭐⭐⭐⭐

最终决策

  • 若追求极致性能且网络可控 → 方案1(BGP Underlay)
  • 若需加密且无专线 → 方案2(VXLAN/IPsec)
  • 若为公有云多地域 → 直接使用云厂商的全球加速+容器网络互通服务(如AWS VPC Peering + Calico)。
posted @ 2025-08-07 17:14  静水深耕,云停风驻  阅读(72)  评论(0)    收藏  举报