Weave的运行原理


【编者的话】Docker原生的网络支持非常有限,固定的IP段设置,只支持Linux bridge, 且没有跨主机的集群网络方案。这就给很多开源项目创造了施展的空间,这方面介绍可以详见这篇文章《5个解决docker网络问题的项目》。Weave作为这些方案中,被评价为目前最靠谱的,所以在这里我想结合《Weave:how does it work?》,重点描述一下我对关于Weave的工作原理的一些理解和思考。本文首发于我的个人博客

背景

Docker原生的网络支持非常有限,固定的IP段设置,只支持Linux bridge, 且没有跨主机的集群网络方案。这就给很多开源项目创造了施展的空间,这方面介绍可以详见这篇文章《5个解决docker网络问题的项目》。Weave作为这些方案中,被评价为目前最靠谱的,所以在这里我想结合《Weave:how does it work?》,重点描述一下我对关于Weave的工作原理的一些理解和思考。

Weave运行原理

weave.png

Weave network的组成

如上图所示,在每一个部署Docker的主机(可能是物理机也可能是虚拟机)上都部署有一个W(即Weave router,它本身也可以以一个容器的形式部署)。Weave网络是由这些weave routers组成的对等端点(peer)构成,每个对等的一端都有自己的名字,其中包括一个可读性好的名字用于表示状态和日志的输出,一个唯一标识符用于运行中相互区别,即使重启Docker主机名字也保持不变,这些名字默认是mac地址。

每个部署了Weave router的主机都需要将TCP和UDP的6783端口的防火墙设置打 开,保证Weave router之间控制面流量和数据面流量的通过。控制面由weave routers之间建立的TCP连接构成,通过它进行握手和拓扑关系信息的交换通信。 这个通信可以被配置为加密通信。而数据面由Weave routers之间建立的UDP连接构成,这些连接大部分都会加密。这些连接都是全双工的,并且可以穿越防火墙。

Weave创建一个网桥,并且在网桥和每个容器之间创建一个veth对,Weave run的时候就可以给每个veth的容器端分配一个ip和相应的掩码。veth的网桥这端就是Weave router容器,并在Weave launch的时候分配好ip和掩码。

Weave的控制面

Weave routers间通过TCP构成了Weave network的控制面,它是完全分布式, 没有集中控制点,对等的端点间使用gossip协议交换网络的拓补关系。 gossip消息的结构如下图所示:
+-----------------------------------+
| 1-byte message type - Gossip      |
+-----------------------------------+
| 4-byte Gossip channel - Topology  |
+-----------------------------------+
| Peer Name of source               |
+-----------------------------------+
| Gossip payload (topology update)  |
+-----------------------------------+ 

拓补的更新信息结构如下图所示:
+-----------------------------------+
| Peer 1: Name                      |
+-----------------------------------+
| Peer 1: NickName                  |
+-----------------------------------+
| Peer 1: UID                       |
+-----------------------------------+
| Peer 1: Version number            |
+-----------------------------------+
| Peer 1: List of connections       |
+-----------------------------------+
|                ...                |
+-----------------------------------+
| Peer N: Name                      |
+-----------------------------------+
| Peer N: NickName                  |
+-----------------------------------+
| Peer N: UID                       |
+-----------------------------------+
| Peer N: Version number            |
+-----------------------------------+
| Peer N: List of connections       |
+-----------------------------------+ 

端与端的连接信息结构如下图所示:
+-----------------------------------+
| Connection 1: Remote Peer Name    |
+-----------------------------------+
| Connection 1: Remote IP address   |
+-----------------------------------+
| Connection 2: Remote Peer Name    |
+-----------------------------------+
| Connection 2: Remote IP address   |
+-----------------------------------+
|                ...                |
+-----------------------------------+
| Connection N: Remote Peer Name    |
+-----------------------------------+
| Connection N: Remote IP address   |
+-----------------------------------+ 


Weave router学习获取MAC地址对应的主机,结合这个信息和网络之间的拓扑关 系,可以帮助router做出判断并且尽量防止将每个包都转发到每个对端。Weave可以在拓扑关系不断发生变化的部分连接的网络进行路由。比如下图所示:在这个网络中,对端1与对端2、3直接相连,但是如果对端1想要将包发到对端4或5,就必须首先发到3上,然后由3路由到达。
route-packets-in-partially-connected-networks.png

Weave network的数据面

Weave routers间通过对等端点见的UDP连接构成了Weave network的数据面, Weave router将捕获的数据包封装成UDP报文发出去。其封装的网络包的结构如下图所示:
+-----------------------------------+
| Name of sending peer              |
+-----------------------------------+
| Frame 1: Name of capturing peer   |
+-----------------------------------+
| Frame 1: Name of destination peer |
+-----------------------------------+
| Frame 1: Captured payload length  |
+-----------------------------------+
| Frame 1: Captured payload         |
+-----------------------------------+
| Frame 2: Name of capturing peer   |
+-----------------------------------+
| Frame 2: Name of destination peer |
+-----------------------------------+
| Frame 2: Captured payload length  |
+-----------------------------------+
| Frame 2: Captured payload         |
+-----------------------------------+
|                ...                |
+-----------------------------------+
| Frame N: Name of capturing peer   |
+-----------------------------------+
| Frame N: Name of destination peer |
+-----------------------------------+
| Frame N: Captured payload length  |
+-----------------------------------+
| Frame N: Captured payload         |
+-----------------------------------+

说的详细一点就是:Weave router在混杂模式下使用pcap在网桥上截获网络数 据包,他排除由内核直接通过网桥转发的数据流量,例如本子网内部本地容器之间的数据以及宿主机和本地容器之间的流量。捕获的包通过UDP转发到所其他主机的weave router端,在接收端,router通过pcap将包注入到网桥上的接口,通过网桥的接口转发这些包到对应的veth的容器端。

关于Weave改进的思考

Weave router通过pcap捕获包这种方式来完成封装和解封装这个过程,效率应 该是有问题的,这个过程中需要将数据包从内核态拷贝到用户态,然后按照自定义的格式完成封装和解封装。个人认为:这个过程应该可以使用Open vSwitch,基于VXLAN来代替。

4 个评论

讲的挺好的~
嗯 正好在用weave,一点疑惑解决了
weave这种方式确实不是最合适的,小批量或者实验性的还可以,真正集群大的时候,用户态的东西肯定扛不住,写成内核模块会好一些,用gre、vxlan比较好。
同意,socketplane就使用的是openvswitch vxlan。

要回复文章请先登录注册