kubernetes网络外挂对比分析(flannel、calico、weave)

本文将在介绍技术原理和相应术语的基础上,再集中探索与详细对比目前最流行的CNI外挂:
FlannelCalicoWeave
介绍
网络架构是Kubernetes中较为复杂、让很多使用者头疼的方面之一。Kubernetes网络模型本身对某些特定的网络功能有一定要求,但在实现方面也具有一定的灵活性。因此,业界已有不少不同的网络方案,来满足特定的环境和要求。CNI意为容器网络界面,它是一种标准的设计,为了让使用者在容器建立或销毁时都能够更容易地配置容器网络。在本文中,我们将集中探索与对比目前最流行的CNI外挂:Flannel、Calico、Weave和Canal(技术上是多个外挂的组合)。这些外挂既可以确保满足Kubernetes的网络要求,又能为Kubernetes丛集管理员提供他们所需的某些特定的网络功能。
背景
容器网络是容器选择连线到其他容器、主机和外部网络(如Internet)的机制。容器的Runtime提供了各种网络模式,每种模式都会产生不同的体验。例如,Docker预设情况下可以为容器配置以下网络:
none:将容器新增到一个容器专门的网络堆叠中,没有对外连线。host:将容器新增到主机的网络堆叠中,没有隔离。default bridge:预设网络模式。每个容器可以通过IP地址相互连线。自定义网桥:使用者定义的网桥,具有更多的灵活性、隔离性和其他便利功能。Docker还可以让使用者通过其他驱动程式和外挂,来配置更高阶的网络(包括多主机覆盖网络)。
CNI的初衷是建立一个框架,用于在配置或销毁容器时动态配置适当的网络配置和资源。下面连结中的CNI规范概括了用于配制网络的外挂界面,这个界面可以让容器执行时与外挂进行协调:
https://github.com/containernetworking/cni/blob/master/SPEC.md
外挂负责为界面配置和管理IP地址,并且通常提供与IP管理、每个容器的IP分配、以及多主机连线相关的功能。容器执行时会呼叫网络外挂,从而在容器启动时分配IP地址并配置网络,并在删除容器时再次呼叫它以清理这些资源。
执行时或协调器决定了容器应该加入哪个网络以及它需要呼叫哪个外挂。然后,外挂会将界面新增到容器网络名称空间中,作为一个veth对的一侧。接着,它会在主机上进行更改,包括将veth的其他部分连线到网桥。再之后,它会通过呼叫单独的IPAM(IP地址管理)外挂来分配IP地址并设定路由。
在Kubernetes中,kubelet可以在适当的时间呼叫它找到的外挂,来为通过kubelet启动的pod进行自动的网络配置。
术语
在对CNI外挂们进行比较之前,我们可以先对网络中会见到的相关术语做一个整体的了解。不论是阅读本文,还是今后接触到其他和CNI有关的内容,了解一些常见术语总是非常有用的。一些最常见的术语包括:
第2层网络:OSI(Open Systems Interconnections,开放系统互连)网络模型的“资料链路”层。第2层网络会处理网络上两个相邻节点之间的帧传递。第2层网络的一个值得注意的示例是以太网,其中MAC表示为子层。第3层网络:OSI网络模型的“网络”层。第3层网络的主要关注点,是在第2层连线之上的主机之间路由资料包。IPv4、IPv6和ICMP是第3层网络协议的示例。VXLAN:代表“虚拟可扩充套件LAN”。首先,VXLAN用于通过在UDP资料报中封装第2层以太网帧来帮助实现大型云部署。VXLAN虚拟化与VLAN类似,但提供更大的灵活性和功能(VLAN仅限于4096个网络ID)。VXLAN是一种封装和覆盖协议,可在现有网络上执行。Overlay网络:Overlay网络是建立在现有网络之上的虚拟逻辑网络。Overlay网络通常用于在现有网络之上提供有用的抽象,并分离和保护不同的逻辑网络。封装:封装是指在附加层中封装网络资料包以提供其他上下文和资讯的过程。在overlay网络中,封装被用于从虚拟网络转换到底层地址空间,从而能路由到不同的位置(资料包可以被解封装,并继续到其目的地)。网状网络:网状网络(Mesh network)是指每个节点连线到许多其他节点以协作路由、并实现更大连线的网络。网状网络允许通过多个路径进行路由,从而提供更可靠的网络。网状网格的缺点是每个附加节点都会增加大量开销。BGP:代表“边界闸道器协议”,用于管理边缘路由器之间资料包的路由方式。BGP通过考虑可用路径,路由规则和特定网络策略,帮助弄清楚如何将资料包从一个网络传送到另一个网络。BGP有时被用作CNI外挂中的路由机制,而不是封装的覆盖网络。了解了技术术语和支援各类外挂的各种技术之后,下面我们可以开始探索一些最流行的CNI外挂了。
CNI比较
Flannel
连结:https://github.com/coreos/flannel
由CoreOS开发的专案Flannel,可能是最直接和最受欢迎的CNI外挂。它是容器编排系统中最成熟的网络结构示例之一,旨在实现更好的容器间和主机间网络。随着CNI概念的兴起,Flannel CNI外挂算是早期的入门。
与其他方案相比,Flannel相对容易安装和配置。它被打包为单个二进位制档案FlannelD,许多常见的Kubernetes丛集部署工具和许多Kubernetes发行版都可以预设安装Flannel。Flannel可以使用Kubernetes丛集的现有etcd丛集来使用API储存其状态资讯,因此不需要专用的资料储存。
Flannel配置第3层IPv4 Overlay网络。它会建立一个大型内部网络,跨越丛集中每个节点。在此Overlay网络中,每个节点都有一个子网,用于在内部分配IP地址。在配置Pod时,每个节点上的Docker桥界面都会为每个新容器分配一个地址。同一主机中的Pod可以使用Docker桥接进行通讯,而不同主机上的pod会使用flanneld将其流量封装在UDP资料包中,以便路由到适当的目标。
Flannel有几种不同型别的后端可用于封装和路由。预设和推荐的方法是使用VXLAN,因为VXLAN效能更良好并且需要的手动干预更少。
总的来说,Flannel是大多数使用者的不错选择。从管理角度来看,它提供了一个简单的网络模型,使用者只需要一些基础知识,就可以设定适合大多数用例的环境。一般来说,在初期使用Flannel是一个稳妥安全的选择,直到你开始需要一些它无法提供的东西。
Calico

