有关flannel插件的一些拙见
1. cni0网桥是谁创建的?
cni0由CNI的bridge插件创建,不是Flannel直接创建的。- Flannel只负责分配子网和配置节点间路由,而具体的网络设备(如网桥、veth pair等)由CNI插件实现。
- 当Flannel与CNI协作时,默认会调用
bridge插件创建cni0网桥,并将Pod的veth设备一端挂载到cni0上。 - 验证方法:在节点上执行
ip link show cni0,可以看到它是bridge类型设备。
2. flannel.1与VTEP
flannel.1是什么?
它是一个VXLAN虚拟网卡,作用是作为VXLAN隧道的端点(VTEP)。- VTEP(VXLAN Tunnel Endpoint):可以理解为一个“隧道口”,负责对数据包进行VXLAN封装/解封装。
- 发送端:将Pod的原始数据包封装成VXLAN格式(添加外层UDP+IP头)。
- 接收端:解封装VXLAN包,还原出原始数据包。
- 每个节点的
flannel.1有唯一的IP和MAC地址(例如10.244.1.0的节点VTEP IP可能是10.244.1.1)。
- VTEP(VXLAN Tunnel Endpoint):可以理解为一个“隧道口”,负责对数据包进行VXLAN封装/解封装。
3. ARP表与FDB表
(1) ARP表(Address Resolution Protocol)
- 作用:通过IP地址查询对应的MAC地址(像“通讯录”)。
- Flannel中的用途:
- 当Pod1(
10.244.1.2)要访问Pod2(10.244.2.3)时,需要知道目标Pod2的MAC地址。 - Flannel会预先填充ARP表,告诉节点:“
10.244.2.3的MAC地址是flannel.1的MAC”(避免广播询问)。 - 查看命令:
ip neigh show或arp -n。
- 当Pod1(
(2) FDB表(Forwarding Database)
- 作用:通过MAC地址查询对应的物理网络端口(像“快递分拣表”)。
- Flannel中的用途:
- 当
flannel.1需要发送VXLAN包时,通过FDB表知道:“目标VTEP的MAC(如52:54:00:12:34:56)应该通过哪个物理网卡发出去(如eth0)”。 - Flannel会预先填充FDB表,避免广播查询。
- 查看命令:
bridge fdb show(关注flannel.1相关的条目)。
- 当
4. 完整流程举例(Pod1 → Pod2跨节点通信)
- Pod1发送数据包:
- 目标IP是Pod2(
10.244.2.3),通过路由表发现需要走flannel.1。
- 目标IP是Pod2(
- 查询ARP表:
- 节点预先知道“
10.244.2.3的MAC是flannel.1的MAC”(如52:54:00:12:34:56)。
- 节点预先知道“
- 查询FDB表:
- 节点知道“MAC
52:54:00:12:34:56对应的物理出口是eth0,且目标节点IP是192.168.1.2”。
- 节点知道“MAC
- VXLAN封装:
- 原始包被加上VXLAN头(VNI=1)和外层UDP/IP头(目标IP=
192.168.1.2)。
- 原始包被加上VXLAN头(VNI=1)和外层UDP/IP头(目标IP=
- 物理网络传输:
- 封装后的包通过
eth0发送到目标节点。
- 封装后的包通过
- 目标节点解封装:
- 对端节点的
flannel.1解包,通过cni0将数据传给Pod2。
- 对端节点的
5. 为什么需要预填充ARP和FDB表?
- 避免广播风暴:如果每次跨节点通信都靠广播查询MAC或端口,网络效率会极低。
- Flanneld的作用:
- 监听ETCD/K8s API,获取所有节点的VTEP信息(IP/MAC)。
- 提前在本地ARP和FDB表中写好规则,实现“直接转发”。
总结
| 组件/概念 | 作用 |
|---|---|
cni0 |
由CNI的bridge插件创建,负责同一节点内Pod的二层通信。 |
flannel.1 |
VXLAN的VTEP,负责跨节点通信时的封装/解封装。 |
| ARP表 | 存储“IP→MAC”映射,Flannel预填充以避免广播查询。 |
| FDB表 | 存储“MAC→物理端口”映射,Flannel预填充以确定VXLAN包的外层出口。 |
浙公网安备 33010602011771号