flannel提供的3种后端实现
UDP(flanneld封装和解封装UDP)
实现原理
缺点(性能最差)
UDP模式,封装和解封装的对象是三层IP包,提供三层的Overlay网络,是Flannel最早支持的一种方式,也是性能最差的一种方式,已经被弃用。
在发出IP包的过程中需要经过3次用户态与内核态之间的数据拷贝。
第1次,用户态的容器进程发出的IP包经过docker0网桥进入内核态。
第2次,IP包进入flannel0,从而回到用户态的flanneld进程。
第3次,flanneld对IP包进行UDP封包之后,将UDP包通过宿主机上内核态的eth0发出去。
flanneld封装和解封装UDP的过程在用户态完成。这些上下文切换和用户态操作的代价是比较高的,这是Flannel UDP模式性能差的主要原因。,
尽量减少用户态到内核态的切换次数,把核心逻辑都放在内核态。
VXLAN(基于UDP)
基本概念
VXLAN(Virtual Extensible LAN,虚拟可扩展局域网)解决子网不够用的问题。传统VLAN(VID占12位,2^12=4096)只能支持4000多个子网,VXLAN(VNID占24位,2^24=16777216)可以支持1600多万个子网。
VXLAN在内核态完成封装和解封装内部数据帧,是一个由不同宿主机上的VTEP设备,也就是flannel.1设备组成的虚拟二层网络。
一个VXLAN网络中包含了VTEP和VNI等部分。VTEP(VXLAN Tunnel Endpoint)在有VXLAN网络的机器上都有一个。VNI(VXLAN Network Identifier)用于区分不同VXLAN网络。VNI设置在每个VTEP上,VNI相同的VTEP在一个子网里。
实现原理
每台宿主机上名叫flannel.1的设备是VXLAN的VTEP设备,它既有IP地址,也有MAC地址。
1. 根据目的ip查询flannel.1中arp表得到目的节点flannel.1 mac。
2. 根据mac查询fdb表得到目的节点主机ip。
3. 根据目的节点主机ip查询主机arp表得到下一跳mac。
# 在Node 1上
$ route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface ... 10.1.16.0 10.1.16.0 255.255.255.0 UG 0 0 0 flannel.1
$ ip neigh show dev flannel.1 10.1.16.0 lladdr 5e:f8:4f:00:e3:37 PERMANENT
neighbor表即arp表,根据ip查询mac;fdb表根据mac查询其他信息。
内部二层数据帧
flannel.1作为网桥设备,转发的依据来自FDB(Forwarding Database)的转发数据库。
# 在Node 1上,使用“目的VTEP设备”的MAC地址进行查询 $ bridge fdb show flannel.1 | grep 5e:f8:4f:00:e3:37 5e:f8:4f:00:e3:37 dev flannel.1 dst 10.168.0.3 self permanent
加VXLAN头(flannel.1中的1就是VNI)和目的主机IP以及MAC地址构成UDP包
传输层:加上Outer UDP Header。
网络层:加上Outer IP Header。
数据链路层:加上二层数据帧头Outer Ethernet Header,并把Node2的MAC地址填进去。
host-gw(加路由)
实现原理
$ip route ... 10.244.1.0/24 via 10.168.0.3 dev eth0
host-gw将每个Flannel子网(比如:10.244.1.0/24)的下一跳,设置成了该子网所在的宿主机的IP地址。这台主机充当这条容器通信路径里的网关。
是二层互通,目的mac是对方pod所在主机mac,不是主机默认路由指向的网关mac,即交换机mac。
IP包在封装成帧发送出去时,会使用路由表里的下一跳来设置目的MAC地址。经过二层网络到达目的宿主机。
优点
不需要像VXLAN那样封包解包,性能最好。
手动模拟
# Node1 ip netns add ns1 brctl addbr br1 ip addr add 100.0.0.1/24 dev br1 ip link set dev br1 up ip link add veth1 type veth peer name veth11 brctl addif br1 veth11 ip link set veth1 netns ns1 ip netns exec ns1 ip addr add 100.0.0.2/24 dev veth1 ip netns exec ns1 ip link set dev veth1 up ip link set dev veth11 up ip netns exec ns1 ip link set lo up ip netns exec ns1 route add default gw 100.0.0.1 dev veth1 ip route add 100.0.1.0/24 via 192.168.1.6 dev ens33 # Node2 ip netns add ns1 brctl addbr br1 ip addr add 100.0.1.1/24 dev br1 ip link set dev br1 up ip link add veth1 type veth peer name veth11 brctl addif br1 veth11 ip link set veth1 netns ns1 ip netns exec ns1 ip addr add 100.0.1.2/24 dev veth1 ip netns exec ns1 ip link set dev veth1 up ip link set dev veth11 up ip netns exec ns1 ip link set lo up ip netns exec ns1 route add default gw 100.0.1.1 dev veth1 ip route add 100.0.0.0/24 via 192.168.1.5 dev ens33
同节点和跨节点ping通
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义