1、Weave的背景

Weave是由weaveworks公司开发的解决Docker跨主机网络的解决方案,它能够创建一个虚拟网络,

用于连接部署在多台主机上的Docker容器,这样容器就像被接入了同一个网络交换机,那些使用网络

的应用程序不必去配置端口映射和链接等信息。


外部设备能够访问weave网络上的应用程序容器所提供的服务,同时已有的内部系统也能够暴露到应用程序容器上。


Weave能够穿透防火墙并运行在部分连接的网络上,

另外,Weave的通信支持加密,所以用户可以从一个不受信任的网络连接到主机。


Weave通过创建虚拟网络使Docker容器能够跨主机通信并能够自动相互发现。

通过weave网络,由多个容器构成的基于微服务架构的应用可以运行在任何地方:主机,多主机,云上或者数据中心。

应用程序使用网络就好像容器是插在同一个网络交换机上一样,不需要配置端口映射,连接等。


类似地,现存的内部系统也可以接受来自于应用容器的请求,而不管容器运行于何处。


在weave网络中,使用应用容器提供的服务可以暴露给外部,而不用管它们运行在何处。


一个weave网络由一系列的'peers'构成----这些weave路由器存在于不同的主机上。

每个peer都由一个名字这个名字在重启之后保持不变,这个名字便于用户理解和区分日志信息。

每个peer在每次运行时都会有一个不同的唯一标识符(UID),对于路由器而言,这些标识符不是透明的,尽管名字默认是路由器的MAC地址。


Weave路由器之间建立起TCP连接,通过这个连接进行心跳握手和拓扑信息交换,这些连接可以通过配置进行加密。

peers之间还会建立UDP连接,也可以进行加密,这些UDP连接用于网络包的封装,这些连接是双工的而且可以穿越防火墙。

Weave网络在主机上创建一个网桥,每个容器通过veth pari连接到网桥上,容器由用户或者weave网络的IPADM分配IP地址。

第十三节 Weave 网络通信_UDP

2、weave网络通信模型

weave通过在docker集群的每个主机上启动虚拟路由器,将主机作为路由器,形成互联互通的网络拓扑,

在此基础上,实现容器的跨主机通信。其主机网络拓扑参见下图:

第十三节 Weave 网络通信_bash_02

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

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

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

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

(5)对每一个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通信流程,可以参考下图

第十三节 Weave 网络通信_UDP_03

从上面的网络模型图中可以看出,对每一个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承载容器之间的数据包,并且可以完全自定义整个集群的网络拓扑,但从性能和使用角度来看,

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

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

------------------------------

weave工作原理

网卡设备

Container eth0:eth0是容器主机的默认网络,主要提供容器访问外网所提供的服务,走的默认docker网络架构,只不过他创建了docker_gwbridge这个网桥。

docker_gwbridge:docker_gwbridge是容器所创建的网桥它替代了docker0的服务。

Contailner ethwe:它是veth pair虚拟设备对,与其他容器通信的网络虚拟网卡。

vethwe-bridge:是ethwe设备对创建的weave网桥。网桥内分配的具体的IP与网关。

weave:weave网桥,通过route路由表找到目标,通过端口将数据包转发到对端端口节点。

eth0:真机网卡与外界网卡连接得真机网卡,它用来转发,容器VXLAN与NAT两种网卡类型的数据包到指定的对端节点。

注:weave会将相邻的节点互相学习,通过route路由表进行相互通信,并通过单独的端口发送数据。类似于静态路由。

---------------------------------


总的来说,

weave 相较于calico 、 flannel 来说,它很简单

它创建了两个固定的容器,用于桥接  

物理容器会内嵌一个网口,通过weave route 来通讯。


weave 用的最多的两个命令

connetc

attch

3、安装部署Weave

实验环境

系统 centos7.9   已安装华为源

docker版本  20.10.10

关闭防火墙-下载依赖包  //自己动手添加


机器hosts:

lyc-80-25  192.168.80.25

lyc-80-26  192.168.80.26

第十三节 Weave 网络通信_bash_04

直接从github下载二进制文件进行安装

wget   -o   /usr/local/bin/weave    https://raw.githubusercontent.com/zettio/weave/master/weave
chmod  777 /usr/local/bin/weave
ll /usr/local/bin |grep weave

