docker容器配置weave网络分析

实验环境

系统: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就没有用到。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值