Weave简介
当容器分布在多个不同的主机上时,这些容器之间的相互通信变得复杂起来。容器在不同主机之间都使用的是自己的私有IP地址,不同主机的容器之间进行通讯需要将主机的端口映射到容器的端口上,而且IP地址需要使用主机的IP地址。Weave正是为了解决这个问题而出现的,它把不同主机上容器互相连接的网络虚拟成一个类似于本地网络的网络。
如果了解SDN技术或者部署过OpenStack的网络模块(Neutron)的话,这里通过Weave构建的网络与它们比较类似。它是在一个网络的基础上,构建了一层由软件定义的网络层,这个网络看起来就像是一个本地的局域网,但是实际上它的底层通过另一个网络进行通信。这个网络可能会比实际物理局域网的可靠性要差一些,但是从可用性角度来看,它带来了很大的便利性:可以在位于不同位置的节点之间通信,而好像它们在一个地方一样。也可以把这种网络想象成一个类似于VPN似的东西。
weave通过在docker集群的每个主机上启动虚拟的路由器,将主机作为路由器,形成互联互通的网络拓扑,在此基础上,实现容器的跨主机通信。其主机网络拓扑参见下图:

如上图所示,在每一个部署Docker的主机(可能是物理机也可能是虚拟机)上都部署有一个W(即weave router,它本身也可以以一个容器的形式部署)。
Weave的安装与启动
安装
sudo curl -L git.io/weave -o /usr/local/bin/weave
sudo chmod a+x /usr/local/bin/weave
可以通过以下命令检验是否安装完成
weave version
weave status
启动
weave launch
之后会pull下来3个镜像,分别是
REPOSITORY TAG IMAGE ID CREATED SIZE
weaveworks/weaveexec 2.4.1 9e84d368c391 2 days ago 151MB
weaveworks/weave 2.4.1 ff4c735f9ce5 2 days ago 96.6MB
weaveworks/weavedb latest 15c78a9b1895 7 weeks ago 698B
还会run一个容器
325677aa3f97 weaveworks/weave:2.4.1 "/home/weave/weaver …" 19 hours ago Up 19 hours weave
还会新启动一个网络
NETWORK ID NAME DRIVER SCOPE
ae3da1032819 weave weavemesh local
Weave的部署
1)机器环境准备:(2台云服务器)
node-1:119.29.241.15
node-2:134.175.64.74
2)在3台机上均启动一个应用容器
由于weave2.0版本里 weave run命令已经remove,所以此处采取docker run + weave connect的方式
在node-1上启动容器my-test1
docker run -itd --name=my-test1
weave attach 192.168.0.2/24 my-test1 // weave detach 192.168.0.2/24 my-test1表示删除这个绑定
docker exec -ti my-test1 /bin/sh
ifconfig
在config中,可以看到有eth0和weave两个网桥
eth0 Link encap:Ethernet HWaddr 02:42:AC:11:00:04
inet addr:172.17.0.4 Bcast:0.0.0.0 Mask:255.255.0.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:40 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:2296 (2.2 KiB) TX bytes:0 (0.0 B)
ethwe Link encap:Ethernet HWaddr E2:E9:8E:EC:B2:84
inet addr:192.168.0.2 Bcast:192.168.0.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1376 Metric:1
RX packets:42 errors:0 dropped:0 overruns:0 frame:0
TX packets:29 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:2618 (2.5 KiB) TX bytes:1946 (1.9 KiB)
在node-1上启动容器my-test2,重复node-1的操作
docker run -itd --name=my-test2
weave attach 192.168.0.3/24 my-test2
docker exec -ti my-test2 /bin/sh
ifconfig
应该也可以看到my-test2的网络情况
3)容器互联
默认情况下,上面在node-1和node-2两台宿主机上创建的2个容器间都是相互ping不通的。需要使用weave connect命令在两台weave的路由器之间建立连接。
在node-1上执行
weave connect 134.175.64.74 // weave forget ip则表示断开这个连接
然后就会发现,此时位于两台不同主机上的相同子网段内的容器之间可以相互ping通了。再在node-1上启动容器my-test3,绑定ip为192.168.0.8,在node-2上启动容器my-test4,绑定ip为192.168.0.10会发现这四个在同一个子网内的容器都是可以相互ping通的。再接着启动与上面不在同一个子网内的容器node-1上启动容器my-test5,绑定ip为192.168.10.10,node-2上启动容器my-test6,绑定ip为192.168.10.20。会发现在跨主机情况下,相同子网内的容器是可以相互通信的;但是处于不同子网的两个容器是不能互联的,尽管这两个容器在同一个主机下也是不能通信的!
这样的好处就是:使用不同子网进行容器间的网络隔离了。
网友评论