技术漫谈 | 战地:Calico, Flannel, Weave and Docker Overlay Network


作者:杨冬译

在以前的帖子中,笔者分析了4种不同的Docker多主机网络解决方案 :Calico,Flannel,Weave和Docker Overlay Network。
  • Docker的多主机网络解决方案
  • 基于Docker 覆盖网络的Flannel
  • Docker的网络管理 Docker
  • Docker多主机覆盖网络与Etcd


这篇文章为这4种 Docker多主机网络解决方案提供了一个对比,包括功能和性能。

Docker多主机网络介绍

Docker从一开始就启动了一个简单的单一主机网络。不幸的是,这阻止了Docker集群扩展到多台主机。一些项目将重点放在这个问题上,如Calico,Flannel和Weave,而且从2015年11月起,Docker也开始支持多主机覆盖网络。

这些项目的共同点是试图控制容器的网络配置,从而捕获和注入网络数据包。因此,位于不同主机上的每个容器都可以获得在同一个子网中的IP,并且彼此进行通信,就像它们连接到同一个L2交换机一样。这样,容器可以分散到多台主机上,甚至扩展到多个数据中心上。

这些网络技术从技术模型,网络拓扑和功能之间存在很大差异。这篇文章将主要关注Calico,Flannel,Weave和Docker Overlay Network之间的区别,您可以选择最适合您需求的正确解决方案。

战地概述

根据这四大网络技术支持的特性,我将在以下几个方面进行比较:
  • 网络模型 - 什么样的网络模型用于支持多主机网络。
  • 应用程序隔离 - 支持什么级别和种类的容器应用程序隔离。
  • 名称服务 - 使用简单的主机名或DNS规则进行DNS查找。
  • 分布式存储要求 - 是否需要外部分布式存储,例如etcd或consul。
  • 加密通道- 数据和信息传输是否可以放入加密通道。
  • 部分连接的网络支持 - 系统是否可以在部分连接的主机网络上运行。
  • 分离的容器vNIC - 是否为容器生成单独的NIC。
  • IP重叠支持 - 是否可以将相同的IP分配给不同的容器。
  • 容器子网限制 - 容器的子网是否应该与主机的子网不一致。
  • 协议支持 - 支持什么类型的第3层或第4层协议。


现在我们来看看关于Calico,Flannel,Weave和Docker Overlay Network的更多细节。

网络模型

多主机联网意味着将不同主机上的容器连接到同一个虚拟网络,而且这些网络提供商(Calico等)也被组织为一个集群网络。这个集群组织在本文中被称为网络模型。从技术上讲,这四种解决方案使用不同的网络模型来组织自己的网络拓扑。

Calico实现了一种纯粹的第3层方法,以实现更简单,更高规模,更好的性能和更高效的多主机网络。所以Calico不能被视为覆盖网络。纯粹的第3层方法避免了与第2层解决方案相关联的数据包封装,从而简化了诊断,减少了传输开销并提高了性能。 Calico还实现了BGP协议,用于与纯IP网络相结合的路由,从而允许虚拟网络进行Internet扩展。

Flannel有两种不同的网络模型可供选择。

一个称为UDP后端,这是一个简单的IP over IP解决方案,它使用TUN设备将每个IP片段封装在UDP数据包中,从而形成覆盖网络。

另一个是VxLAN后端,与Docker Overlay Network相同。

我已经对这两个模型进行了简单的测试,VxLAN比UDP后端要快得多。我建议的原因是,VxLAN得到Linux内核的良好支持,而UDP后端则实现了纯软件层封装。Flannel需要一个Etcd集群来存储网络配置,分配子网和辅助数据(如主机的IP)。并且数据包路由也需要Etcd集群的协作。此外,Flannel在主机环境中运行单独的flanneld进程,以支持分组交换。除了Docker,Flannel还可以用于传统的VM。

Weave也有两种不同的连接方式。

一个叫sleeve,它实现一个UDP通道来转发来自容器的IP数据包。 Weave sleeve模式和Flannel UDP后端模式之间的主要区别在于,Weave将多个容器的数据包合并到一个数据包,并通过UDP通道进行传输,因此在大多数情况下,技术上Weave sleeve模式将比Flannel UDP后端模式快一些。

Weave的另一种连接方式称为fastdp模式,它也实现了VxLAN方案。 虽然没有关于VxLAN使用情况的官方文件,但仍然可以从Weave代码中找到VxLAN的用法。Weave运行与Flanneld相同作用的Docker容器。

Docker Overlay Network在libnetwork和libkv的帮助下实现了基于VxLAN的解决方案,当然,它已经成功地集成到Docker中,无需任何单独的进程或容器。

网络模型的简要结论如下表所示:

1微信截图_20170817104905.png


应用隔离

由于容器相互连接,我们需要一种方法来将容器放入不同的组中,并将不同组中的容器隔离开来。

Flannel,Weave和Docker Overlay Network使用相同的应用程序隔离模式 - 传统的CIDR隔离。 传统的CIDR隔离使用网络掩码来识别不同的子网,而不同子网中的机器不能相互通信。 例如,w1 / w2 / w3分别具有IP 192.168.0.2/24 192.168.0.3/24和192.168.1.2/24。 w1和w2可以相互通信,因为它们在同一子网192.168.0.0/24中,但w3不能与w1和w2通信。

Calico实现另一种类型的应用程序隔离模式 - 配置文件。 您可以创建一批配置文件,并将容器附加到Calico网络的不同的配置文件中。 只有在相同配置文件中的容器能互相通信。 不同配置文件中的容器即使在同一个CIDR子网中也不能互相访问。

简要的结论:

2改微信截图_20170817111121.png


协议支持

