Docker跨主机网络访问配置之weave

使用weave实现跨主机容器连接


    Weave是由weaveworks公司开发的解决Docker跨主机网络的解决方案,它能够创建一个虚拟网络,用于连接多台主机上的Docker容器,这样容器就像被接入了同一个网络交换机,那些使用网络的应用程序不必去配置端口映射和链接等信息。

    外部设备能够访问Weave网络上的应用程序容器所提供的服务,同时已有的内部系统也能够暴露到应用程序容器上。Weave能够穿透防火墙并运行在部分连接的网络上,另外,Weave的通信支持加密,所以用户可以从一个不受信任的网络连接到主机。

Weave会在主机上创建一个网桥,每一个容器通过 veth pair 连接到该网桥上,同时网桥上有个 Weave router 的容器与之连接,该router会通过连接在网桥上的接口来抓取网络包(该接口工作在Promiscuous模式)。

在每一个部署Docker的主机(可能是物理机也可能是虚拟机)上都部署有一个W(即Weave router),它本身也可以以一个容器的形式部署。Weave run的时候就可以给每个veth的容器端分配一个ip和相应的掩码。veth的网桥这端就是Weave router容器,并在Weave launch的时候分配好ip和掩码。

Weave网络是由这些weave routers组成的对等端点(peer)构成,每个对等的一端都有自己的名字,其中包括一个可读性好的名字用于表示状态和日志的输出,一个唯一标识符用于运行中相互区别,即使重启Docker主机名字也保持不变,这些名字默认是mac地址。

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

对每一个weave网络中的容器,weave都会创建一个网桥,并且在网桥和每个容器之间创建一个veth pair,一端作为容器网卡加入到容器的网络命名空间中,并为容器网卡配置ip和相应的掩码,一端连接在网桥上,最终通过宿主机上weave router将流量转发到对端主机上。

其基本过程如下:


1,容器流量通过veth pair到达宿主机上weave router网桥上。
2,weave router在混杂模式下使用pcap在网桥上截获网络数据包,并排除由内核直接通过网桥转发的数据流量,例如本子网内部,本地容器之间的数据以及宿主机和本地容器之间的流量。捕获的包通过UDP转发到所其他主机的weave router端。
3,在接收端,weave router通过pcap将包注入到网桥上的接口,通过网桥的上的veth pair,将流量分发到容器的网卡上。



weave默认基于UDP承载容器之间的数据包,并且可以完全自定义整个集群的网络拓扑,但从性能和使用角度来看,还是有比较大的缺陷的:

扫描二维码关注公众号,回复: 16638966 查看本文章

weave自定义容器数据包的封包解包方式,不够通用,传输效率比较低,性能上的损失也比较大。

集群配置比较负载,需要通过weave命令行来手工构建网络拓扑,在大规模集群的情况下,加重了管理员的负担。 

Weave优劣势:

  • Weave优势
  1. 支持主机间通信加密。
  2. 支持container动态加入或者剥离网络。
  3. 支持跨主机多子网通信。
  • Weave劣势

只能通过weave launch或者weave connect加入weave网络。

