介绍
网络架构是Kubernetes中较为复杂、让很多用户头疼的方面之一。CNI意为容器网络接口,它是一种标准的设计,为了让用户在容器创建或销毁时都能够更容易地配置容器网络。
背景
容器网络是容器选择连接到其他容器、主机和外部网络(如Internet)的机制。例如Docker默认情况下可以为容器配置以下网络:
- none:将容器添加到一个容器专门的网络堆栈中,没有对外连接。
- host:将容器添加到主机的网络堆栈中,没有隔离。
- default bridge:默认网络模式。每个容器可以通过IP地址相互连接。
- user define:用户定义的网桥,具有更多的灵活性、隔离性和其他便利功能。
Docker还可以让用户通过其他驱动程序和插件,来配置更高级的网络(包括多主机覆盖网络)。
CNI的初衷是创建一个框架,用于在配置或销毁容器时动态配置适当的网络配置和资源。
插件负责为接口配置和管理IP地址,并且通常提供与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插件。
与其他方案相比,Flannel相对容易安装和配置。它被打包为单个二进制文件FlannelD,许多常见的Kubernetes集群部署工具和许多Kubernetes发行版都可以默认安装Flannel。
Flannel配置第3层IPv4 Overlay网络。它会创建一个大型内部网络,跨越集群中每个节点。
Flannel有几种不同类型的后端可用于封装和路由。默认和推荐的方法是使用VXLAN,因为VXLAN性能更良好并且需要的手动干预更少。
总的来说,Flannel是大多数用户的不错选择。
Calico
链接:https://github.com/projectcalico/cni-pluginCalico是Kubernetes生态系统中另一种流行的网络选择。虽然Flannel被公认为是最简单的选择,但Calico以其性能、灵活性而闻名。
在满足系统要求的新配置的Kubernetes集群上,用户可以通过应用单个manifest文件快速部署Calico。
尽管部署Calico所需的操作看起来相当简单,但它创建的网络环境同时具有简单和复杂的属性。
除了性能优势之外,在出现网络问题时,用户还可以用更常规的方法进行故障排除。
除了网络连接外,Calico还以其先进的网络功能而闻名。 网络策略是其最受追捧的功能之一。
如果对你的环境而言,支持网络策略是非常重要的一点,而且你对其他性能和功能也有需求,那么Calico会是一个理想的选择。
Canal
链接:https://github.com/projectcalico/canalCanal也是一个有趣的选择,原因有很多。
首先,Canal 是一个项目的名称,它试图将Flannel提供的网络层与Calico的网络策略功能集成在一起。
由于Canal是Flannel和Calico的组合,因此它的优点也在于这两种技术的交叉。
确保集群满足必要的系统要求(https://docs.projectcalico.org ... ments)后,用户需要应用两个manifest才能部署Canal,这使得其配置比单独的任何一个项目都困难。
一般来说,如果你喜欢Flannel提供的网络模型,但发现Calico的一些功能很诱人,那么不妨尝试一下Canal。
Weave
链接:https://www.weave.works/oss/net/Weave是由Weaveworks提供的一种Kubernetes CNI网络选项,它提供的模式和我们目前为止讨论的所有网络方案都不同。
为了创建网络,Weave依赖于网络中每台主机上安装的路由组件。然后,这些路由器交换拓扑信息,以维护可用网络环境的最新视图。
快速数据路径依靠内核的本机Open vSwitch数据路径模块,将数据包转发到适当的Pod,而无需多次移入和移出用户空间。
与Calico一样,Weave也为Kubernetes集群提供网络策略功能。设置Weave时,网络策略会自动安装和配置,因此除了添加网络规则之外,用户无需进行其他配置。
对于那些寻求功能丰富的网络、同时希望不要增加大量复杂性或管理难度的人来说,Weave是一个很好的选择。
结语
Kubernetes采用的CNI标准,让Kubernetes生态系统中的网络解决方案百花齐放。更多样的选择,意味着大多数用户将能够找到适合其当前需求和部署环境的CNI插件,同时还可以在环境发生变化时也能找到新的解决方案。不同企业之间的运营要求差异很大,因此拥有一系列具有不同复杂程度和功能丰富性的成熟解决方案,大大有助于Kubernetes在满足不同用户独特需求的前提下,仍然能够提供一致的用户体验。