29

简单聊聊Calico与Flannel

 3 years ago
source link: http://dockone.io/article/10501
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

【编者的话】

本人在接触k8s的2年多过程中对于flannel和calico都使用过,也查阅资料了解过此两种网络的底层,今天简单聊聊Calico与Flannel两种网络,如有错误之处欢迎指正。

容器虚拟化网络方案,总体分为2种截然不同的发展路线:

基于隧道

基于路由

基于隧道

1、隧道方案最具普适性,在任何网络环境下都可以正常工作,这与它的原理密不可分。

2、最常见的隧道方案是 flannel vxlan模式 ,以及 calico的ipip模式 ,其核心原理包含了2个部分。

分配网段

每台宿主机上都有网络插件的agent进程,它们连接到etcd集中式存储,从虚拟IP池中申请一个IP段占位己有,宿主机上每个容器则从IP段中分配得到1个虚拟IP。

封装/解封

1)、当不同宿主机上的容器互相访问时,数据包的源IP和目标IP都是容器IP。

2)、数据包经过宿主机的agent进程进行封装后,新数据包的源IP和目标IP则变成了两端宿主机的物理IP。

3)、数据包送到目标宿主机后,经过agent解封后得到原始数据包,并将数据包送入容器中处理,这就给两端容器营造了一种互通的感觉。

4)、因为物理IP属于3层网络,可以在互联网中经过中间路由设备互相送达,所以隧道方案对宿主机之间的网络环境没有特殊要求,因此隧道方案具备普适性。

优势/劣势

优势就是对物理网络环境没有特殊要求,只要宿主机IP层可以路由互通即可。

劣势就是 性能差 ,这需要从以下方面看:

封包和解包耗费CPU性能;

额外的封装导致带宽浪费,大约有30%左右的带宽损耗;

flannel vxlan和calico ipip模式都是隧道方案,但是calico的封装协议IPIP的header更小,所以性能比flannel vxlan要好一点点。

基于路由

1、路由方案性能最好,原因是该方案不需要封包和解包,所以没有隧道方案的劣势,网络性能很好。

2、常见的路由方案包括了 flannel的host-gw模式 ,以及 calico的bgp模式

下面以calico bpg模式为例,分析基于路由的方案原理,其包含了3个部分。

分配网段

每台宿主机也有agent,会从etcd中的虚拟IP池分配到一个IP子网段,宿主机上每个容器则从该IP段中分配得到1个虚拟IP。

本地路由

1)、假设我们在宿主机A上新建了一个容器,则该容器分配了一个虚拟IP,我们假设它是值是k。

2)、agent会在本机配置一条路由规则,即:如果数据包的目标地址等于k,那么把数据包送到容器的虚拟网卡上。

3)、另外一台宿主机B上的一个容器,其IP是m,向k容器发数据包,则数据包的目标地址是k,原地址是m。

4)、既然路由方案是不使用隧道封包为物理IP在网络中流通的,那么该数据包又该如何送达到虚拟IP k呢?

广播路由

1)、路由方案会采用如下的手段,搞定m到k的虚拟IP互通问题。

2)、即宿主机A会通过某种方式(比如BGP广播协议)把自己的虚拟IP网段广播给宿主机B。

3)、在宿主机B收到广播后,会给本机配置一条路由规则:如果数据包的目标地址属于宿主机A的虚拟IP网段,则把该数据包发给宿主机A的物理IP。

4)、这条路由规则相当于为宿主机A的虚拟IP网段配置了转发网关,而这个网关就是宿主机A的物理IP。这就要求,宿主机B和宿主机A在2层网络是互通的,也就是它们在一个交换机下面,可以基于MAC地址直接互通。

5)、一旦该数据包被送往宿主机A的物理IP,则宿主机A就可以应用刚才讲过的”本地路由“规则了,即:数据包的目标IP是k,直接送给对应容器的虚拟网卡。

整个过程中从m发往k的数据包采用的都是虚拟容器IP,没有经过任何封装和解封,而仅仅是通过宿主机B收到的广播路由+宿主机A的本地路由,就实现了在2层网络互通环境下的高效通讯。

优势/劣势

优势就是没有封包和解包过程,完全基于两端宿主机的路由表进行转发。

劣势包含2方面:

要求宿主机处于同一个2层网络下,也就是连在一台交换机上,这样才能基于MAC通讯,而不需要在IP上动封包/解包的手脚。

路由表膨胀导致性能降低,因为宿主机上每个容器需要在本机添加一条路由规则,而不同宿主机之间需要广播自己的网段路由规则。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK