有关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)。

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 showarp -n

(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跨节点通信)

  1. Pod1发送数据包
    • 目标IP是Pod2(10.244.2.3),通过路由表发现需要走flannel.1
  2. 查询ARP表
    • 节点预先知道“10.244.2.3的MAC是flannel.1的MAC”(如52:54:00:12:34:56)。
  3. 查询FDB表
    • 节点知道“MAC 52:54:00:12:34:56对应的物理出口是eth0,且目标节点IP是192.168.1.2”。
  4. VXLAN封装
    • 原始包被加上VXLAN头(VNI=1)和外层UDP/IP头(目标IP=192.168.1.2)。
  5. 物理网络传输
    • 封装后的包通过eth0发送到目标节点。
  6. 目标节点解封装
    • 对端节点的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包的外层出口。
posted on 2025-05-31 09:55  Leo-Yide  阅读(33)  评论(0)    收藏  举报