Weave网络介绍

Weave是 Weaveworks 开发的容器网络解决方案。weave 创建的虚拟网络可以将部署在多个主机上的容器连接起来。对容器来说,weave 就像一个巨大的以太网交换机,所有容器都被接入这个交换机,容器可以直接通信,无需 NAT 和端口映射。除此之外,weave 的 DNS 模块使容器可以通过 hostname 访问。

使用环境

weave 不依赖分布式数据库(例如 etcd 和 consul)交换网络信息,每个主机上只需运行 weave 组件就能建立起跨主机容器网络。我们会在 host1 和 host2 上部署 weave 并实践 weave 的各项特性。

Weava下载安装

其实就是下载一个weave的命令

curl -L git.io/weave -o /usr/local/bin/weave
chmod +x /usr/local/bin/weave

使用weave可以进行跨主机的容器网络的通信,这时需要在其中一台下载一些weave需要的组件

weave launch

启动 weave 相关服务。weave 的所有组件都是以容器方式运行的,weave 会从 docker hub 下载最新的 image 并启动容器

Weave网络部署

实验环境

一台已安装docker的linux系统即可

实验目的

安装完成weave并启动服务,进行网络分析,理解weave网络的原理结构

实验步骤

按照以上步骤两台主机下载安装weave命令

启动weave服务

第一次启动过程中会下载一些所需要的组件

[root@localhost ~]# weave launch
...
WARNING: existing iptables rule

    '-A FORWARD -j REJECT --reject-with icmp-host-prohibited'

will block name resolution via weaveDNS - please reconfigure your firewall.
8dfaae8e2441dab13f29d45777033161dd61ee86a93dc304cc33d956c957db0e

下载启动完成后,会报出一条警告(WARNING),需要添加一条防火墙策略

[root@localhost ~]# iptables -A FORWARD -j REJECT --reject-with icmp-host-prohibited
[root@localhost ~]# iptables-save

weave启动完成后,会创建出一个新的docker网络weave,驱动类型为weavemesh

