2025-3-13 calico三种模式下流量传输

要详细分析 Calico BGP、IPIP 和 VXLAN 模式下不同 Node 上 Pod 之间的流量传输路径,需要关注以下几个关键网络接口的角色和数据流向:

  1. Pod 内部的 veth 接口
  2. 宿主机的 veth 对应端
  3. 宿主机的 CNI 设备(通常是 cali+ 接口)
  4. Node 上的物理网络接口(如 eth0
  5. IPIP/VXLAN 设备(如果适用)
  6. 目的地 Node 的解封装流程
  7. 目的 Pod 的 veth 接口

一、Calico BGP 模式下 Pod 之间的流量传输 #

1. 网络拓扑 #

  • Node1(192.168.1.1):
    • PodA(10.1.1.2)
    • 宿主机 eth0(192.168.1.1)
    • cali+ 接口(连接 PodA)
  • Node2(192.168.1.2):
    • PodB(10.1.2.3)
    • 宿主机 eth0(192.168.1.2)
    • cali+ 接口(连接 PodB)

2. 详细流量路径 #

graph TD
    subgraph Node1["Node 1 (192.168.1.1)"]
        PodA["PodA (10.1.1.2)"]
        vethA["vethA (PodA eth0)"]
        caliA["caliXXXX (Calico veth)"]
        eth1["eth0 (宿主机)"]
    end

    subgraph Node2["Node 2 (192.168.1.2)"]
        PodB["PodB (10.1.2.3)"]
        vethB["vethB (PodB eth0)"]
        caliB["caliYYYY (Calico veth)"]
        eth2["eth0 (宿主机)"]
    end

    PodA --> vethA --> caliA
    caliA -->|BGP 路由| eth1
    eth1 -->|裸 IP 直接转发| eth2
    eth2 --> caliB --> vethB --> PodB

PodA (10.1.1.2) → PodB (10.1.2.3) #

  1. PodA 发送数据包
    • PodA (10.1.1.2) 向 PodB (10.1.2.3) 发送数据包
    • 数据包进入 PodA 的 veth 接口 eth0
  2. 通过 veth pair 进入宿主机
    • PodA 的 eth0(veth 子接口)连接到宿主机上的 caliXXXX 设备(Calico 创建的 veth 对应端)
  3. 宿主机查找路由
    • caliXXXX 设备收到数据包,进入宿主机的 路由表
    • 由于 Calico 通过 BGP 传播路由,Node1 知道 10.1.2.3 在 Node2
    • 宿主机的 eth0 直接将数据包原生 IP 转发192.168.1.2
  4. Node2 接收数据
    • Node2 的 eth0 接收到数据包
    • 根据 路由表 知道 10.1.2.3 在本机,数据包通过 caliXXXX 进入 PodB 的 eth0
  5. PodB 接收数据
    • PodB(10.1.2.3)收到数据包,通信完成

特点 #

优点

  • 没有封装,性能最佳
  • 适用于裸金属环境
  • ECMP 负载均衡支持

缺点

  • 需要 BGP 交换机支持
  • 云环境难以部署

二、Calico IP-in-IP (IPIP) 模式下 Pod 之间的流量传输 #

1. 网络拓扑 #

  • Node1(192.168.1.1)
    • PodA(10.1.1.2)
    • 宿主机 eth0(192.168.1.1)
    • tunl0(IPIP 隧道设备)
  • Node2(192.168.1.2)
    • PodB(10.1.2.3)
    • 宿主机 eth0(192.168.1.2)
    • tunl0(IPIP 隧道设备)

2. 详细流量路径 #

graph TD
    subgraph Node1["Node 1 (192.168.1.1)"]
        PodA["PodA (10.1.1.2)"]
        vethA["vethA (PodA eth0)"]
        caliA["caliXXXX (Calico veth)"]
        tunl1["tunl0 (IPIP 隧道)"]
        eth1["eth0 (宿主机)"]
    end

    subgraph Node2["Node 2 (192.168.1.2)"]
        PodB["PodB (10.1.2.3)"]
        vethB["vethB (PodB eth0)"]
        caliB["caliYYYY (Calico veth)"]
        tunl2["tunl0 (IPIP 隧道)"]
        eth2["eth0 (宿主机)"]
    end

    PodA --> vethA --> caliA
    caliA --> tunl1
    tunl1 -->|IPIP 封装| eth1
    eth1 -->|IPIP 隧道| eth2
    eth2 --> tunl2
    tunl2 -->|解封装| caliB
    caliB --> vethB --> PodB

PodA (10.1.1.2) → PodB (10.1.2.3) #

  1. PodA 发送数据包

    • PodA 的 eth0(veth 设备)发送数据包,进入 caliXXXX 设备
  2. 宿主机封装 IPIP

    • 宿主机路由表发现 10.1.2.3 归属于 Node2

    • 数据包被 IPIP 设备 tunl0 封装

    • 封装后的数据包

      外层 IP 头: src=192.168.1.1, dst=192.168.1.2
      内层 IP 头: src=10.1.1.2, dst=10.1.2.3
      
  3. 跨 Node 传输

    • eth0 发送 IPIP 封装数据包到 Node2
  4. Node2 解封装

    • Node2 收到 IPIP 数据包,通过 tunl0 解封,恢复原始 IP 头部
  5. 路由转发到 PodB

    • 数据包进入 caliXXXX,转发给 PodB(10.1.2.3)
  6. PodB 接收数据

    • PodB(10.1.2.3)收到数据包,通信完成

特点 #

优点

  • 适用于云环境(无需 BGP 设备)
  • 支持跨子网(可用 CrossSubnet 优化)

缺点

  • 封装增加 20 字节开销
  • 不支持 ECMP 负载均衡

三、Calico VXLAN 模式下 Pod 之间的流量传输 #

1. 网络拓扑 #

  • Node1(192.168.1.1)
    • PodA(10.1.1.2)
    • 宿主机 eth0(192.168.1.1)
    • VXLAN 设备 vxlan.calico
  • Node2(192.168.1.2)
    • PodB(10.1.2.3)
    • 宿主机 eth0(192.168.1.2)
    • VXLAN 设备 vxlan.calico

2. 详细流量路径 #

graph TD
    subgraph Node1["Node 1 (192.168.1.1)"]
        PodA["PodA (10.1.1.2)"]
        vethA["vethA (PodA eth0)"]
        caliA["caliXXXX (Calico veth)"]
        vxlan1["vxlan.calico (VXLAN 隧道)"]
        eth1["eth0 (宿主机)"]
    end

    subgraph Node2["Node 2 (192.168.1.2)"]
        PodB["PodB (10.1.2.3)"]
        vethB["vethB (PodB eth0)"]
        caliB["caliYYYY (Calico veth)"]
        vxlan2["vxlan.calico (VXLAN 隧道)"]
        eth2["eth0 (宿主机)"]
    end

    PodA --> vethA --> caliA
    caliA --> vxlan1
    vxlan1 -->|VXLAN 封装| eth1
    eth1 -->|UDP 4789 传输| eth2
    eth2 --> vxlan2
    vxlan2 -->|解封装| caliB
    caliB --> vethB --> PodB

PodA (10.1.1.2) → PodB (10.1.2.3) #

  1. PodA 发送数据包

    • PodA 的 eth0(veth 设备)发送数据包,进入 caliXXXX 设备
  2. 宿主机封装 VXLAN

    • vxlan.calico 设备将数据包封装成 VXLAN

    • 封装后的数据包

      外层 IP 头: src=192.168.1.1, dst=192.168.1.2
      VXLAN 头: VNI=4096
      内层 IP 头: src=10.1.1.2, dst=10.1.2.3
      
    • 通过 UDP 4789 端口 发送 VXLAN 数据包

  3. 跨 Node 传输

    • eth0 发送 VXLAN 数据包到 Node2
  4. Node2 解封装

    • vxlan.calico 设备解封 VXLAN,恢复原始 IP 头部
  5. 路由转发到 PodB

    • 数据包进入 caliXXXX,转发给 PodB(10.1.2.3)
  6. PodB 接收数据

    • PodB(10.1.2.3)收到数据包,通信完成

特点 #

优点

  • 适用于公有云
  • 支持 ECMP 负载均衡
  • 支持跨子网

缺点

  • VXLAN 头部增加 50 字节
  • 依赖 UDP 端口 4789

总结 #

模式性能适用场景封装开销负载均衡
BGP裸金属/数据中心无封装
IPIP中等公有云20 字节
VXLAN大规模公有云50 字节

希望这篇详细分析能帮到你!🚀

总结 #

模式适用环境负载均衡额外封装适用于公有云适用于裸金属
BGP物理数据中心
IPIP公有云/私有云20 字节
VXLAN公有云/大规模集群50 字节

17k 住宿 600每月,4-6人间, 公积金3000 7% 双边交,五险7200 交,

17000 x 12,公积金400每月,

17.4k x 12=208.8k

十几薪?有无年终奖?有出差吗?包吃饭吗?

15.5k x 12+12k+12K+1.86kx12=232k