Docker-使用Weave实现跨主机容器连接

今天这里说下Docker跨主机容器间网络通信的另一个工具Weave的使用。当容器分布在多个不同的主机上时,这些容器之间的相互通信变得复杂起来。容器在不同主机之间都使用的是自己的私有IP地址,不同主机的容器之间进行通讯需要将主机的端口映射到容器的端口上,而且IP地址需要使用主机的IP地址。Weave正是为了解决这个问题而出现的,它把不同主机上容器互相连接的网络虚拟成一个类似于本地网络的网络。

如果了解SDN技术或者部署过OpenStack的网络模块(Neutron)的话,这里通过Weave构建的网络与它们比较类似。它是在一个网络的基础上,构建了一层由软件定义的网络层,这个网络看起来就像是一个本地的局域网,但是实际上它的底层通过另一个网络进行通信。这个网络可能会比实际物理局域网的可靠性要差一些,但是从可用性角度来看,它带来了很大的便利性:可以在位于不同位置的节点之间通信,而好像它们在一个地方一样。

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的原因

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网络通信模型

weave通过在docker集群的每个主机上启动虚拟的路由器,将主机作为路由器,形成互联互通的网络拓扑,在此基础上,实现容器的跨主机通
信。其主机网络拓扑参见下图:

实验环境

两台CentOs7.2虚拟机
IP地址     node1 118.190.201.11
           node2 118.190.201.12

Weave的安装与启动

所有节点执行如下步骤:
1)直接从github下载二进制文件安装。

[root@linux-node1 ~]# wget -O /usr/bin/weave https://raw.githubusercontent.com/zettio/weave/master/weave
[root@linux-node1 ~]# chmod a+x /usr/bin/weave

2)启动weave路由器,这个路由器其实也是以容器的形式运行的。(前提是已经启动了docker服务进程)
[root@linux-node1 ~]# weave launch
[root@linux-node1 ~]# eval $(weave env)
##在node2上启动时传入node1的IP地址,这是使两个docker host连接在一起
[root@linux-node2 ~]# weave launch 118.190.201.11 
##设置环境变量,这样通过docker命令行启动的容器就会自动地连接到weave网络中了。
[root@linux-node2 ~]# eval $(weave env) 

3)查看镜像,可以发现上面下载的weave路由容器镜像
[root@linux-node1 ~]# docker images

4)此时会发现有两个网桥,一个是Docker默认生成的,另一个是Weave生成的。
[root@linux-node1 ~]# brctl show #yum安装bridge-utils工具后,就会出现brctl命令
bridge name bridge id STP enabled interfaces
docker0 8000.024219ad9851 no vethb808f26
weave 8000.2e1c0e52a09c no vethwe-bridge

查看运行的容器,发现weave路由容器已经自动运行
[root@linux-node1 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1f6802de8dbb weaveworks/weave:latest "/home/weave/weave..." 23 minutes ago Up 23 minutes weave
##第二种方法
node1:
weave launch --ipalloc-range 192.168.0.0/16
docker run -it -d --name node1 --network weave centos /bin/bash
docker attach node1 

node2:
weave launch 118.190.201.11 --ipalloc-range 192.168.0.0/16
docker run -it -d --name node2 --network weave centos /bin/bash
docker attach node2

Weave的应用示例

##先使用docker run启动好容器,然后使用weave attach命令给容器绑定IP地址
 [root@linux-node2 ~]# docker run -it -d --name=weave-test1 centos /bin/bash
 [root@linux-node2 ~]# weave attach 192.168.1.2/24 weave-test1  #使用容器名称或容器id都可以;即给weave-test1容器绑定ip为192.168.1.2
192.168.1.2 
##进入启动的容器 
[root@linux-node2 ~]# docker exec -it weave-test1 /bin/bash
[root@be8cc008d9f1 /]# ifconfig   ##yum install -y net-tools
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
        inet 172.17.0.2 netmask 255.255.0.0 broadcast 0.0.0.0
        ether 02:42:ac:11:00:02 txqueuelen 0 (Ethernet)
        RX packets 4413 bytes 9790616 (9.3 MiB)
        RX errors 0 dropped 0 overruns 0 frame 0
        TX packets 3114 bytes 171242 (167.2 KiB)
        TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

ethwe: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1376
        inet 192.168.1.2 netmask 255.255.255.0 broadcast 192.168.1.255
        ether 0e:6a:92:8b:3d:58 txqueuelen 0 (Ethernet)
        RX packets 9 bytes 690 (690.0 B)
        RX errors 0 dropped 0 overruns 0 frame 0
        TX packets 1 bytes 42 (42.0 B)
        TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
       inet 127.0.0.1 netmask 255.0.0.0
       loop txqueuelen 0 (Local Loopback)
       RX packets 0 bytes 0 (0.0 B)
       RX errors 0 dropped 0 overruns 0 frame 0
       TX packets 0 bytes 0 (0.0 B)
       TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

在node1机器上启动容器meave-test,容器ip绑定为192.168.1.3
[root@linux-node1 ~]# docker run -it -d --name weave-test centos /bin/bash
[root@linux-node1 ~]# weave attach 192.168.1.3/24 weave-test
192.168.1.3
[root@linux-node1 ~]# docker attach weave-test
[root@9f80ae04a298 /]# yum install -y net-tools

容器互联
默认情况下,上面在node1和node2两台宿主机上创建的2个容器间都是相互ping不通的。需要使用weave connect命令在两台weave的路由器之间建立连接。
[root@linux-node1 ~]# weave connect 118.190.201.12   ##//连接的是对方宿主机的ip,注意"weave forget ip" z则表示断开这个连接
[root@linux-node2 ~]# weave connect 118.190.201.11

然后进入容器进行互ping

 

0
如无特殊说明,文章均为本站原创,转载请注明出处

该文章由 发布

这货来去如风,什么鬼都没留下!!!