【K8S】Flannel网络方案

1.、Flannel简介

Flannel 由CoreOS开发,用于解决docker集群跨主机通讯的覆盖网络(overlay network),
它的主要思路是:预先留出一个网段,每个主机使用其中一部分,然后每个容器被分配不同的ip;
让所有的容器认为大家在同一个直连的网络,底层通过UDP/VxLAN/Host-GW等进行报文的封装和转发。

1. Flannel实质上是一种“覆盖网络(overlaynetwork)”,也就是将TCP数据包装在另一种网络包
里面进行路由转发和通信,目前已经支持udp、vxlan、host-gw、aws-vpc、gce和alloc路由等
数据转发方式, 默认的节点间数据通信方式是UDP转发。
2. 它的功能是 让集群中的不同节点主机创建的Docker容器都具有全集群唯一的虚拟IP地址。
3. Flannel的设计目的就是 为集群中的所有节点重新规划IP地址的使用规则,从而使得不同
节点上的容器能够获得同属一个内网且不重复的IP地址,并让属于不同节点上的容器能够直接
通过内网IP通信。

2、Flannel实现原理

集群中的不同节点上,创建的Pod具有全集群唯一的虚拟IP地址。
建立一个覆盖网络(overlay network),通过这个覆盖网络,将数据包原封不动的传递到目标容器。
覆盖网络通过将一个分组封装在另一个分组内来将网络服务与底层基础设施分离。
在将封装的数据包转发到端点后,将其解封装。
创建一个新的虚拟网卡flannel0接收docker网桥的数据,通过维护路由表,对接收到的数据
进行封包和转发(vxlan)。
etcd保证了所有node上flanned所看到的配置是一致的。同时每个node上的flanned监听etcd上的
数据变化,实时感知集群中node的变化。
容器直接使用目标容器的ip访问,默认通过容器内部的eth0发送出去。

报文通过veth pair被发送到vethXXX。
vethXXX是直接连接到虚拟交换机docker0的,报文通过虚拟bridge docker0发送出去。
查找路由表,外部容器ip的报文都会转发到flannel0虚拟网卡,这是一个P2P的虚拟网卡,
然后报文就被转发到监听在另一端的flanneld。

flanneld通过etcd维护了各个节点之间的路由表,把原来的报文UDP封装一层,通过配置的iface发送出去。
报文通过主机之间的网络找到目标主机。
报文继续往上,到传输层,交给监听在8285端口的flanneld程序处理。
数据被解包,然后发送给flannel0虚拟网卡。
查找路由表,发现对应容器的报文要交给docker0。
docker0找到连到自己的容器,把报文发送过去。

简单理解:
容器10.1.15.2/24访问10.0.20.3/24,经过所在主机的docker0,也就相当于这个容器的网关,
转发到flannel0虚拟网卡,经过flanneld进行处理,将源容器的ip和目的容器的ip封装成内部ip,
将源物理网卡的网关和目的物理网卡的网关封装成外部ip,并同时封装其MAC地址,
源主机的flanneld服务将原本的数据内容UDP封装后根据自己的路由表投递给目的节点的flanneld服务,
数据到达以后被解包,然后进入目的节点flannel0虚拟网卡,然后被转发到目的主机的docker0虚拟网卡,
传递到对应ip的容器

3.Flannel网络概述

Overlay Network:
覆盖网络,在基础网络上叠加的一种虚拟网络技术模式,该网络中的主机通过虚拟链路连接起来
类似VPN隧道,原理为在物理网络上实现的逻辑网络

VXLAN:
将源数据包封装到UDP中,并使用基础网络的IP/MAC作为外层包头进行封装,然后在以太网上传输,
到达目的地后由隧道断电解封并将数据发给目标地址

Flannel:
是Overlay网络的一种,也是将源数据包封装在另一种网络包中进行路由转发和通信,
目前已支持UDP、 VXLAN 、AWS VPN和GCE路由等数据转发方式

