VXLAN
VXLAN 核心概念
VXLAN (Virtual Extensible LAN) 是一种 Overlay 网络技术,将二层以太网帧封装在 UDP 包中传输。
封装结构:
+-------------------------------+
| Outer Ethernet |
+-------------------------------+
| Outer IP | <- Underlay (物理网络)
| UDP Port 4789 |
+-------------------------------+
| VXLAN Header (VNI) | <- 24位 VNI 标识
+-------------------------------+
| Inner Ethernet | <- Overlay (虚拟网络)
| Inner IP/Payload |
+-------------------------------+
| 概念 | 说明 |
|---|---|
| VTEP | VXLAN Tunnel End Point,隧道端点,负责封装/解封装 |
| VNI | VXLAN Network Identifier,24位,支持1600万个隔离网络 |
| Underlay | 底层物理网络,VXLAN 包在此传输 |
| Overlay | 虚拟二层网络,用户看到的网络 |
核心问题:Bridge 如何选择转发路径?
关键理解:Bridge 是二层交换机,它只看 MAC 地址,不看 IP!
当容器数据到达 bridge 时,转发决策完全基于 FDB (Forwarding Database) 中的 MAC 地址表:
┌─────────────────────────────────────────────────────────────┐
│ ns-host1 的 FDB 表 (bridge fdb show) │
├─────────────────────────────────────────────────────────────┤
│ MAC │ 端口 │ 转发动作 │
├───────────────────────┼───────────┼────────────────────────┤
│ f2:77:e8:53:85:57 │ veth4 │ 本地容器,直接转发 │
│ (ns-container1) │ │ │
├───────────────────────┼───────────┼────────────────────────┤
│ 6a:f7:21:16:6d:fc │ vxlan0 │ 走 VXLAN 隧道 │
│ (ns-container2) │ │ dst=172.16.0.2 │
├───────────────────────┼───────────┼────────────────────────┤
│ 其他/未知 MAC │ - │ 泛洪到所有端口 │
└───────────────────────┴───────────┴────────────────────────┘
转发流程详解
ns-container1 → ns-container2 的数据流程:
1. 容器发帧
Src MAC: f2:77:e8:53:85:57 (ns-container1)
Dst MAC: 6a:f7:21:16:6d:fc (ns-container2) <- 关键!
2. 到达 br0 (通过 veth4)
br0 学习: "f2:77:e8:53:85:57 在 veth4 端口"
3. br0 查 FDB 找目的 MAC
"6a:f7:21:16:6d:fc 在 vxlan0 端口,dst=172.16.0.2"
4. 转发到 vxlan0 -> 封装
Outer IP: 172.16.0.1 -> 172.16.0.2
Outer UDP: 4789
VNI: 100
Inner: 原始帧不变
5. 到达 ns-host2 -> 解封装 -> 查 FDB -> 转发到 veth6
与普通网络的区别
| 场景 | FDB 中的端口 | 行为 |
|---|---|---|
| 同一主机内容器通信 | veth4/veth6 | 本地 bridge 转发,不走 VXLAN |
| 跨主机容器通信 | vxlan0 | 封装后通过 VXLAN 隧道传输 |
| 容器访问外部 | br0/网关 | 走主机路由表,可能出 ens5 |
详细机制说明见 bridge-forwarding.md
实验1: 观察现有 K8s Flannel VXLAN
你的环境已有 K8s + Flannel,可以直接观察真实的 VXLAN:
# 查看 flannel VXLAN 设备
ip -d link show flannel.1
# 查看 VTEP 信息
ip neighbor show dev flannel.1
# 查看 VXLAN 转发表(FDB)
bridge fdb show dev flannel.1
# 查看路由(Pod 网段通过 VXLAN)
ip route | grep flannel
实验2: 手动创建 VXLAN 隧道
如果你想从零搭建 VXLAN,有两个选择:
方案A: 在现有 namespace 中创建(推荐)
由于系统已有大量 CNI namespace,我们在当前 root namespace 创建:
# 创建两个 VXLAN 设备模拟跨主机通信
# 使用 loopback 作为 underlay
sudo ip link add vxlan-demo type vxlan id 100 local 127.0.0.1 remote 127.0.0.1 dstport 4789 dev lo
sudo ip addr add 10.99.1.1/24 dev vxlan-demo
sudo ip link set vxlan-demo up
# 测试自环
ping -c 3 10.99.1.1
# 查看详细信息
ip -d link show vxlan-demo
方案B: 完整多 namespace 实验(清理后运行)
# 先清理所有实验 namespace
sudo ./cleanup.sh
# 创建环境
sudo ./setup.sh
# 运行测试
sudo ./test.sh
# 抓包分析
sudo ./capture.sh
# 清理
sudo ./cleanup.sh
关键命令速查
# 创建 VXLAN 设备
ip link add vxlan0 type vxlan id 100 local 172.16.0.1 remote 172.16.0.2 dstport 4789 dev eth0
# 创建 VXLAN + Bridge
ip link add br0 type bridge
ip link set vxlan0 master br0
# 查看 FDB(MAC 地址转发表)
bridge fdb show
# 添加静态 FDB
bridge fdb add 00:11:22:33:44:55 dev vxlan0 dst 172.16.0.2
# 多播模式(一对多)
ip link add vxlan0 type vxlan id 100 group 239.1.1.1 dstport 4789 dev eth0
进阶:VXLAN vs VLAN
| 特性 | VLAN | VXLAN |
|---|---|---|
| 隔离数量 | 4094 (12-bit) | 1600万 (24-bit) |
| 传输方式 | 二层帧直接传输 | 封装在 UDP 中 |
| 底层依赖 | 需要二层连通 | 只需要三层连通 |
| 应用场景 | 数据中心内部 | 跨机架/跨机房 |
本站所有文章转发 CSDN 将按侵权追究法律责任,其它情况随意。