法兰绒格子衬衫在互联网语境中,日渐成为“IT技术宅”的标配。
但是,实际上,大家不知道的是,法兰绒因其制作工艺,以及紧致柔软的特点,也得到了很多姑娘们的青睐。
法兰绒的英文是flannel,巧合地,kubernetes最常用的网络插件之一也叫这个名字。它和法兰绒一样,设计精致而具有柔性,成为了最常见的容器SDN软件实现方案之一。
在上期专题中,我们提到,无论是bridge的二层工作方式,还是三层工作方式,均难以满足不同CIDR跨node互通的需求。因此,工程师们想到了利用overlay的方式,即:构建网络隧道来实现不同node上的pod互联互通。
flannel就是容器overlay网络的一种实现方式。它是由coreos开发的。
flannel也同样实现了CNI的四大命令:
add, del, check, version.
让我们去pornhub(打错了,划掉) github上找到它的主页:
https://github.com/coreos/flannel-cni
(由于某人抗议我贴代码,在此省略1000行)
https://github.com/containernetworking/plugins/blob/master/plugins/meta/flannel/flannel.go
我们在代码中发现,flannel的add命令实现,竟然调用了bridge!
如果用以下的环境变量调用flannel:
FLANNEL_NETWORK=172.18.0.0/16
FLANNEL_SUBNET=172.18.6.1/24
FLANNEL_MTU=1450
FLANNEL_IPMASQ=false
flannel会生成以下的配置文件,并调用bridge:
{
"name": “cni0",
"type": "bridge",
"mtu": 1472,
"ipMasq": false,
"isGateway": true,
"ipam": {
"type": "host-local",
"subnet": "172.18.6.1/24"
}
}
我们注意到,两个MTU的区别——细节就隐藏在魔鬼中!
错了,是魔鬼隐藏在细节中。
flannel的MTU是1450。
它比以太网的1500差的50字节,是用于VXLAN头部的开销 (14B Eth + 20B IP + 8B UDP + 8B VXLAN)。
而bridge的MTU是1472,与1500相差的28字节,是由IP的20字节+8字节的NVGRE头部构成的。
那么,问题来了——基于所有公开资料,flannel使用VXLAN作为overlay。为什么这里还出现了NVGRE呢?
原来,flannel只是借用了bridge的二层转发机制。对于跨Node的Pod互通,还是需要使用VXLAN Overlay的,如下图所示:
如图,flannel使用了172.18.0.0/16网段,划分出172.18.6.0/24,172.18.7.0/24和172.18.8.0/24三个网段,彼此之间通过VXLAN互通。
让我们再次拿出这张图——
将VM换成POD,OVS换成Bridge:
这个图,我们实际上已经快背下来了——在docker的swarm网络中,也是这样实现VXLAN封装和解封装的,这个模型叫做主机overlay模型,每个node的Bridge(虚拟交换机)作为VXLAN网关。
但是,我们还有几个关键问题没有搞清楚:
这两个问题请看下期。