本文将在介绍技术原理和相应术语的基础上,再集中探索与详细对比目前最流行的CNI插件:Flannel、Calico、Weave和Canal,对比介绍它们的原理、使用方法、适用场景和优缺点等。git
介 绍github
网络架构是Kubernetes中较为复杂、让不少用户头疼的方面之一。Kubernetes网络模型自己对某些特定的网络功能有必定要求,但在实现方面也具备必定的灵活性。所以,业界已有很多不一样的网络方案,来知足特定的环境和要求。后端
CNI意为容器网络接口,它是一种标准的设计,为了让用户在容器建立或销毁时都可以更容易地配置容器网络。在本文中,咱们将集中探索与对比目前最流行的CNI插件:Flannel、Calico、Weave和Canal(技术上是多个插件的组合)。这些插件既能够确保知足Kubernetes的网络要求,又能为Kubernetes集群管理员提供他们所需的某些特定的网络功能。安全
背 景网络
容器网络是容器选择链接到其余容器、主机和外部网络(如Internet)的机制。容器的runtime提供了各类网络模式,每种模式都会产生不一样的体验。例如,Docker默认状况下能够为容器配置如下网络:架构
Docker还可让用户经过其余驱动程序和插件,来配置更高级的网络(包括多主机覆盖网络)。框架
CNI的初衷是建立一个框架,用于在配置或销毁容器时动态配置适当的网络配置和资源。下面连接中的CNI规范归纳了用于配制网络的插件接口,这个接口可让容器运行时与插件进行协调:工具
https://github.com/containern...性能
插件负责为接口配置和管理IP地址,而且一般提供与IP管理、每一个容器的IP分配、以及多主机链接相关的功能。容器运行时会调用网络插件,从而在容器启动时分配IP地址并配置网络,并在删除容器时再次调用它以清理这些资源。ui
运行时或协调器决定了容器应该加入哪一个网络以及它须要调用哪一个插件。而后,插件会将接口添加到容器网络命名空间中,做为一个veth对的一侧。接着,它会在主机上进行更改,包括将veth的其余部分链接到网桥。再以后,它会经过调用单独的IPAM(IP地址管理)插件来分配IP地址并设置路由。
在Kubernetes中,kubelet能够在适当的时间调用它找到的插件,来为经过kubelet启动的pod进行自动的网络配置。
术 语
在对CNI插件们进行比较以前,咱们能够先对网络中会见到的相关术语作一个总体的了解。不管是阅读本文,仍是从此接触到其余和CNI有关的内容,了解一些常见术语老是很是有用的。
一些最多见的术语包括:
了解了技术术语和支持各种插件的各类技术以后,下面咱们能够开始探索一些最流行的CNI插件了。
CNI比较
Flannel
连接:https://github.com/coreos/fla...
由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/projectcal...
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是一个很好的选择。
Canal
连接:https://github.com/projectcal...
Canal也是一个有趣的选择,缘由有不少。
首先,Canal 是一个项目的名称,它试图将Flannel提供的网络层与Calico的网络策略功能集成在一块儿。然而,当贡献者完成细节工做时却发现,很明显,若是Flannel和Calico这两个项目的标准化和灵活性都已各自确保了话,那集成也就没那么大必要了。结果,这个官方项目变得有些“烂尾”了,不过却实现了将两种技术部署在一块儿的预期能力。出于这个缘由,即便这个项目不复存在,业界仍是会习惯性地将Flannel和Calico的组成称为“Canal”。
因为Canal是Flannel和Calico的组合,所以它的优势也在于这两种技术的交叉。网络层用的是Flannel提供的简单overlay,能够在许多不一样的部署环境中运行且无需额外的配置。在网络策略方面,Calico强大的网络规则评估,为基础网络提供了更多补充,从而提供了更多的安全性和控制。
确保集群知足必要的系统要求(https://docs.projectcalico.or...)后,用户须要应用两个manifest才能部署Canal,这使得其配置比单独的任何一个项目都困难。若是企业的IT团队计划改变他们的网络方案,且但愿在实施改变以前能先对网络策略进行一些实验并获取一些经验,那么Canal是一个不错的选择。
通常来讲,若是你喜欢Flannel提供的网络模型,但发现Calico的一些功能很诱人,那么不妨尝试一下Canal。从安全角度来看,定义网络策略规则的能力是一个巨大的优点,而且在许多方面是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加密(http://nacl.cr.yp.to)来为sleeve流量自动加密全部路由流量,而对于快速数据路径流量,由于它须要加密内核中的VXLAN流量,Weave会使用IPsec ESP来加密快速数据路径流量。
对于那些寻求功能丰富的网络、同时但愿不要增长大量复杂性或管理难度的人来讲,Weave是一个很好的选择。它设置起来相对容易,提供了许多内置和自动配置的功能,而且能够在其余解决方案可能出现故障的场景下提供智能路由。网状拓扑结构确实会限制能够合理容纳的网络的大小,不过对于大多数用户来讲,这也不是一个大问题。此外,Weave也提供收费的技术支持,能够为企业用户提供故障排除等等技术服务。
结 语
Kubernetes采用的CNI标准,让Kubernetes生态系统中的网络解决方案百花齐放。更多样的选择,意味着大多数用户将可以找到适合其当前需求和部署环境的CNI插件,同时还能够在环境发生变化时也能找到新的解决方案。
不一样企业之间的运营要求差别很大,所以拥有一系列具备不一样复杂程度和功能丰富性的成熟解决方案,大大有助于Kubernetes在知足不一样用户独特需求的前提下,仍然可以提供一致的用户体验。