4、跨节点网络通信原理:Overlay网络(VXLAN/Geneve)、隧道封装与解封装、跨节点路由路径分析
在 Kubernetes 与多租户云原生环境中,跨节点 Pod 通信依赖 Overlay 网络 实现。Overlay 网络通过在物理网络(Underlay)之上构建虚拟二层域,使租户 Pod 能够无视底层拓扑进行通信。本章深入分析 VXLAN 与 Geneve 两种主流封装协议、隧道封装/解封装机制,以及跨节点路由的完整路径。
4.1 Overlay 网络核心概念
Overlay 网络的核心思想是将原始数据包(Inner Packet)封装在 UDP 隧道中,通过 Underlay 网络传输到目标节点后再解封装。关键组件包括:
- VTEP(VXLAN Tunnel Endpoint):负责封装与解封装的端点,通常位于节点内核或 OVS 中。
- VNI(VXLAN Network Identifier):标识租户或网络段,支持 1600 万+ 隔离域。
- Underlay 网络:物理网络基础设施,提供三层可达性。
- 隧道协议:VXLAN(标准)、Geneve(可扩展)、STT(较少用)。
关键指标对比: VXLAN 头部固定 8 字节,Geneve 头部可变(4-64 字节),支持 TLV 选项扩展,更适合多租户自定义元数据。
4.2 VXLAN 封装与解封装机制
VXLAN 将原始二层帧封装在 UDP 数据包中,封装格式如下:
+-------------------------------+
| Outer MAC Header (14B) |
+-------------------------------+
| Outer IP Header (20B) |
+-------------------------------+
| Outer UDP Header (8B) |
| Dest Port: 4789 |
+-------------------------------+
| VXLAN Header (8B) |
| Flags(8b) | Reserved(24b) |
| VNI(24b) | Reserved(8b) |
+-------------------------------+
| Inner MAC Header (14B) |
+-------------------------------+
| Inner IP Header (20B) |
+-------------------------------+
| Payload (TCP/UDP/ICMP...) |
+-------------------------------+
| FCS (4B) |
+-------------------------------+
封装流程(发送端):
- 原始数据包从 Pod 到达 VTEP(如 Linux bridge 或 OVS)。
- VTEP 查询 FDB(转发数据库)或内核路由表,确定目标 VTEP IP。
- 添加 VXLAN 头部(VNI = 租户 ID)。
- 添加 UDP 头部(源端口由哈希计算,目的端口 4789)。
- 添加外层 IP 头部(源 = 本节点 IP,目的 = 目标节点 IP)。
- 添加外层 MAC 头部(下一跳 MAC)。
- 发送到 Underlay 网络。
解封装流程(接收端):
- 物理网卡接收外层数据包。
- 内核/OVS 识别 UDP 端口 4789,剥离外层 MAC/IP/UDP 头部。
- 检查 VXLAN 头部 VNI,匹配本地租户网络。
- 剥离 VXLAN 头部,还原原始二层帧。
- 将原始帧注入目标 Pod 所在 bridge/namespace。
性能要点: VXLAN 封装增加 50 字节头部开销(不含内层 FCS),MTU 需设置为 1450 或更小(取决于 Underlay 配置)。Geneve 头部可变,开销为 50-110 字节。
4.3 Geneve 协议与 VXLAN 对比
| 特性 | VXLAN | Geneve |
|---|---|---|
| 标准 | RFC 7348 | RFC 8926 |
| 头部大小 | 固定 8 字节 | 可变 4-64 字节 |
| VNI 长度 | 24 位 | 24 位 |
| 选项支持 | 无 | TLV 选项(如元数据、安全标签) |
| UDP 端口 | 4789 | 6081 |
| 多租户扩展 | 仅 VNI | VNI + 可选上下文 |
| 内核支持 | Linux 3.7+ | Linux 4.5+ |
| 典型场景 | K8s 默认 CNI(Flannel/Calico) | Cilium、OVN-Kubernetes |
选型建议: 若仅需基本租户隔离,VXLAN 足够;若需传递 eBPF 元数据、安全策略上下文或自定义标签,优先选择 Geneve。Cilium 在 Geneve 模式下可携带 eBPF 元数据,实现更细粒度观测。
4.4 跨节点路由路径分析
跨节点通信路径分为 Underlay 路由 与 Overlay 路由 两个层次。以下为典型路径分解:
4.5 路由查找与 FDB 转发
跨节点通信的路由决策分为两个阶段:
| 阶段 | 查找表 | 输入 | 输出 |
|---|---|---|---|
| Overlay 路由 | Pod 路由表 / 内核 FIB | 目标 Pod IP(如 10.1.1.3) | 目标 VTEP IP(如 192.168.2.20) |
| Underlay 路由 | 节点路由表 / 物理网络 | 目标 VTEP IP(192.168.2.20) | 下一跳 MAC + 出接口 |
| FDB 查询 | VTEP 转发数据库 | 目标 MAC + VNI | 目标 VTEP IP(多播/单播) |
eBPF 观测点: 在 VTEP 的
tc ingress/egress 或 XDP 挂载点,可捕获封装前/解封装后的原始包,提取 VNI、源/目标 Pod IP、租户标签,用于丢包定位与隔离违规检测。
4.6 丢包防护关键路径
跨节点丢包可能发生在以下环节,需重点验证:
- 封装阶段:源 VTEP 无法解析目标 VTEP IP(路由缺失)→ 丢包。
- Underlay 传输:物理网络 MTU 小于封装后包长 → 分片或丢弃。
- 解封装阶段:目标 VTEP 未配置对应 VNI → 丢弃。
- 租户隔离违规:VNI 与租户不匹配 → eBPF 策略拒绝。
- ARP/ND 失效:VTEP 未学习目标 MAC → 广播失败。
验证建议: 使用
tcpdump -i any port 4789 抓取封装后包,确认外层 IP 与 VNI 正确;使用 bpftrace 跟踪 vxlan_xmit 和 vxlan_rcv 内核函数,统计封装/解封装计数与错误。
4.7 多租户隔离下的隧道策略
在租户隔离蓝图中,每个租户的 VNI 必须唯一,且 VTEP 需实现 租户级 FDB 隔离:
# 示例:租户-A 使用 VNI 100,租户-B 使用 VNI 200
# 在 Node-A 上查看 FDB(使用 bridge fdb show)
00:11:22:33:44:55 dev vxlan0 dst 192.168.2.20 vni 100 self permanent
00:11:22:33:44:66 dev vxlan0 dst 192.168.3.30 vni 200 self permanent
# eBPF 程序验证 VNI 与租户身份
int vxlan_validate(struct __sk_buff *skb) {
struct vxlanhdr *vh = (void *)(long)skb->data;
if (vh->vni == 100 && skb->sec_label != TENANT_A_LABEL)
return TC_ACT_SHOT; // 隔离违规,丢弃
return TC_ACT_OK;
}
风险提示: 若 VTEP 未严格隔离 FDB,租户-A 的 Pod 可能通过伪造 VNI 访问租户-B 的资源。eBPF 必须在 VTEP 入口强制校验 VNI + 源租户标签,防止隧道逃逸。
通过以上分析,Overlay 网络的跨节点通信本质是 “虚拟二层 + 物理三层” 的混合路径。VXLAN/Geneve 提供租户隔离基础,而 eBPF 在 VTEP 处的观测与策略执行,是保障隔离不泄露、丢包可追溯的关键技术手段。