zl程序教程

您现在的位置是:首页 >  其他

当前栏目

广角-聊聊Underlay

2023-04-18 12:54:22 时间

我一贯坚持一个观点:一图胜千言,晦涩冗长的技术文字可以用精致的图片完美地展现。据说人脑对图像的加工记忆能力大约是文字的1000倍,甭管它是真是假,我们对图片的敏感度和好感确实是远大于文字的,我们的脑袋可以长久地记住图片所包含的内容,却对大片的文字读过即忘。

我写设计文档的时候也会画图。文字总是抽象的,而图却是具象的。文学作品不适宜配过量的图,因为那样会限制读者对文字的想象力,每个人心中都有一个林黛玉才是美好的。但和文学作品不同,传递技术信息时,用图的方式可以更好地确保大家的理解是一致的且能达到事半功倍的效果,准确传递是首要目标。有三本我看过的书在这方面堪称典范:W.Richard Stevens《UNIX环境高级编程》、Marko Lukša《Kubernetes In Action》还有刘超《趣谈网络协议》。

连着两周聊Cilium,今天我们换个话题,聊聊容器网络的Underlay模式,换个口味,毕竟总吃一道菜容易没胃口。今天这篇是广角篇,你一定猜到了,下一篇是微距篇。

三大模式回顾

之前,二哥发过一篇推文“特洛伊木马-图解VXLAN容器网络通信方案”,当时主要聊的内容是容器网络方案中的一种,即通过VXLAN的方式将容器间的网络拓扑压扁,摊平,形成一个所谓flat network。其实VXLAN只是实现“扁平网络”这个目标的众多方式之一。将这些方式稍加归纳整理,我们大致可以将它们分为以下三种模式:

Overlay模式

这是最自由、开箱即用的方案。特点是方便、易用、自由。但自由是有代价的,与主机间通信效率相比,它的传输性能会有20-30%左右的下降。

性能损耗花在了什么地方呢?一个是隧道所带来的解/封装损耗,另一个是进出Pod的traffic要穿越两次网络栈(进两次,出也是两次)。解/封装的代价显而易见,而两次网络栈的穿越却很容易让人忽略。

如图1所示,Pod traffic在Pod network namespace和Node的network namespace分别会被处理一次,如果Node的network namespace里有大量的iptables rule的话,会出现较长的处理时间。图1中用红色标示出了"iptables overhead",意思是这部分是额外的工作量,言下之意是其实这部分工作量可以去掉,Cilium正是基于eBPF跳过了这些overhead,从而实现了明显的性能提升。

这种模式可供选择的实现有Flannel VXLAN,Calico IPIP等。

主机间路由模式

这里所谓的主机是指组成K8s集群的Node。主机间路由其实是将各个Node当成了边界路由器,每个Node是一个AS(Autonomous System),这很好理解,毕竟Linux是自带路由功能的。虽然容器网络和宿主机网络是两个平行的网络,但容器间通信可以直接通过宿主机网络路由。这个时候它俩的关系其实很像电信、联通这些网络运营商和阿里云、腾讯云这些云平台之间的关系,它们各自独立运营宽带网络(若干AS组成),但是电信联通会转发来自云平台的流量,对于运营商来说,它被称为 Transit AS。

这种模式优势非常明显:性能高,和主机间通信相比,容器间通信大概有10%左右的性能损耗,当然和Overlay模式一样,主机间路由同样会出现图1中所示的两次穿越网络栈的问题。

这种模式的缺点也非常明显:不是你想要就可以,因为它需要用到BGP协议,如果你使用的是云平台托管的容器服务,你几乎没有插手使用BGP的机会。

这种模式可供选择的实现有Flannel host-gw,Calico BGP等。

Underlay模式

Underlay这个词和Overlay相反,一下一上。这个模式特指让容器和宿主机处于同一网络,两者拥有相同的地位的网络方案。

主机间路由模式算是Underlay模式的一个特殊场景。但主机路由模式其实还是将宿主机网络和容器网络进行了主客之分。主场和地盘是宿主机的,只是允许容器网络的流量自由进出罢了。这就像孙权想要去益州的话,得经过荆州,但刘备认为那只是为友情干杯,给他借道而已,他自己才是荆州的主人,最靓的那个仔。

但Underlay模式却彻底抹去了地盘之争。这块地是大家的,大家生而平等,谁都可以自由进出。最重要的是没有任何性能损耗。

阿里云、GKE、AWS、Azure均提供了这种模式。这篇和下一篇重点聊聊这种模式。

图 1:进出Pod的traffic穿越两次网络栈

“扁平-K8s网络模型漫谈”这篇推文从10000英尺的高空俯瞰了宿主机网络和容器网络的关系,给有需要的人。

广角

用广角镜头拍摄的画面,在突出中央主体和前景的同时,还具有广泛的背景。本文要聊的中央主体和前景当然是下图中的Pod和虚拟机所组成的Underlay模式网络,但只关注它们是不够的,因为我们需要结合更多的背景来了解它们之间的关系。所以图2中我加入了更多的背景:Open vSwitch,VPC,接入交换机,汇聚交换机等等。

图 2:Underlay模式广角图

图2首先画出了一个数据中心主要的设备。进出物理机的流量会通过接入交换机、汇聚交换机和核心路由器。二哥是一个注重细节的人,你会发现连接不同等级的网络设备之间的线宽是不一样的,线越宽越代表它承载的流量越大,也意味着离骨干网越近。

同一个机架上的物理机通过接入交换机互联,而不同机架上的物理机则通过汇聚交换机互通。如果你愿意买个更广的镜头,会发现汇聚交换机用来连接一个可用区里所有的物理机,而核心交换机则连接了更多的可用区。

边界路由器限定了这个数据中心的边界,在它之外便是电信联通所运营的互联网,当然边界路由器会和多家运营商互联,此时它被称为Multihomed AS。边界路由器通过 BGP 协议,将自己数据中心里面的外网IP借助运营商的网络向外广播,告知全世界:我们在这里。

不同的数据中心则通过V**相连。

细心的你一定发现了在可用区A和可用区B里,Pod,虚拟机和物理机这三者之间,网络连接方面有很大的不同。可用区A里面用到了Open vSwitch,而可用区B里面没有。另外在可用区B里,Pod的网络设备名我特意改成了veth。不同的可用区在二层是否互通没有统一的做法。不通的话,可以避免网络广播风暴、二层环路等问题,通的话可以实现大二层,都在一个广播域里,方便横向扩展以满足日益增长的东西流量。

这样的不同对进出Pod的traffic会有什么样子的影响呢?请期待微距篇。