--特点
hostgw:这种方式就是直接路由
vxlan:是flannel推荐的方式。需要通信的网络设备能够支持vxlan协议
udp:该方式与vxlan很类似,它对ip层网络进行包装。通常用于调试环境或者
不支持vxlan协议网络环境中。

--不同node上的pod通信流程:

pod中的数据,根据pod的路由信息,发送到网桥 cni0
cni0 根据节点路由表,将数据发送到隧道设备flannel.1
flannel.1 查看数据包的目的ip,从flanneld获取对端隧道设备的必要信息,
封装数据包
flannel.1 将数据包发送到对端设备。对端节点的网卡接收到数据包,发现数据包为overlay
数据包,解开外层封装,并发送内层封装到flannel.1 设备
Flannel.1 设备查看数据包,根据路由表匹配,将数据发送给cni0设备
cni0匹配路由表,发送数据到网桥
cni0: 网桥设备,每创建一个pod都会创建一对 veth pair。其中一段是pod中的eth0,
另一端是cni0网桥中的端口。
flannel.1: vxlan网关设备,用户 vxlan 报文的解包和封包。不同的 pod 数据流量都从
overlay设备以隧道的形式发送到对端。flannel.1不会发送arp请求去获取目标IP的mac地址,
而是由Linux kernel将一个"L3 Miss"事件请求发送到用户空间的flanneld程序,
flanneld程序收到内核的请求事件后,从etcd中查找能够匹配该地址的子网flannel.1设备的mac地址,
即目标pod所在host中flannel.1设备的mac地址。
flanneld: 在每个主机中运行flanneld作为agent,它会为所在主机从集群的网络地址空间中,
获取一个小的网段subnet,本主机内所有容器的IP地址都将从中分配。同时Flanneld监听K8s集群数据库,
为flannel.1设备提供封装数据时必要的mac,ip等网络数据信息。
VXLAN:Virtual eXtensible Local Area Network,虚拟扩展局域网。
采用L2 over L4(MAC-in-UDP)的报文封装模式,将二层报文用三层协议进行封装,
实现二层网络在三层范围内进行扩展,同时满足数据中心大二层虚拟迁移和多租户的需求。
flannel只使用了vxlan的部分功能,VNI被固定为1。容器跨网络通信解决方案:如果集群的主机
在同一个子网内,则通过路由转发过去;若不在一个子网内,就通过隧道转发过去。

host-gw采用纯静态路由的方式,要求所有宿主机都在一个局域网内,跨局域网无法进行路由。
如果需要进行跨局域网路由,需要在其他设备上添加路由,但已超出flannel的能力范围。
可选择calico等使用动态路由技术,通过广播路由的方式将本机路由公告出去,从而实现跨局域网路由学习。
所有的子网和主机的信息,都保存在Etcd中,flanneld只需要watch这些数据的变化 ,实时更新 路由表 。
核心:IP包在封装成桢的时候,使用路由表的“下一跳”设置上的MAC地址,这样可以经过二层网络到达目的宿主机。

4. Flanneld 作用

Flanneld 收到 EventAdded 事件后,从 etcd 将其他主机上报的各种信息,
在本机上进行配置,主要分下列三种信息:
ARP: IP和MAC的对应关系,三层转发
FDB: MAC+VLAN和PORT的对应关系,二层转发,即使两个设备不在同一网段或者没配置IP,
只要两者之间的链路层是连通的,就可以通过FDB表进行数据转发。它作用就在于告诉设备从
某个端口出去就可以到某个目的MAC
Routing Table: 通往目标地址的封包,通过网关方式发送出去

5.模式对比

udp模式:使用设备flannel.0进行封包解包,不是内核原生支持,上下文切换较大,性能非常差
vxlan模式:使用flannel.1进行封包解包,内核原生支持,性能损失在20%~30%左右
host-gw模式:无需flannel.1这样的中间设备,直接宿主机当作子网的下一跳地址,性能损失大约在10%左右

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值