第十三节 Weave 网络通信_UDP_05

启动weave路由器
weave launch   //拉取镜像,等同于pull
这个路由器其实也是以容器的形式运行的
(前提是已经启动了docker服务进程)

网慢请先清理无效的镜像缓存
docker image prune

第十三节 Weave 网络通信_bash_06

weave  --help

第十三节 Weave 网络通信_docker_07

yum -y install  bridge-utils
brctl show

第十三节 Weave 网络通信_docker_08

查看机器设备网络

ifconfig

第十三节 Weave 网络通信_docker_09

4、测试

机器25

docker pull centos:7


打开中继路由、防火墙

echo  "net.ipv4.ip_forward=1"   >>  /etc/sysctl.conf

iptables -P INPUT ACCEPT

iptables -P FORWARD ACCEPT

iptables -F

iptables -L -n

第十三节 Weave 网络通信_bash_10

sysctl -p

第十三节 Weave 网络通信_UDP_11

启动容器【25、26分别启动test111、test222】

docker run -tid --name test111 centos:7 /bin/sh
docker run -tid --name test222 centos:7 /bin/sh

给test1容器绑定IP

weave attach 10.244.0.3/24 test111
weave attach 10.244.0.4/24 test222

第十三节 Weave 网络通信_docker_12

第十三节 Weave 网络通信_UDP_13

更换容器test1、test2源

【提前准备好本地源文件CentOS7-Base.repo】

进入test1容器中进行更换源
docker exec -it   test1  /bin/bash
cd /etc/yum.repos.d/
mkdir bak
mv CentOS-*   bak/
exit

docker  cp  CentOS7-Base.repo   test1:/etc/yum.repos.d/
--------------------------------26机器-------------------------------------
进入test2容器中进行更换源
docker exec -it   test2  /bin/bash
cd /etc/yum.repos.d/
mkdir bak
mv CentOS-*   bak/
exit

docker  cp  CentOS7-Base.repo   test2:/etc/yum.repos.d/

第十三节 Weave 网络通信_docker_14

第十三节 Weave 网络通信_bash_15

进容器  docker exec -it   test1  /bin/bash
yum clean all
yum makecache fast
下载包  
yum -y install wget  
yum -y install net-tools
--------------------------26机器--------------------
进容器  docker exec -it   test2  /bin/bash
yum clean all
yum makecache fast
下载包  
yum -y install wget  
yum -y install net-tools

yum clean all  清除

yum makecache fast  更新源缓存

第十三节 Weave 网络通信_UDP_16

查看容器网络IP

第十三节 Weave 网络通信_bash_17

第十三节 Weave 网络通信_docker_18

测试25/26两机器容器能否正常通信

25 -test111 10.244.0.3
26 -test222 10.244.0.4
好像他们是一个网段的啊? 能通吗?

docker exec -it test1 /bin/bash
ping 10.244.0.3
////测试结果,不能ping通

第十三节 Weave 网络通信_bash_19

我们可以很明显的发现,为什么不通weave 创建的虚拟网口都只是在虚拟机自身之上完成的,我们并没有能够把这些虚拟网口有效的进行connet连通


我们需要添加 weave网络的router路由来完成不通虚拟机之间的“串联”

配置对方宿主的ip

25机器--- weave connect 192.168.80.26

26机器--- weave connect 192.168.80.25

第十三节 Weave 网络通信_docker_20

进容器内部后再次测试网络通信docker exec -it test1 /bin/bash docker exec -it test2 /bin/bash


25 -test111  ping 10.244.0.3

26 -test222  ping 10.244.0.4

第十三节 Weave 网络通信_docker_21

第十三节 Weave 网络通信_bash_22

5、总结

Weave有三种方式和Docker进行集成

(1)使用 weave run 命令直接运行容器(2.0之后已弃用)。

(2) 使用 weave env 命令修改 DOKCER_HOST 环境变量的值,使 docker client 和 weave 交互,

weave 和 docker daemon 交互,自动为容器配置网络,对用户透明。

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

Weave优劣势

Weave优势

(1)支持主机间通信加密

(2)支持container动态加入或者剥离网络

(3)支持跨主机多子网通信

Weave劣势

(1)只能通过weave launch或者weave connect加入weave网络

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

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