连结:https://github.com/projectcalico/cni-plugin
Calico是Kubernetes生态系统中另一种流行的网络选择。虽然Flannel被公认为是最简单的选择,但Calico以其效能、灵活性而闻名。Calico的功能更为全面,不仅提供主机和pod之间的网络连线,还涉及网络安全和管理。Calico CNI外挂在CNI框架内封装了Calico的功能。
在满足系统要求的新配置的Kubernetes丛集上,使用者可以通过应用单个manifest档案快速部署Calico。如果您对Calico的可选网络策略功能感兴趣,可以向丛集应用其他manifest,来启用这些功能。
尽管部署Calico所需的操作看起来相当简单,但它建立的网络环境同时具有简单和复杂的属性。与Flannel不同,Calico不使用overlay网络。相反,Calico配置第3层网络,该网络使用BGP路由协议在主机之间路由资料包。这意味着在主机之间移动时,不需要将资料包包装在额外的封装层中。BGP路由机制可以本地引导资料包,而无需额外在流量层中打包流量。
除了效能优势之外,在出现网络问题时,使用者还可以用更常规的方法进行故障排除。虽然使用VXLAN等技术进行封装也是一个不错的解决方案,但该过程处理资料包的方式同场难以追踪。使用Calico,标准除错工具可以访问与简单环境中相同的资讯,从而使更多开发人员和管理员更容易理解行为。
除了网络连线外,Calico还以其先进的网络功能而闻名。 网络策略是其最受追捧的功能之一。此外,Calico还可以与服务网格Istio整合,以便在服务网格层和网络基础架构层中解释和实施丛集内工作负载的策略。这意味着使用者可以配置强大的规则,描述Pod应如何传送和接受流量,提高安全性并控制网络环境。
如果对你的环境而言,支援网络策略是非常重要的一点,而且你对其他效能和功能也有需求,那么Calico会是一个理想的选择。此外,如果您现在或未来有可能希望得到技术支援,那么Calico是提供商业支援的。一般来说,当您希望能够长期控制网络,而不是仅仅配置一次并忘记它时,Calico是一个很好的选择。
Weave

连结:https://www.weave.works/oss/net/
Weave是由Weaveworks提供的一种Kubernetes CNI网络选项,它提供的模式和我们目前为止讨论的所有网络方案都不同。Weave在丛集中的每个节点之间建立网状Overlay网络,参与者之间可以灵活路由。这一特性再结合其他一些独特的功能,在某些可能导致问题的情况下,Weave可以智慧地路由。
为了建立网络,Weave依赖于网络中每台主机上安装的路由元件。然后,这些路由器交换拓扑资讯,以维护可用网络环境的最新检视。当需要将流量传送到位于不同节点上的Pod时,Weave路由元件会自动决定是通过“快速资料路径”传送,还是回退到“sleeve”分组转发的方法。
快速资料路径依靠核心的本机Open vSwitch资料路径模组,将资料包转发到适当的Pod,而无需多次移入和移出使用者空间。Weave路由器会更新Open vSwitch配置,以确保核心层具有有关如何路由传入资料包的准确资讯。相反,当网络拓扑不适合快速资料路径路由时,sleeve模式可用作备份。它是一种较慢的封装模式,在快速资料路径缺少必要的路由资讯或连线的情况下,它可以来路由资料包。当流量通过路由器时,它们会了解哪些对等体与哪些MAC地址相关联,从而允许它们以更少的跳数、更智慧地路由后续流量。当网络更改导致可用路由改变时,这一相同的机制可以帮助每个节点进行自行更正。
与Calico一样,Weave也为Kubernetes丛集提供网络策略功能。设定Weave时,网络策略会自动安装和配置,因此除了新增网络规则之外,使用者无需进行其他配置。一个其他网络方案都没有、Weave独有的功能,是对整个网络的简单加密。虽然这会增加相当多的网络开销,但Weave可以使用NaCl加密来为sleeve流量自动加密所有路由流量,而对于快速资料路径流量,因为它需要加密核心中的VXLAN流量,Weave会使用IPsec ESP来加密快速资料路径流量。
对于那些寻求功能丰富的网络、同时希望不要增加大量复杂性或管理难度的人来说,Weave是一个很好的选择。它设定起来相对容易,提供了许多内建和自动配置的功能,并且可以在其他解决方案可能出现故障的场景下提供智慧路由。网状拓扑结构确实会限制可以合理容纳的网络的大小,不过对于大多数使用者来说,这也不是一个大问题。此外,Weave也提供收费的技术支援,可以为企业使用者提供故障排除等等技术服务。
结语
Kubernetes采用的CNI标准,让Kubernetes生态系统中的网络解决方案百花齐放。更多样的选择,意味着大多数使用者将能够找到适合其当前需求和部署环境的CNI外挂,同时还可以在环境发生变化时也能找到新的解决方案。不同企业之间的运营要求差异很大,因此拥有一系列具有不同复杂程度和功能丰富性的成熟解决方案,大大有助于Kubernetes在满足不同使用者独特需求的前提下,仍然能够提供一致的使用者体验。