由于Calico是纯三层解决方案,并不支持所有的第3层或第4层协议。 从官方github论坛,Calico的开发人员宣称只有TCP,UDP,ICMP和ICMPv6得到Calico的支持。 在这样的第3层解决方案中支持其他协议有点困难是有道理的。

其他解决方案支持所有协议。它们很容易实现,因为udp封装或VxLAN可以支持通过L3封装L2数据包。 因此,数据包持有哪种协议并不重要。

3微信截图_20170817105006.png


名称服务

Weave支持容器之间的名称服务。 创建容器时,Weave把它放入DNS名称服务中,格式为{hostname} .weave.local。 因此,您可以使用{hostname} .weave.local或只使用{hostname}访问任何容器。 后缀(weave.local)可以更改为其他字符串,也可以关闭DNS查找服务。

其他的解决方案没有这样的功能。

简要的结论:

4微信截图_20170817105025.png


分布式存储要求

对于Calico,Flannel和Docker覆盖网络,需要一个分布式存储(如Etcd和Consul)来更改路由和主机信息。 Docker覆盖网络还可以与Docker Swarm的服务发现机制合作来构建集群。

然而,Weave不需要分布式存储,因为Weave本身具有使用Rumor协议的节点发现服务。 该设计与另一个分布式存储系统解耦,同时引入了IP分配的复杂性和一致性问题,以及集群日益扩大时的IPAM性能。

简要的结论:

5微信截图_20170817105039.png


加密通道

Flannel支持Flannel和Etcd之间的TLS加密通道,以及Flannel对等体之间数据路径的加密。 您可以使用flanneld –help以及-etcd-certfile和-remote-certfile参数查看更多详细信息。

Weave可以被配置为既加密通过TCP连接的控制数据又加密在对等体之间发送的UDP数据包的有效载荷。这通过使用Curve25519,XSalsa20和Poly1305的NaCl加密库来加密和验证消息来实现。Weave防止对等体之间通信的注入和重放攻击。

Calico和Docker覆盖网络不支持任何种类的加密方法,Calico-Etcd通道和Calico对等体之间的数据通道也不支持。但是Calico在这四个解决方案中达到了最佳的性能,因此更适合内部环境,或者您不关心数据安全的环境。

简要的结论:

6改微信截图_20170817111154.png


部分连接网络支持

Weave可以部署在部分连接的网络中,简单的例子如下:

7微信截图_20170817105114.png


图中有4个对等体,对等体1〜3彼此相连,对等体4只连接到对等体3。Weave可以部署在对等体1〜4上。 从在对等体1上的容器到对等体4上的容器的任何流量将通过对等体3进行传输。

此功能允许Weave将由防火墙分开的主机连接起来,从而将在不同数据中心的主机通过内部IP地址连接起来。

其他解决方案没有这样的功能。

简要的结论:

8微信截图_20170817105128.png


分离的容器vNIC

由于Weave和Docker Overlay Network创建了桥接设备和容器内部的veth,因此它们为容器创建了一个单独的vNIC。容器的路由表也发生了变化,从而使所有的集群网络数据包到这个新创建的网卡。其他连接,如到google.com的连接,将路由到原始的vNIC。

Calico可以为容器使用统一的vNIC,因为它是纯粹的第3层解决方案。Calico可以为外拨请求配置NAT,并将子网包转发给其他Calico对等体。Calico还可以通过一些手动配置的内部容器将Docker桥接NIC用于外部请求。这样,您需要在执行docker run命令时添加-cap-add = Net_Admin参数。

Flannel直接使用docker本地的桥接网络docker0来处理所有通信,所以使用Flannel网络的容器只能看到一个内部的vNIC。

简要的结论:

9微信截图_20170817105141.png


IP重叠支持

技术上,对于基于VxLAN的解决方案,租户网络可以具有重叠的内部IP地址,尽管分配给主机的IP地址必须是唯一的。 根据VxLAN推测,Weave,Flannel和Docker Overlay Network可以支持容器的IP重叠。但是在我的测试环境中,我没有将这三个中的任意一个配置成支持IP重叠的模式。 所以我只能说他们有潜力支持IP重叠。

Calico在技术上不能支持IP重叠,但Calico官方文档强调,它们可以将IPv4容器的数据包重叠放在IPv6网络上。虽然这是IPv4网络的替代解决方案,但我宁愿将Calico视为不支持IP重叠的网络模型。

简要的结论:

10微信截图_20170817105154.png


容器子网限制

本节重点介绍容器子网是否可以与主机网络重叠。

Flannel在主机上使用子网地址创建一个真实的桥接网络,并使用主机Linux路由表将容器包转发到此桥接设备。所以容器的Flannel子网不能与主机网络重叠,否则主机的路由表会被混淆。

Calico是一个纯粹的第3层实现,从容器到外部世界的数据包将通过NAT表。所以Calico也有这样的限制,即容器子网不能与主机网络重叠。

Weave不使用主机路由表来区分来自于容器的数据包,而是使用pcap功能将数据包传递到正确的位置。因此,Weave不需要遵守子网限制,可以自由分配给容器与主机相同的IP地址。此外,您还可以更改内部容器的IP配置,并且可以通过新的IP访问容器。

Docker Overlay Network允许容器和主机位于同一子网中,并实现它们之间的隔离。但是Docker Overlay Network依靠etcd来记录路由信息,所以手动更改容器的IP地址会导致路由过程混乱,从而导致容器不能访问。

简要的结论:

11微信截图_20170817105231.png


结论

所以让我们将所有方面的最后结论放在一张表中。 该表是您选择正确的多主机网络解决方案的最佳参考之一。
12微信截图_20170817105245.png

1 个评论

请问是否有各网络性能对比数据可以分享下?

要回复文章请先登录注册