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
**
如图所示:
查看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
和 datapath
, vethwe-bridge
和 vethwe-datapath
将二者连接在一起。
weave
和 datapath
分工不同,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 中的容器呢?
答案是:
- 首先将主机加入到 weave 网络。
- 然后把主机当作访问 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
即可