k8s flannel原理

flannel:

Flannel是CoreOS维护的一个网络组件,Flannel为每个Pod提供全局唯一的IP,Flannel使用ETCD来存储Pod子网与Node IP之间的关系。flanneld守护进程在每台主机上运行,并负责维护ETCD信息和路由数据包。实现不同node之间pod的网络通讯。

Flannel工作模式及原理:

Flannel支持多种数据转发方式:

UDP:最早支持的一种方式,由于性能最差,目前已经弃用。

VXLAN:Overlay Network方案,源数据包封装在另一种网络包里面进行路由转发和通信

这也是网络的虚拟化技术,也就是原来是有一个包数据包,有源IP和目的IP,但由于某些情况这个数据包到达不了目的地址上,这可能就会借助物理上的以太网网络进行封装一个数据包带上,然后通过这种物理网络传输到目的地址上,这是一种叠加式的网络,里面是有两种数据包的,这种也叫做隧道方案

Host-GW:Flannel通过在各个节点上的Agent进程,将容器网络的路由信息刷到主机的路由表上,这样一来所有的主机都有整个容器网络的路由数据了,这样它就知道这个数据包到达这个节点转发到这个机器上,也就是路由表之间转发的,这种也叫路由方案。
vxlan工作模式图:
在这里插入图片描述
容器路由:容器根据路由表从eth0发出

/ # ip route
default via 10.244.0.1 dev eth0 
10.244.0.0/24 dev eth0 scope link  src 10.244.0.45 
10.244.0.0/16 via 10.244.0.1 dev eth0

主机路由:数据包进入到宿主机虚拟网卡cni0,根据路由表转发到flannel.1虚拟网卡,也就是,来到了隧道的入口。

ip route
default via 192.168.31.1 dev ens33 proto static metric 100 
10.244.0.0/24 dev cni0 proto kernel scope link src 10.244.0.1 
10.244.1.0/24 via 10.244.1.0 dev flannel.1 onlink 
10.244.2.0/24 via 10.244.2.0 dev flannel.1 onlink 

VXLAN封装:而这些VTEP设备(二层)之间组成二层网络必须要知道目的MAC地址。这个MAC地址从哪获取到呢?其实在flanneld进程启动后,就会自动添加其他节点ARP记录,可以通过ip命令查看,如下所示:

ip neigh show dev flannel.1
10.244.1.0 lladdr ca:2a:a4:59:b6:55 PERMANENT
10.244.2.0 lladdr d2:d0:1b:a7:a9:cd PERMANENT

二次封包:知道了目的MAC地址,封装二层数据帧(容器源IP和目的IP)后,对于宿主机网络来说这个帧并没有什么实际意义。接下来,Linux内核还要把这个数据帧进一步封装成为宿主机网络的一个普通数据帧,好让它载着内部数据帧,通过宿主机的eth0网卡进行传输。
封装到UDP包发出去:现在能直接发UDP包嘛?到目前为止,我们只知道另一端的flannel.1设备的MAC地址,却不知道对应的宿主机地址是什么。

flanneld进程也维护着一个叫做FDB的转发数据库,可以通过bridge fdb命令查看:

bridge fdb show  dev flannel.1

d2:d0:1b:a7:a9:cd dst 192.168.31.61 self permanent
ca:2a:a4:59:b6:55 dst 192.168.31.63 self permanent

可以看到,上面用的对方flannel.1的MAC地址对应宿主机IP,也就是UDP要发往的目的地。使用这个目的IP进行封装。

数据包到达目的宿主机:Node1的eth0网卡发出去,发现是VXLAN数据包,把它交给flannel.1设备。flannel.1设备则会进一步拆包,取出原始二层数据帧包,发送ARP请求,经由cni0网桥转发给container。

Host-GW工作:

host-gw模式相比vxlan简单了许多, 直接添加路由,将目的主机当做网关,直接路由原始封包。

切换成host-gw的模式,上面的转发还是一样,pod1容器的网卡先连接veth到宿主机上,然后到达cni0的网桥上,这个网桥就相当于一个二层的交换机,这个数据包到cni的网桥之后,也就是到达宿主机上,那么宿主机的网络协议栈会根据路由表决定转发到哪个网关上,因为它的目的IP地址不是同网段的,肯定走路由表,它会根据路由表判断目的地址是2.10,也就是来自这个数据的数据包转发到了它的下一跳,也就是网关,通过接口之间转发到31.63上了,也就是直接安照宿主机的网络,因为这个数据包是宿主机处理的,所以宿主机要想访问31.63,会进行重新封包,目的地址就是31.63,它判断了31.63下一跳的网关是同一子网,而且是二层的传输,二层的传输又需要获取到目的的mac地址,如果它本地不知道31.63的mac地址的话,它会发送一个ARP广播包,知道了对方的mac就进行封包,所以经过二层的传输到达31.63,31.63收到之后数据包之后,它又会去判断路由表了,然后进入cni的网桥,二层又转发到了容器里面。

最重要两条,host-gw是把每个节点都当成一个网关,它会加入其他节点并设成网关,当数据包到达这个节点的时候,就根据路由表之间发送到下一跳了,也就是节点IP,这个都是同网段的IP,直接通过2层之间把这个数据,转发到另一个节点上,另一个节点再根据另一条规则,根据目的的地址转发到cni网桥,cni网桥根据2层又转发到容器里面,一个是数据的流入,就是当数据包到达这个节点之后,然后发给谁,这是流入数据包,一个是数据包的流出,当从节点出来的数据包,应该转发到哪个node上,这些都是由flannel去维护的

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值