[root@localhost ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
b5f7f7433bac        bridge              bridge              local
dc8bfdbda464        host                host                local
ecbab8a758e6        none                null                local
867d84127656        weave               weavemesh           local

同时也会多出三个关于weave服务的镜像

[root@localhost ~]# docker images
REPOSITORY             TAG    
weaveworks/weaveexec   2.6.2  
weaveworks/weave       2.6.2  
busybox                latest 
httpd                  latest 
centos                 latest 
weaveworks/weavedb     latest 

weave:是主程序,负责建立weave网络,收发数据,提供DNS服务等

weaveexec:是libnetwork CNM dirver,实现docker网络

weavedb:提供 Docker 命令的代理服务,当用户使用weave集群中的docker创建容器时,它会自动将容器添加到 weave 网络。

查看weave网络信息,10.32.0.0/12是weave的默认网段

[root@localhost ~]# docker network inspect  weave 
...
                    "Subnet": "10.32.0.0/12"
...

使用weave网络

执行以下命令,类似于进入一个网络的命名空间,在此模式下创建的容器将会默认使用weave网络的ip网段

[root@localhost ~]# eval $(weave env)

运行容器查看获取ip,会发现一共有两个网段的网卡,一个是用于与docker0网卡桥接,可以连接外网,一个是weave网络

[root@localhost ~]# docker run -itd --name bbox1 busybox
e037fae99556cb18885263eea8828209da046bd5ff706f0f9e75191f009e0d1c
[root@localhost ~]# docker exec -it bbox1 ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
14: eth0@if15: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue 
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever
16: ethwe@if17: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1376 qdisc noqueue 
    link/ether 12:26:df:0d:77:f6 brd ff:ff:ff:ff:ff:ff
    inet 10.32.0.1/12 brd 10.47.255.255 scope global ethwe
       valid_lft forever preferred_lft forever

退出weave的空间

[root@localhost ~]# eval $(weave env --restore)

运行容器查看是否不使用weave网络,只有一个docker0的桥接网卡即可

[root@localhost ~]# docker run -itd --name bbox2 busybox
5053ec897dd4a891638cde416298754a289ae4d9602e6cfe735fef096a00d3c8
[root@localhost ~]# docker exec -it bbox2 ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
18: eth0@if19: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue 
    link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever

删除bbox2容器,以防一会混乱容器

[root@localhost ~]# docker rm -f bbox2

分析weave网络结构

192.168.1.12

进入weave网络,并查看容器ip

[root@localhost ~]# eval $(weave env)
[root@localhost ~]# docker exec -it bbox1 ip a
...
14: eth0@if15: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue 
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever
16: ethwe@if17: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1376 qdisc noqueue 
    link/ether 12:26:df:0d:77:f6 brd ff:ff:ff:ff:ff:ff
    inet 10.32.0.1/12 brd 10.47.255.255 scope global ethwe
       valid_lft forever preferred_lft forever

网卡eth0是14@15,网卡eth1是16@17,那在物理机网络中,应该存在15@14和17@16两块桥接网卡

[root@localhost ~]# ip a
...
15: veth6acf677@if14: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default 
    link/ether 46:ac:ac:06:9a:1e brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet6 fe80::44ac:acff:fe06:9a1e/64 scope link 
       valid_lft forever preferred_lft forever
17: vethwepl69282@if16: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1376 qdisc noqueue master weave state UP group default 
    link/ether 96:17:02:33:bf:9e brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet6 fe80::9417:2ff:fe33:bf9e/64 scope link 
       valid_lft forever preferred_lft forever

查看桥接网卡,docker0的接口对应着15@14的veth6acf677,weave的接口对应着17@16的vethwepl69282,而且还多了一块vethwe-bridege,其实这个网卡在主机中也是存在的。

[root@localhost ~]# brctl show
bridge name    bridge id        STP enabled    interfaces
docker0        8000.024217bee795    no        veth6acf677
virbr0        8000.525400d7704d    yes        virbr0-nic
weave        8000.263aad39cd6c    no        vethwe-bridge
                                       vethwepl69282

当weave被使用启动之后,物理机会多出好多块网卡,我将ip a查看物理机网卡信息后的内容整理如下

物理机网络信息

[root@localhost ~]# ip a
6: datapath: 
8: weave: 
11: vethwe-datapath@vethwe-bridge: master datapath
12: vethwe-bridge@vethwe-datapath: master weave
13: vxlan-6784: master datapath
15: veth6acf677@if14: master docker0
17: vethwepl69282@if16: master weave

这里需要结合容器内的网卡信息来捋通,各个网卡之间的关系

bbox1容器内网络信息

[root@localhost ~]# docker exec -it bbox1 ip a
...
14: eth0@if15: 
16: ethwe@if17: 

物理机的17号网卡**vethwepl69282与容器内的16号网卡ethwe是用于容器内的网络与weave**网络连接的网卡。

在查看物理机信息时,17号网卡的信息中有master weave,他所连接的是weave网卡

使用**brctl show查看到weave中桥接了两块网卡,一个是17号网卡vethwepl69282,一个是vethwe-bridge**

weave网络关系

如图所示:

查看12号网卡**vethwe-bridge时,他所绑定的网卡为11号网卡vethwe-datapath**,如图红线处所示,第一次看到两个绑定的卡都在物理机内,之前的网卡都是一块在容器内,一块在物理机来进行绑定的

11号网卡**vethwe-datapath的master是datapath**如绿线所示

12好网卡的**vethwe-bridge的master是weave**,如蓝线所示

这里又冒出一个datapath,在查看物理网卡是多出来的网卡还有13号网卡**vxlan-6784**,它的master也是datapath

查看datapath的属性

[root@localhost ~]# ip -d link
# 提取以下关键信息
6: datapath:

    openvswitch addrgenmode eui64 numtxqueues

它的属性为openvswitch,是一个开源的软件交换机,是一个模拟二层数据交换的封装,在一开始就说过weave是一个巨大到以太网交换机,关于openvswitch的其他特点及功能,请查阅其他资料,这里不多赘述。只需要知道它有交换机的功能即可。

总结weave网络

如图:

weave理论

weave 网络包含两个虚拟交换机: weavedatapathvethwe-bridgevethwe-datapath 将二者连接在一起。

weavedatapath 分工不同,weave 负责将容器接入 weave 网络,datapath 负责在主机间vxlan 隧道中并收发数据。

如果还是不懂,请参考原理图将分析weave网络结构再看一遍。

这是单主机内一个容器的原理,两个容器无非就是docker0桥接两个容器的网卡,weave也会作为第二个容器的master然后,连接两个容器到vethwe-bridge然后通过vxlan进行与其他主机通信

详情参考下一篇文档

weave网络隔离(手动指定)

指定地址参数WEAVE_CIDR

指定网段:WEAVE_CIDR=net:10.10.0.0/24

指定ip:WEAVE_CIDR=ip:10.10.10.10/24

生成环境中一般会使用指定网段能多一些。

指定网段

指定网段不能超出10.32.0.0/12的范围

如下,指定网段为10.32.2.0/24

[root@localhost ~]# docker run -e WEAVE_CIDR=net:10.32.2.0/24 -it busybox

查看ip,自动分配了ip为10.32.2.1/24

/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
36: eth0@if37: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue 
    link/ether 02:42:ac:11:00:04 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.4/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever
38: ethwe@if39: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1376 qdisc noqueue 
    link/ether 86:55:8e:63:4e:a1 brd ff:ff:ff:ff:ff:ff
    inet 10.32.2.1/24 brd 10.32.2.255 scope global ethwe
       valid_lft forever preferred_lft forever
/ # ip r
default via 172.17.0.1 dev eth0 
10.32.2.0/24 dev ethwe scope link  src 10.32.2.1 
172.17.0.0/16 dev eth0 scope link  src 172.17.0.4 
224.0.0.0/4 dev ethwe scope link 

这时候如果使用这个容器来ping之前的bbox1的10.32.0.1/12是ping不通的

因为10.32.0.0/12和10.32.2.0/24不是同一个网段

/ # ping bbox1
PING bbox1 (10.32.0.1): 56 data bytes

指定ip

指定ip地址为10.32.6.6/24

[root@localhost ~]# docker run -e WEAVE_CIDR=ip:10.32.6.6/24 -it busybox 

查看ip

/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
40: eth0@if41: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue 
    link/ether 02:42:ac:11:00:04 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.4/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever
42: ethwe@if43: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1376 qdisc noqueue 
    link/ether 26:1a:91:76:36:13 brd ff:ff:ff:ff:ff:ff
    inet 10.32.6.6/24 brd 10.32.6.255 scope global ethwe
       valid_lft forever preferred_lft forever

外部网络访问weave网络

前面的实验中,可能有的人回去尝试ping使用物理机去ping容器的weave网络的ip,实则是ping不同的,因为weave网络还没有网关

一般来说桥接卡都会有一个地址

[root@localhost ~]# ip a
...
8: weave: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1376 qdisc noqueue state UP group default qlen 1000
    link/ether 26:3a:ad:39:cd:6c brd ff:ff:ff:ff:ff:ff
    inet6 fe80::243a:adff:fe39:cd6c/64 scope link 
       valid_lft forever preferred_lft forever
...

weave 是一个私有的 VxLAN 网络,默认与外部网络隔离。外部网络如何才能访问到 weave 中的容器呢?

答案是:

  1. 首先将主机加入到 weave 网络。
  2. 然后把主机当作访问 weave 网络的网关。

将主机加入weave网络

只需一条命令即可,然后会弹出一个IP地址,这个ip就是分配给weave网卡的

weave expose --with-masquerade:仅允许本机访问容器,其他主机不可以。

[root@localhost ~]# weave expose
10.32.0.3

然后再次查看weave的网卡信息

[root@localhost ~]# ip a
...
8: weave: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1376 qdisc noqueue state UP group default qlen 1000
    link/ether 26:3a:ad:39:cd:6c brd ff:ff:ff:ff:ff:ff
    inet 10.32.0.3/12 brd 10.47.255.255 scope global weave
       valid_lft forever preferred_lft forever
    inet6 fe80::243a:adff:fe39:cd6c/64 scope link 
       valid_lft forever preferred_lft forever
...

验证物理机可以ping通weave网络的容器,比如之前的bbox1的ip10.32.0.1

[root@localhost ~]# ping -c2 10.32.0.1
PING 10.32.0.1 (10.32.0.1) 56(84) bytes of data.
64 bytes from 10.32.0.1: icmp_seq=1 ttl=64 time=0.170 ms
64 bytes from 10.32.0.1: icmp_seq=2 ttl=64 time=0.119 ms

--- 10.32.0.1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 999ms
rtt min/avg/max/mdev = 0.119/0.144/0.170/0.028 ms

这时候主机会多出一条路由条目

10.32.0.0/12 dev weave proto kernel scope link src 10.32.0.3

表示外部访问10.32.0.0/12网段中的地址时,由weave网卡10.32.0.3作为网关来转发

[root@localhost ~]# ip r
default via 192.168.1.3 dev ens33 proto static metric 100 
10.32.0.0/12 dev weave proto kernel scope link src 10.32.0.3 
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 
192.168.1.0/24 dev ens33 proto kernel scope link src 192.168.1.12 metric 100 
192.168.122.0/24 dev virbr0 proto kernel scope link src 192.168.122.1 

指定weave网络的网段地址

启动服务后,默认会使用10.32.0.0/12地址段的所有网络,如果想去自定义网段,请执行weave launch --ipalloc-range x.x.x.x/xx即可

评论




正在载入...
PoweredHexo
HostedAliyun
DNSAliyun
ThemeVolantis
UV
PV
BY-NC-SA 4.0