Weave是weaveworks开发的容器网络解决方案。weave创建的虚拟网络可以将部署在多个主机上的容器连接起来。对于容器来说,weave就像一个巨大的网络交换机,容器可以直接通信,无需NAT和端口映射。除此之外,weave的DNS模块是容器可以通过hostname访问
weave不依赖分布式数据库(例如:consul和etcd)交换网络信息,每个主机上只需要运行weave组件就能建立起跨主机容器网络,weave网络能够穿透防火墙并运行在部分连接的网络上,weave支持加密网络接连,用户可以从一个不受信任的网络连接到主机
weave官网地址: https://github.com/weaveworks/weave
开始部署weave:
1.linux内核版本为3.8以上,dockers版本为1.10.0 or later
2.curl -L git.io/weave -o /usr/local/bin/weave
3.更改权限chmod a+x /usr/local/bin/weave
4。初始化weave:weave launch
注:初始化weave前要保证有 bridge-utils
网桥工具包
初始化weave三个docker容器来辅助运行,会自动下载镜像
weave:是主程序,负责建立weave网络,收发数据,提供DNS等服务
自动创建网桥
自动创建一个docker网络
driver是weave,subnet是10.32.0.0/12
分析weave的网络结构:
1. eval $(weave env) 设置环境变量,这样通过docker命令行启动的容器就会自动地连接到weave网络中了
可执行 eval $(weave env --restore)恢复之前的环境
2.docker run --name weave1 -itd busybox 注:-itd连用可使普通镜像运行容器后,容器会保持运行状态
3.查看weave1容器中得网络
weave1容器有两个网络接口:eth0@if18,从他的IP可以看出是与host上得docker0同属一个网段,所以还是默认连接在docker0上得
还有一个ethwe@if20,从名称可以看出ethew与weave相关,他的对应编号是20,我们从host上面通过ip link进行查看
vethwep120768@if19是与ethwe是一对veth pair,而且被挂在了weave上
我们通过ip -d link深入分析一下现在host上得网络
这里出现了很多新得interface
datapath:是一个openvswitch
vethwe-datapath@vethwe-bridge:是veth pair
vethwe-datapath:父设备是datapath
vxlan-6784:是vxlan interface,其maste也是datapath,weave主机之间通过Vxlan节能型通信
host1得网络结构如下:盗图
weave网络包含两个虚拟交换机:桥接的weave和openvswitch datapath,veth pair :vethwe-bridge将两者连接在一起。
weave与datapath分工不同,weave负责将容器接入weave网络,datapath负责在主机间建立vxlan隧道并收发数据
我们再运行一个容器
查看weave1的hostname1
weave DNS为容器创建了默认域weave1.weave.local
可以ping通
Weave的连通性和隔离性
1.之前我们是在docker1上进行的操作,现在我们在docker2上进行同样的部署weave
2.启动weave
这里必须指定IP 192.168.7.235这样docker1和docker2才能加到同一个网络
设置环境变量,在docker2上运行容器
eval $(weave env)
docker run -itd --name weave11 busybox
docker2上面的weave11能够ping通docker1上的weave1
docker1上面的weave1的IP是10.32.0.1/12
docker2上的weave11的IP 是10.44.0.0/12
掩码是12位的,实际上这个两个IP 是在同一个subnet10.32.0.0/12.通过docker1和docker2之间的vxlan隧道,2个容器逻辑上在一个LAN中,肯定是能ping通的
盗图
1.数据包的目的地址是10.32.0.1/12,docker2根据路由表,从ethwe发送出去
2.docker2查询到目的主机,将数据通过vxlan发送给docker1
3.docker1收到数据,根据目的IP将数据转发给weave1
weave的网络隔离
默认配置下,weave使用一个大subnet(例如10.32.0.0/12),所有主机的容器都从这个地址空间中分配IP ,因为同属一个subnet,容器可以直接通信。如果要实现网络隔离,可以通过换环境变量WEAVE_CIDR为容器分配不同的subnet的IP
注:如果通过-e WEAVE_CIDR ,进入容器后没有使用新的网段,那么重新设置一下变量 eval $(weave env)
容器分配到的IP 是10.32.2.128/24,无法ping通10.32.0.1
weave如何与外部进行通信
weave是一个私有的xvlan网络,默认与外部网络隔离。外部如何才能访问到weave中的容器呢?
方法是:
1.首先将主机加入到weave网络
2.然后把主机当作访问weave网络的网关。
要将主机加入到weave,执行weave expose
这个ip10.32.0.6会被配置到host上的weave的网桥上
现在docker1的网络是,如盗图:
weave网桥位于root namespace,它负责将容器接入weave网络。给weave配置同一subnet的IP其本质就是将docker1接入weave网络。docker1现在已经可以直接与同一weave网络接入容器通信了,无论容器是否在docker1上
在docker1上ping同一个host上的容器
pingdocker2上的容器
下面我们看一下,如果host主机没有加入到weave网络,是否能ping通自己主机上的容器?
进入docker2上
没有加入到weave网络的主机 也无法ping通自己主机上的容器。如果是部署了weave服务可以直接通过weave expose加入到weave网络,如果没有部署weave网络的主机如何与容器进行通信呢?
方法是:将非weave主机的网关指向docker1
如:像docker主机添加路由
测试后可以ping通
使用weave网络,容器是如何方位外网的呢?
我们可以观察到在weave环境下,我们运行的容器出本地网卡外都有两个网卡,eth0和weave,我们知道这个eth0是连接docker0用的,所以容器访问外网就是通过docker0实现的
IPAM:
我们在每个主机上通过weave launch使weave获得subnet后,发现都是10.32.0.0/12网段的,我们也可以自定义subnet,可以通过--ipalloc-range分配特定的subnet
weave launch --ipalloc-range 10.2.0.0/16
但是一定要确保每个主机都使用相同的subnet