Weave系列之Weave Net安装与探索

前言

Weave作为在docker 0.x时代开始就比较完备的网络方案一直在不断发展,目前已经实现了对多种平台和软件的支持。本文将会介绍Weave Net的相关信息和进行体验。

简单介绍

支持云的平台、系统和软件有AWS,Azure,CoreOS,k8s,Mesos,Docker Machine,Docker Swarm等。目前Weave有三个成果:Weave Net,Weave Run,Weave Scope。

Weave Net的使用相当简单,Weave创建的网络可以连通在不同位置的容器,比如公有云、私有云,虚拟机和裸金属设备,容器网络可以承载二层和三层的流量,并支持多播;内建的加密功能让容器隔离更加容易实现; Weave网络还可以自动选择最快的路径路由容器流量,保证容器的网络速度。

原理

Weave Net是怎样实现跨主机通讯的呢?实际上,Weave的跨主机通讯方案与先前的Ambassador其实很相似,不过后者是让容器间通过docker的link功能实现通讯。

每台运行weave的主机都需要运行几个必须的容器,透过这些容器实现跨主机通讯。在一个weave网络中,会有多个运行在不同主机的peer,这些peer起到路由的作用。

在weave routers间会创建TCP或UDP连接,工作的流程是:
1.先执行handshake
2.随后交换拓扑信息

如果用户启用了加密(启用加密的方法会在后面说明),这些全双工的连接会使用UDP协议承载封装好的网包,并且可以透过防火墙。

在实现上,weave会在主机上创建一个网桥,容器会通过veth peer连接到网桥,一般情况下由weave自带的地址分配工具自动分配为容器分配地址,如果用户进行干预,则以用户设置优先。

因为起到路由作用的weave容器也会连接到上述网桥,所以,weave routers会借助pcap,透过设置为混杂模式的接入网桥的接口捕捉以太网包,但是对于直接透过内核转发的本地容器间流量或是宿主机与本地容器间的流量则会被排除。

被捕捉的数据包通过UDP协议转发到其他Host上的weave router peer上,一旦收到这些包,路由会把包通过pcap注入到它的网桥接口或转发到其他的peers。

weave路由会通过mac地址识别不同的peer所在的位置,连同拓扑信息去决定转发路径,避免采取像泛洪般的手段,把每个包都发到每个peer上,以提高网络性能。

安装、试用

笔者用了两个vmware虚拟机,分别为machine1(172.16.77.181)和machine2(172.16.77.182),只有一个NAT接口,使用的Docker版本为1.9。

安装

分别在两个vm上下载安装weave:

下载三个所需的docker image,tag全是1.4.3:

weaveworks/plugin
weaveworks/weaveexec
weaveworks/weave

下载完之后,检查一下,如果没有这三个镜像会启动失败:

在machine1上启动weave,如果正常启动的话,不会有任何输出:

在machin2上启动weave并指定machine1的ip地址,不输出任何结果:

如果出现任何错误,请关闭并删除这三个运行中的容器,重新执行launch的步骤:

检查weave是否正确运行:

如果Connections后显示为failed,证明weave没有正确启动,参考上一步修正错误。

运行:

启动容器进行测试:
machine1:

machine2:

可以看到容器内多了一个网络接口ethwe0:

machine1:

machine2:

能互相ping通:

当我检查docker network时,发现weave已经为我们创建好网络了(weave):

如果我们检查namespace时,可以看到为容器创建的namespace:

再创建一个容器

可以看到该容器的地址与在machine1上创建的第一个容器为同一地址段:

经过试验,c1可以ping通machine2上的容器也能ping同主机的容器

这时在/var/run/docker/netns中又多了一个namespace:

由此可见,weave并不像docker原生网络组件一样,为网络又创建一个namespace。

以上只是简单地通过ip地址ping通容器,实际上,weave还提供了dns服务实现服务发现。

machine1:

这个命令实际上是用来创建一个hostname为c1.weave.local的容器,可以查询到这个hostname的ip地址为10.32.0.1。如果创建容器时指定了--name参数,在注册DNS时还是以hostname优先。

machine2:

这时我们再c1.weave.local中并没有看到c2.weave.local的host记录,但是借助dns可以通过hostname ping通c2.weave.local。

至此,weave的安装和试用就到此结束。

下面是对其高级特性的探索:

负载均衡

实践起来无比简单:
环境和本系列的第一篇文章一样,两个虚拟机,ip地址分别为172.16.77.181和172.16.77.182,运行Docker1.9。

vm1:

vm2:

--ipalloc-range是用于指定用于分配的地址范围。

如果重启了机器,启动weave时会显示这个,它需要把几个weave所用的容器给启动起来才行。

如果connection established就没问题了。

在vm1上启动一个作为客户端的容器,用c1.weave.local作为hostname:

