实验环境
系统:Centos 7.3
docker version: 1.13.1
weave version:2.5.2
firwalld: dead(否则需要打开相应的6783端口)
三台虚拟机: IP-9: 192.168.159.9 IP-10: 192.168.159.10 IP-11:192.168.159.11(虚拟机不要用克隆)
安装
在三台服务器上执行下面的命令安装weave:
curl -L git.io/weave -o /usr/local/bin/weave
chmod a+x /usr/local/bin/weave
在三台服务器上安装docker.
启动Weave网络
LINUX-IP-9> weave launch
LINUX-IP-10> weave launch 192.168.159.9
LINUX-IP-11> weave launch 192.168.159.9
验证是否安装成功
linux> weave version
linux> weave status connections
如果报错: IP allocation was seeded by different peers,如下:
则是:虚拟机来自同一个虚拟机克隆过来的,所有机器的machine-id会是一样的。就会引起不同主机间连接失败,因为每台主机Weave网桥上的虚拟网卡分配的IP段是一样的。
解决办法:
#为每台机器重新生成不同的machine-id:
linux> rm /etc/machine-id /var/lib/dbus/machine-id
linux> dbus-uuidgen --ensure
linux> systemd-machine-id-setup
linux> reboot
如果出现服务器无法连接,则是:要连接的服务器的相应的端口(6783)没有开放。要么关闭防火墙要么把所有服务器的6783端口打开。可以用 telnat IP PORT 测试下。
linux> weave status
linux> docker ps -a
查看创建的容器,一共有3个,一个状态是UP,两个是Created。
weaveexec weavedb是两个存储容器,是通过docker create 创建的。它们仅仅是存储容器,所以状态不需要运行。
测试Weave的连通性
可以用三种方式来使用weave网络:
- 使用weave run命令直接运行容器(weave 2.0 以上的版本废弃)
- 使用weave env命令修改DOKCER_HOST环境变量的值,可以让后续执行的docker命令转发给weave proxy处理。
- 使用weave plugin,在运行容器的时候使用--net=weave参数。
通过weave env方式测试连通性
执行命令 eval $(weave env)修改DOKCER_HOST环境变量的值,执行命令测试如下:[root@IP-11 ~]# systemctl status docker -l
同一宿主机连通性测试
跨主机连通性测试
通过weave plugin 方式测试连通性
如果要恢复之前的环境,取消docker转发给weave,则执行eval $(weave env --restore).
因为容器box-5和box-6在同一个网络weave中,可以通过IP来访问,而无法通过容器名字ping通其他的容器,这是因为这种方式默认没有启动DNS服务,需要添加参数 -h c2.weave.local $(weave dns-args)
weave 参数详解
weave lanuch 参数:
# 1.连接不受信任网络中的容器时,可以使用 --password参数或者环境变量WEAVE_PASSWORD加密流量
weave launch [--password <pass>]
linux> weave launch --password wfvAwt7sj
#或者采用环境变量
linux> export WEAVE_PASSWORD=wfvAwt7sj
linux> weave launch
# 2.要在其他主机上启动Weave Net并创建对等连接.
weave launch <ip_address>
linux> weave launch 192.168.159.9
# 3.开机不随着docker的重新启动而启动,默认是启动docker就重新启动,类似于容器的参数restart
weave launch [--no-restart]
# 4.weave 网络使用的默认subnet是:10.32.0.0/12 ,如果此地址空间与现有 IP 冲突,
# 可以通过 --ipalloc-range 分配特定的 subnet.如果一个peer使用这个子网,其他加入这个节点的peer也需要指定这个子网。
weave lanuch [--ipalloc-range <ip_address>]
linux-9> weave launch --ipalloc-range 10.2.0.0/16
linux-10> weave launch --ipalloc-range 10.2.0.0/16 192.168.159.9
#注意: 确保所有 peer 都使用相同的 subnet.
----
#给存在的容器增加weave网络地址接口
weave attach <ip_address> <container_name/container_id>
linux> docker run -itd --name box1 busybox
linux> weave attach 10.32.0.5 box1
#给存在的容器删除weave网络地址接口
detach detach <ip_address> <container_name/container_id>
linux> weave detach 10.32.0.5 box1
#给存在的容器增加weave网络的dns,无论有没有dns,都会增加新的dns
weave dns-add <container_id/container_name> -h <dns>.weave.local
linux> eval $(weave env)
linux> docker run -itd -h box-1 --name box-1 busybox
linux> weave dns-add box-1 -h box-1-other.weave.local
#删除已有的dns
weave dns-remove <container_id/container_name> -h <dns>.weave.local
linux> weave dns-remove box-1 -h box-1-other.weave.local
#解析weave网络中已有的dns记录
linux> weave dns-lookup box-1-other
#宿主机到容器的连通性
#执行命令将给主机上的weave网桥设备分配ip地址,添加相应的IP的路由。
weave expose
#取消宿主机到容器的连通性
weave hide
weave原理解析
查看当前网络的配置:
一个默认的网卡,一个docker的默认网桥。安装了weave之后:
以上我们看出多出了datapah weave 网桥,以及dummy0、vethwe-datapath@vethwe-bridge、vethwe-bridge@vethwe-datapath、vxlan-6784网络设备。
- datapath是open vswitch设备
- weave是虚拟网桥设备
- veth-datapath 和veth-bridge是 veth pair设备
- vxlan-6784是 vxlan的接口
此时,我们启动一个容器加入weave网络,查看网络设备:
比上一个图增加了两个veth pair设备。(不知道大家有没有疑惑,为啥从11到15没有12和13呢?下面就解惑)进入容器中,查看创建的网络设备:
我们看到 eth0@if13给容器提供的是默认的网络接口所以地址是172.17.0.2/16。ethwe@if15提供的是weave网络的网络接口所以地址是10.32.0.1/12。此时我们发现12 14编号在容器中。其实veth pair是虚拟网卡对,都是成对出现的。一个会放在网桥上,一个放在虚拟的namespace中,比如容器中。我们记着12和13号是一对虚拟网卡,14和15是一对虚拟网卡。使用 brctl show查看网桥:
因为现在仅仅是单节点测试,没有用到跨主机通信,所以VXLAN和虚拟路由器datapath就没有用到。