- 介绍
Flannel,VXLAN,接触过Kubernetes的同学应该都能说出这2个名词,那么再深入一点呢。
Overlay,虚拟隧道,UDP。没错,我们继续往下看。 - UDP
其实以UDP为后端的实现方式已经废弃了,不过其过程非常直观,适合学习。
先描述一下环境:
节点1
1.容器c1的ip 10.96.1.2
2.宿主机docker0 ip 10.96.1.1
节点2
1.容器c2的ip 10.96.2.3
2.宿主机2 docker0 ip 10.96.2.1
需求很简单,c1要访问到c2 。
访问流程:
1.c1容器要访问c2容器,10.96.2.3不在docker0网段里,走容器的默认路由,通过容器网关进入docker0
2.到达宿主机后,下一跳取决于宿主机的路由规则,Flannel先建立了一系列路由规则,于是进入flannel0
3.Flannel0发给另一机器上的Flannel0,Etcd上有记录目的机器IP,先匹配子网,Etcd中反查子网的宿主机IP,然后通讯
4.接着把IP包封装为UDP包,发给宿主机2的8285端口,每台宿主机都在监听该端口
5.由8285端口进入另一机器的Flannel应用,直接转给flannel0,用户态流向系统态,内核网络栈继续处理,路由表匹配
6.根据路由表上网段,10.96.2.x,要发送给docker0
7.docker0 继续充当二层交换机,把数据包发送给正确veth端口,出现在c2容器
很清晰明白吧,可惜被废弃了,因为效率太差,我们再看个头疼的。 - VXLAN
VXLAN,全名Virtual Extensible LAN 虚拟可扩展局域网,是Linux自带网络功能,解决了UDP性能的问题。
再描述一下环境:
节点1
1.容器c1的ip 10.0.15.2
2.宿主机docker0 ip 10.0.15…1
节点2
1.容器c2的ip 10.0.16.3
2.宿主机2 docker0 ip 10.0.16.1
需求很简单,c1要访问到c2 。
访问流程:
1.数据包仍然先到docker0,路由到flannel.1,需要找目标VTEP,该设备信息由每台宿主机上的flanneld进程维护,加入节点同时就会增加设备路由
2.走16网段的包要发给flannel.1,网关是16.0,而16.0就是另一台上的VTEP设备
3.VTEP间要想办法二层通信,源端收到包后,添加上目的端MAC,再发给目的端口
4.方式封装,目的VTEP的MAC地址+目的容器的IP,称为内部数据帧
5.需要再次封装,以通过eth0传输,又称为外部数据帧
6.做法是在内部数据帧加VXLAN头及VNI,再封装到UDP包由flannel.1发出去,需要的IP由FDB提供,由虚拟的MAC地址指向节点2的IP地址
7.第三次封装,IP头,MAC头,正常UDP包的传输操作 节点2宿主机,解析到VXLAN,按VNI交给flannel.1,flannel.1继续解包,按单机模式发给c2,居然有6个包头
以上便是VXLAN的大致传播过程,其中VTEP可以比照 企业vpn的使用经验,就是虚拟隧道两端的连接设备。
总结:仔细辨别的话,两种后端的差别比熊和熊猫的差别还大。你看出来了嘛,没有的话请再仔细看一遍。