简介
Flannel是CoreOS团队针对Kubernetes设计的一个网络规划服务,简单来说,它的功能是让集群中的不同节点主机创建的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上flanned所看到的配置是一致的。同时每个node上的flanned监听etcd上的数据变化,实时感知集群中node的变化。
flannel对网络要求提出的解决方法
一、互相不冲突的IP
1.flannel利用kubernetes Api通过ETCD存储整个集群的网络配置,根据配置记录集群使用的网段
2.flannel在每个主机上英雄flanneld作为agent,它会为所在主机从集群的网络地址空间中获取一个小网段subnet,本主机内所有容器IP将从中分配
1)Node01节点
2)Node02节点
在flannel network中,每个Pod都会分配一个唯一的IP地址,且每个k8s Node的subnet不重叠
二、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数据流量都从overlay设备以隧道的形式发送到对端
3.flanneld:flannel会在每个主机运营flanneld作为agent,它会会主机在集群网络地址空间中获取一个小网段,本机内所有容器的IP地址都从中分配;
同时flanneld会监听etcd,为flannel.1设备提供封装时必要的mac、ip等网络数据信息
二、不同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匹配路由表,发送数据给网桥上对应的端口
具体的通信流程