配置操作

  1. 搭建服务

    主机名

    系统

    宿主IP

    应用服务

    master

    CentOS7.4

    192.168.56.128

    容器:192.168.10.10/24

    slave1

    CentOS7.4

    192.168.56.130

    容器:192.168.10.11/24

    1、网桥方式需要安装网桥管理工具

    # yum install bridge-utils

    2、暂时关闭防火墙,如果需要必须开启6783端口

    3、都需要开启宿主路由转发

    #vim /etc/sysctl.conf

    net.ipv4.ip_forward = 1

    #sysctl  -p

    4、、下载二进制包(所有宿主都需要)

    # wget -O /usr/local/bin/weave https://raw.githubusercontent.com/zettio/weave/master/weave

    授权:

    # chmod a+x /usr/local/bin/weave

    5、初始化Weave网络

    # weave launch

    3.png

    # docker ps -a

    4.png

    # brctl show

    # ifconfig weave

    # docker network ls

    5.png

    weave的这些数据是保存在每台机器上分配的名为 weavedb 的容器上的,它是一个 data volume 容器,只负责数据的持久化。

    6、连接不同主机

    node主机需要连接到master主机,只需要在 weave launch 后面跟上master主机的ip或者hostname就行了。两台机器就会自动建立集群,并同步所有需要的信息。

    (1)在slave1执行如下命令

    # weave launch 192.168.56.128

    # weave connect 192.168.56.128

    # weave version

    查看

    # weave status

    6.png

    6、Weave有三种方式和Docker进行集成,以便运行的容器跑在Weave网络中。

    (1)使用 weave run 命令直接运行容器。

    (2) 使用 weave env 命令修改 DOKCER_HOST 环境变量的值,使 docker client 和 weave 交互, weave 和 docker daemon 交互,自动为容器配置网络,对用户透明。

    (3) 使用 weave plugin ,在运行容器的时候使用 --net=weave 参数。

    1)使用 weave run 命令直接运行容器

    weave在2.0版本之后就没有“weave run”这个命令了

    2)先使用docker run启动好容器,然后使用weave attach命令给容器绑定IP地址

    在master使用如下命令:

    # docker run -dti --name weave01 --privileged centos:7.4.1708 /usr/sbin/init

    绑定ip地址

    # weave connect 192.168.56.130    //配置对方宿主的ip

    # weave attach 192.168.10.10/24 ba50b215c0ec

    7.png

    报错如下:

    8.png

    # docker exec -ti ba50b215c0ec /bin/bash

    9.png

    在slave1使用如下命令:

    #docker run -dti --name weave03 --privileged centos:7.4.1708 /usr/sbin/init

    绑定IP地址到容器

    # weave connect 192.168.56.128     //配置对方宿主的ip

    # weave attach 192.168.10.11/24 6a26f76433b6

    10.png

    # docker exec -ti 6a26f76433b6 /bin/bash

    11.png

    备注:

    上面在docker run启动容器时,可以添加--net=none参数,这个表示容器启动后不使用默认的虚拟网卡docker0自动分配的ip,而是使用weave绑定的ip;

    当然也可以选择不添加这个参数去启动容器,这样,容器启动后就会有两个网卡,即两个ip(如上图):

    一个是docker0自动分配的ip,这个适用于同主机内的容器间通信,即同主机的容器使用docker0分配的ip可以相互通信;另一个就是weave网桥绑定的ip。

    7、测试

    网络测试

    12.png

    应用测试

    宿主master登录10容器访问宿主slave1容器11上面的mysql服务,如图

    13.png

    8、注意事项

    在跨主机情况下,相同子网内的容器是可以相互通信的;但是处于不同子网的两个容器是不能互联的,尽管这两个容器在同一个主机下也是不能通信的!

    这样的好处就是:使用不同子网进行容器间的网络隔离。

    使用weave注意事项:

    (1)使用Docker的原生网络,在容器内部是可以访问宿主机以及外部网络的。也就是说在启动容器的时候,使用了虚拟网卡docker0分配ip,这种情况下,登陆容器后是可以ping通宿主机ip,并且可以对外联网的!

    但,在宿主机上是可以ping通docker0网桥的ip,但是ping不通weave网桥的ip。这个时候可以使用

    "weave expose 192.168.0.1/24"命令来给weave网桥添加IP,以实现容器与宿主机网络连通。如下

    14.png

    配置

    在master和slave1两台机器上都添加weave网桥的ip

    [root@master ~]# weave expose 192.168.10.1/2

    [root@slave1 ~]# weave expose 192.168.10.1/24

    补充说明:

    (1)192.168.10.1/24表示weave容器网段的网关

    (2)# weave hide 192.168.10.1/24表示覆盖或删当前指定的配置

    查看

    15.png

    缺点:

    (1)weave给容器指定的IP地址会随着容器的关闭或重启而失效,如需得重新配置。

    (2)weave解决了网络问题,但是单机模式


 

猜你喜欢

转载自blog.csdn.net/Franklin7B/article/details/95311765
今日推荐