如果你想修改local domain,可以这样:

local domain可以通过weave status查看:

在vm2上以同一hostname启动多个容器,作为服务端(这里笔者启动了四个):

通过dns-lookup可以查询到对应c2.weave.local的ip地址有四个:

网络示意图:

attach到c1.weave.local中,安装好python2.7以后,创建以下脚本(lb.py):

尝试执行一下(会花上一点时间):

最后程序输出了结果:

可以知道ping了不同的地址多少次,这也证明weave的负载均衡功能是可用的。

子网、指定容器地址、容器隔离

虽然weave会自动为容器分配ip地址,并且允许了ip地址的重新利用,但是如果我们想指定容器所在的ip该怎么办?

如果想指定一个子网,可以在weave launch时指定:

如果启动时没有指定这个参数,不同主机上,weave会在默认范围的基础上随机设定子网(默认网络范围可以从weave status中查看):

这是vm1上的容器c1的地址:

vm2上c2的:

我们可以在weave上查看某个容器的MAC和IP地址:

我们可以在容器启动时指定WEAVE_CIDR参数以设置ip地址:

然而......

根本没有查询结果?进入容器看看:

WTH?其实是weave启动后没有进行这一步的缘故:

实际上这个过程是这样的:

结论:
如果我们没有在启动weave后执行eval $(weave env),那么想使用weave只能通过docker run时添加--net=weave这个参数(作为docker plugin运行,有兴趣的童鞋可以去docker文档那里研究如何编写自己的plugin)。只有执行前面的eval命令,容器才会自动attach到weave网络中。

试验一下:
vm2:

vm1:

上面的命令指定了网络地址范围和默认子网。

如果启动容器时不指定WEAVE_CIDR,容器就会自动attach到默认子网中。

通过指定WEAVE_CIDR,就可以使容器得到指定IP:

可以看到default-c1的地址,分配到默认子网中了:

若指定参数:

测试一下容器隔离的效果:
在default-c1中ping default-c2

ping c3:

可以看到,如果执行eval那条命令,就不用再指定hostname,直接使用容器名就可以ping通

dns查询结果:

手动attach容器到网络中

我们可以直接通过attach命令把没有设置网络的容器加入到weave中:

启动了一个只有local lo和eth0(连接到默认的bridge上)接口的容器

手动把容器attach到weave网络(默认子网)上,返回一个ip地址

如果想让它detach,输入:

detach完毕。

我们也可以通过"net:"+地址将容器attach到weave,比如:

我们可以为容器同时指定多个地址:

安全

启动weave时,我们可以很简单地添加一个--password或环境变量参数以实现加密通讯:

如果不指定password去连接另一台主机,虽然不会输出错误信息,但检查weave status会发现问题:

查询到问题:

输入密码:

发现已经连接成功:

关于操作weave

在笔者实验的时候,出现过几次问题,需要注意一下几点:

1.机器重启后,如果weave并非随机启动的话,注意用docker ps看看weave所需的三个容器有没有显示出来,如果有,但不是全部的话,建议先weave reset,weave会删除那三个容器,等你重新启动weave再重新创建(自动)

2.正确的关闭方法应该是输入weave stop,此时weave会自动关闭并删除三个它所需的容器。不要随便用其他方法关闭。

3.weave启动后,建议检查weave status,如果weave连接失败,不会回显结果。检查后如果出现failed的字样,就要从多方面检查原因,比如网络有没有连通、有没有需要--password参数而没输入、三个所需的容器有没有正常启动等。

4.如果执行了前面eval $(weave env)这个命令,此时不应该直接关闭weave,而是修改相应的环境变量DOCKER_HOST到原来的值。或者直接重启机器即可。

结语

本文通过实践,对weave的安装与使用进行了深入研究,希望能对各位研究者有所帮助。

参考资料:

http://weave.works/guides/load-balancing-with-weave-run/#

http://docs.weave.works/weave/latest_release/features.html#virtual-ethernet-switch

http://docs.weave.works/weave/latest_release/weavedns.html

http://weave.works/guides/networking-docker-containers-with-weave-on-ubuntu/

http://docs.weave.works/weave/latest_release/plugin.html

作者简介:何智刚,2015至今,现为广东的一名在校高三学生,在学习之余,主要研究Docker,OpenStack,SDN,对各种领域都有所涉猎,目标是迈向full stack


  • 本站原创文章仅代表作者观点,不代表SDNLAB立场。所有原创内容版权均属SDNLAB,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用,转载须注明来自 SDNLAB并附上本文链接。 本站中所有编译类文章仅用于学习和交流目的,编译工作遵照 CC 协议,如果有侵犯到您权益的地方,请及时联系我们。
  • 本文链接https://www.sdnlab.com/16002.html
分享到:
相关文章
条评论

登录后才可以评论

Hochikong 发表于16-02-29
1