当容器分布在多个不同的主机上时,这些容器之间的相互通信变得复杂起来。容器在不同主机之间都使用的是自己的私有IP地址,不同主机的容器之间进行通讯需要将主机的端口映射到容器的端口上,而且IP地址需要使用主机的IP地址。Weave正是为了解决这个问题而出现的,它把不同主机上容器互相连接的网络虚拟成一个类似于本地网络的网络。
Weave是在一个网络的基础上,构建了一层由软件定义的网络层,这个网络看起来就像是一个本地的局域网,但是实际上它的底层通过另一个网络进行通信。这个网络可能会比实际物理局域网的可靠性要差一些,但是从可用性角度来看,它带来了很大的便利性:可以在位于不同位置的节点之间通信,而好像它们在一个地方一样。也可以把这种网络想象成一个类似于VPN似的东西。
一、Weave 介绍
Weave是Github上一个比较热门的Docker容器网络方案,具有非常良好的易用性且功能强大。Weave 的框架它包含了两大主要组件: 1)Weave:用户态的shell脚本,用于安装Weave,将container连接到Weave虚拟网络。并为它们分配IP。 2)Weaver:运行于container内,每个Weave网络内的主机都要运行,是一个Go语言实现的虚拟网络路由器。不同主机之间的网络通信依赖于Weaver路由。 Weave通过创建虚拟网络使Docker容器能够跨主机通信并能够自动相互发现。 通过weave网络,由多个容器构成的基于微服务架构的应用可以运行在任何地方:主机,多主机,云上或者数据中心。 应用程序使用网络就好像容器是插在同一个网络交换机上一样,不需要配置端口映射,连接等。 在weave网络中,使用应用容器提供的服务可以暴露给外部,而不用管它们运行在何处。类似地,现存的内部系统也可以接受来自于应用容器的请求,而不管容器运行于何处。 一个Weave网络由一系列的'peers'构成----这些weave路由器存在于不同的主机上。每个peer都由一个名字,这个名字在重启之后保持不变.这个名字便于用户理解和区分日志信息。 每个peer在每次运行时都会有一个不同的唯一标识符(UID).对于路由器而言,这些标识符不是透明的,尽管名字默认是路由器的MAC地址。 Weave路由器之间建立起TCP连接,通过这个连接进行心跳握手和拓扑信息交换,这些连接可以通过配置进行加密。 peers之间还会建立UDP连接,也可以进行加密,这些UDP连接用于网络包的封装,这些连接是双工的而且可以穿越防火墙。 Weave网络在主机上创建一个网桥,每个容器通过veth pari连接到网桥上,容器由用户或者weave网络的IPADM分配IP地址。
Weave网络可以在具有编号拓扑的部分连接的网络中路由数据包。如下:peer1和2、3直接相连,如果1想要传输数据到4和5,需要通过peer3。
二、选择weave的原因
https://www.weave.works/docs/net/latest/overview/
1)无忧的配置 Weave网络能够简化容器网络的配置。因为weave网络中的容器使用标准的端口提供服务(如,MySQL默认使用3306),管理微服务是十分直接简单的。 每个容器都可以通过域名来与另外的容器通信,也可以直接通信而无需使用NAT,也不需要使用端口映射或者复杂的linking. 部署weave容器网络的最大的好处是无需修改你的应用代码。 2)服务发现 Weave网络通过在每个节点上启动一个"微型的DNS"服务来实现服务发现。你只需要给你的容器起个名字就可以使用服务发现了,还可以在多个同名的容器上提供负载均衡的功能。 3)不需要额外的集群存储 所有其它的Docker网络插件,包括Docker自带的"overlay"驱动,在你真正能使用它们之间,都需要安装额外的集群存储----一个像Consul或者Zookeepr那样的中心数据库.
除了安装,维护和管理困难外,甚至Docker主机需要始终与集群存储保持连接,如果你断开了与其的连接,尽管很短暂,你也不能够启动和停止任何容器了。 Weave网络是与Docker网络插件捆绑在一起的,这意味着你可以马上就使用它,而且可以在网络连接出现问题时依旧启动和停止容器。 关于更多Weave Docker插件的介绍,请查看 Weave Network Plugin如何工作. 4)在部分连接情况下进行操作 Weave网络能够在节点间转发流量,它甚至能够在网状网络部分连接的情况下工作。这意味着你可以在混合了传统系统和容器化的应用的环境中使用Weave网络来保持通信。 5)Weave网络很快 Weave网络自动在两个节点之间选择最快的路径,提供接近本地网络的吞吐量和延迟,而且这不需要你的干预。 关于Fast Datapath如何工作请参考 How Fast Datapath Works . 6)组播支持 Weave网络完全支持组播地址和路径。数据可以被发送给一个组播地址,数据的副本可以被自动地广播。 7)NAT 转换 使用Weave网络,部署你的应用---无论是点对点的文件共享,基于ip的voice或者其它应用,你都可以充分利用内置的NAT转换。通过Weave网络,你的app将会是可移值的,容器化的, 加上它对网络标准化的处理,将又会使你少关心一件事。 8)与任何框架集成: Kubernetes, Mesos, Amazon ECS, … 如果你想为所有的框架使用一个工具,Weave网络是一个好的选择。比如: 除了作为Docker插件使用,你还可以将其作为一个Kubernetes插件plugin.你还可以在 Amazon ECS ,Mesos和 Marathon中使用它.
三、部署Weave网络
官方文档:https://www.weave.works/docs/net/latest/install/installing-weave/
3.1 前提条件
1)确保节点Linux内核版本3.8+,Docker1.10+
2)节点间如果有防火墙,必须彼此放行TCP 6783 和UDP 6783/6784端口,这是weave控制和数据端口
3)主机名不能相同,通过主机名识别子网
3.2 节点环境
| 节点 | ip | kernel |
| weave-01 | 172.16.200.218 | 4.15.7-1.el7.elrepo.x86_64 |
| weave-02 | 172.16.200.223 | 4.15.7-1.el7.elrepo.x86_64 |
3.3 安装weave
curl -L git.io/weave -o /usr/local/bin/weave chmod a+x /usr/local/bin/weave
3.4 启动并与其它主机建立联系
# weave-01 weave launch 172.16.200.223 # weave-02 weave launch 172.16.200.218
验证:
[root@weave-01 ~]# weave status connections <- 172.16.200.223:44899 established fastdp d2:cd:54:51:3e:bd(weave-02) mtu=1376
weave 命令帮助:
weave --help
3.5 使用weave网络创建容器
方式一:这种方式创建的容器,其名称无法在整个weave网络中的weave dns中被识别,只能被本宿主机的weave dns识别,推荐下一种
[root@weave-01 ~]# docker run -it --net=weave --name weave-01-box1 busybox / # ifconfig eth0 Link encap:Ethernet HWaddr 02:42:AC:16:00:02 inet addr:172.22.0.2 Bcast:172.22.255.255 Mask:255.255.0.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:11 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:942 (942.0 B) TX bytes:0 (0.0 B) ethwe0 Link encap:Ethernet HWaddr 4A:DD:B1:FE:9E:FD inet addr:10.40.0.0 Bcast:10.47.255.255 Mask:255.240.0.0 UP BROADCAST RUNNING MULTICAST MTU:1376 Metric:1 RX packets:6 errors:0 dropped:0 overruns:0 frame:0 TX packets:1 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:516 (516.0 B) TX bytes:42 (42.0 B)