一、简介

        flannel是coreos团队针对k8s设计的一个网络规划服务,简单来说,他的功能是让集群中的不同节点主机创建的docker容器具有全集群唯一的虚拟IP地址。

       在默认的docker配置中,每个节点上的docker服务会分别负责所在节点容器的IP分配。这样导致的一个问题是,不同节点上容器可能获得相同的内外IP地址。并使这些容器之间能够通过IP地址相互找到,也就是互相ping通。

       flannel的设计目的就是为集群中的所有节点重新规划IP地址的使用规则,从而使得不同节点上的容器能够获得“同属一个内网”且“不重复”的IP地址,并让属于不同节点上的容器能够直接通过内网IP通信。

       flannel实际上是一种“覆盖网络(overlaynetwork)”,也就是将TCP数据包装在另一种网络包里面进行路由转发和通信,目前已经支持udp、vxlan、host-gw、aws-vpc、gce和alloc路由等数据转发方式,默认的节点间数据通信是UDP转发。

flannel的特点:

(1)是集群中的不同node主机创建的docker容器都具有全集群唯一的虚拟IP地址

(2)建立一个覆盖网络(overlay network),通过这个覆盖网络,将数据包原封不动的传递到目标容器。覆盖容器是建立在另一个网络之上并由其基础设施支持的虚拟网络。覆盖网络通过将一个分组封装在另一个分组内来将网络服务与底层基础实施分离。在将封装的数据包转发到端点后,将其解封。

(3)创建一个新的虚拟网卡flannel0接受docker网桥的数据,通过维护路由表,通过维护路由表,对接受到的数据进行封包和转发(vxlan)

(4)etcd保证了所有node上flannel所看到的配置是一致的。同时每个node上的flanned监控etcd上的数据变化,实时感知集群中node的变化。

二、flannel对网络要求提出的解决方法

  • (一)互相不冲突的IP

(1)flannel利用k8s api通过etcd存储整个集群的网络配置,根据配置记录集群使用的网段。

(2)flannel在每个主机上建立flanneld作为agent,它会为所在主机从集群的网络地址空间中获取一个小网段subnet,本主机内所有容器IP将从中分配

Node01节点:

Node02节点:

在flannel network中,每个pod都会分配一个唯一的IP地址,且每个k8s node的subent不重叠

(二)pod之间互相访问

(1)flanneld将本机获取的subnet以及主机之间通信的public ip通过etcd存储起来,需要时发给相应模块

(2)flanneld通过各种 backend mechanism,如vxlan、udp等跨主机转发容器之间的网络流量,完成容器之间的跨主机通信。

三、flannel架构原理

  • (一)flannel架构图和各组件
  • (1)cni0:网桥设备,每创建一个pod都会创建一对veth pair。其中一端是pod中的eth0,另一端是cni0网桥的端口(网卡)。pod中从网卡eth0发出的流量都会发送到cni网桥设备的端口(网卡上)
  • cni0设备获得的IP地址是该节点分配到的网段的第一个地址。

    (2)flannel.1:overlay网络的设备,用来进行vxlan报文的处理(封包和解包)。不同node之间的pod数据流量都从overlya设备以隧道的形式发送到对端。 

 

 

(3)不同node上的Pod的通信流程:

1)pod产生数据,根据pod的路由信息,将数据发送到cni0

2)cni0根据节点的路由表,将数据发送到隧道设备flannel.1

3)flannel.1查看数据包的目的IP,从flanneld获得对端隧道设备的必要信息,封装数据包。

4)flannel.1将数据包发送到对端设备。对端节点的网卡接收到数据包,发现数据包为overlay数据包,解开外层封装,并发送内层封装到flannel.1设备。

5)flannel.1设备查看数据包,根据路由表匹配,将数据发送给cni0设备。

6)cni0匹配路由表,发送数据给网桥上对应的端口。

 

 

 

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