docker基础之六network-4-weave

weave


需要FQ:

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

chmod a+x /usr/local/bin/weave

  

在nas4中运行命令

weave launch --no-detect-tls

  

启动weave相关服务,weave组件以容器方式运行

老版本weave 1.8.2运行三个容器:

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

weaveplugin是libnetwork CNM driver,实现docker网络

weaveproxy提供docker命令的代理服务,当用户运行docker cli创建容器时,它会自动将容器添加到weave网络

 

当前版本

[root@nas4 ~]# weave version
weave script 2.5.2
weave 2.5.2

  

列出weave相关容器

[root@nas4 ~]# docker ps -a
CONTAINER ID        IMAGE                        COMMAND                  CREATED             STATUS              PORTS               NAMES
e4833cab904b        weaveworks/weave:2.5.2       "/home/weave/weaver …"   5 hours ago         Up 24 minutes                           weave
6399794ec9eb        weaveworks/weaveexec:2.5.2   "data-only"              5 hours ago         Created                                 weavevolumes-2.5.2
6715af48c9d5        weaveworks/weavedb:latest    "data-only"              5 hours ago         Created                                 weavedb

  

weave-2.5.2创建了三个容器,仅仅运行了一个容器,容器内的进程如下:

/home/weave/weaver --port 6783 --nickname nas4 --host-root=/host --docker-bridge docker0 --weave-bridge weave --datapath datapath --ipalloc-range 10.32.0.0/12 --dns-listen-address 10.5.4.1:53 --http-addr 127.0.0.1:6784 --status-addr 127.0.0.1:6782 --resolv-conf /var/run/weave/etc/resolv.conf -H unix:///var/run/weave/weave.sock --plugin --proxy

  

weave会创建一个新的docker网络weave

[root@nas4 ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
14d77facdfd3        bridge              bridge              local
d2847ceac9a3        host                host                local
11b44b36f998        none                null                local
26875ffedd52        weave               weavemesh           local

  

driver为weavemesh,ip范围10.32.0.0/12

[root@nas4 ~]# docker network inspect weave
[
    {
        "Name": "weave",
        "Id": "26875ffedd52eb7fcc03965f768170b57cb65c62a191126ce8d86ce10452009a",
        "Created": "2019-08-26T11:49:46.656245729+08:00",
        "Scope": "local",
        "Driver": "weavemesh",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "weavemesh",
            "Options": null,
            "Config": [
                {
                    "Subnet": "10.32.0.0/12"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {},
        "Options": {
            "works.weave.multicast": "true"
        },
        "Labels": {}
    }
]

  

运行容器前

[root@nas4 ~]# echo  $(weave env)
export DOCKER_HOST=unix:///var/run/weave/weave.sock ORIG_DOCKER_HOST=
[root@nas4 ~]# eval  $(weave env)

  

作用就是将后续的docker命令发给weaveexec(或称weaveproxy)处理,若执行后想恢复原先的环境 eval $(weave env --restore) 

 

nas4上运行第一个容器

[root@nas4 ~]# docker run --name bbox1 -itd busybox
4fe6729d8cb1c72e3aa382e560111721f1772147d6ab620228acc72664f8b966

  

查看当前容器的bbox1的网络配置

[root@nas4 ~]# docker exec 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:0a:05:04:02 brd ff:ff:ff:ff:ff:ff
    inet 10.5.4.2/24 brd 10.5.4.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 2a:6d:18:f4:d2:c1 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

  

bbox1有两个网卡eth0和ethwe:

其一,eth0连接的是默认bridge网络,即网桥docker0

[root@nas4 ~]# ip a |grep 15:
15: veth6df5fc7@if14: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default 
[root@nas4 ~]# brctl show docker0
bridge name	bridge id		STP enabled	interfaces
docker0		8000.0242877f9a3f	no		veth6df5fc7

  

其二,网卡ethwe,与vethwepl8554是一对veth pair,而vethwepl8554挂载nas4的linux bridge weave上,

[root@nas4 ~]# ip a |grep 17:
17: vethwepl8554@if16: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1376 qdisc noqueue master weave state UP group default 

[root@nas4 ~]# brctl show weave
bridge name	bridge id		STP enabled	interfaces
weave		8000.ba793b554f35	no		vethwe-bridge
							vethwepl8554

  

另外weave上还挂了一个vethwe-bridge,

[root@nas4 ~]# ip a |grep vethwe-bridge
11: vethwe-datapath@vethwe-bridge: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1376 qdisc noqueue master datapath state UP group default 
12: vethwe-bridge@vethwe-datapath: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1376 qdisc noqueue master weave state UP group default 

  

vethwe-bridge与vethwe-datapath是veth pair

vethwe-datapath 的父设备(master)是datapath

[root@nas4 ~]# ip a |grep datapath
6: datapath: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1376 qdisc noqueue state UNKNOWN group default qlen 1000
11: vethwe-datapath@vethwe-bridge: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1376 qdisc noqueue master datapath state UP group default 
12: vethwe-bridge@vethwe-datapath: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1376 qdisc noqueue master weave state UP group default 
13: vxlan-6784: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 65535 qdisc noqueue master datapath state UNKNOWN group default qlen 1000

  

datapath是一个openvswitch

[root@nas4 ~]# ip -d link |grep -A 2 " datapath: "
6: datapath: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1376 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/ether 4e:2b:53:e0:4b:d6 brd ff:ff:ff:ff:ff:ff promiscuity 1 
    openvswitch addrgenmode eui64 numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535 

  

vxlan-6784是vxlan interface,其master也是datapath,weave主机间是通过vxlan通信


nas4的网络结构图如下:

 

weave网络包含两个虚拟交换机:

linux bridge weave和openvswitch datapath,veth pair vethwe-bridge和vethwe-datapath将二者连接在一起,weave和datapath分工不同,weave负责将容器接入weave网络,datapath负责在主机间vxlan隧道中收发数据

再运行一个容器bbox2

docker run --name bbox2  -itd busybox

[root@nas4 ~]# 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
20: eth0@if21: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue 
    link/ether 02:42:0a:05:04:03 brd ff:ff:ff:ff:ff:ff
    inet 10.5.4.3/24 brd 10.5.4.255 scope global eth0
       valid_lft forever preferred_lft forever
22: ethwe@if23: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1376 qdisc noqueue 
    link/ether 9a:ad:bb:6a:32:b1 brd ff:ff:ff:ff:ff:ff
    inet 10.32.0.2/12 brd 10.47.255.255 scope global ethwe
       valid_lft forever preferred_lft forever

  

查看网络变化

[root@nas4 ~]# brctl show docker0
bridge name	bridge id		STP enabled	interfaces
docker0		8000.0242877f9a3f	no		veth6df5fc7
							vethb2d570b
[root@nas4 ~]# ip a |grep 21:
21: vethb2d570b@if20: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default 


[root@nas4 ~]# ip a |grep 23:
23: vethwepl10299@if22: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1376 qdisc noqueue master weave state UP group default 

  

weave dns为容器创建了默认域名weave.local,bbox1能够直接通过hostname与bbox2通信

[root@nas4 ~]# docker exec bbox1 hostname
bbox1
[root@nas4 ~]# docker exec bbox2 hostname
bbox2

[root@nas4 ~]# docker exec bbox1 ping -c 2 bbox2
PING bbox2 (10.32.0.2): 56 data bytes
64 bytes from 10.32.0.2: seq=0 ttl=64 time=0.181 ms
64 bytes from 10.32.0.2: seq=1 ttl=64 time=0.188 ms

--- bbox2 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.181/0.184/0.188 ms

  

当前nas4网络结构图如下:

 

部署nas5并分析weave的连通与隔离特性

weave launch 10.1.1.14 --no-detect-tls

  

必须指定ip,俩台主机的weave网络才能在一个网络里

 

nas5上运行容器

[root@nas5 ~]# eval $(weave env)
[root@nas5 ~]# docker run -itd --name bbox3 busybox
991edd3726ea088bb9025550ce1569b860a7bac1cca44edb02081e9ab6a06c31

[root@nas5 ~]# 
[root@nas5 ~]# docker exec bbox3 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 1450 qdisc noqueue 
    link/ether 02:42:0a:05:38:02 brd ff:ff:ff:ff:ff:ff
    inet 10.5.56.2/24 brd 10.5.56.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 56:b7:40:d7:3f:f5 brd ff:ff:ff:ff:ff:ff
    inet 10.44.0.0/12 brd 10.47.255.255 scope global ethwe
       valid_lft forever preferred_lft forever
[root@nas5 ~]# docker exec bbox3 ping -c 2 bbox1
PING bbox1 (10.32.0.1): 56 data bytes
64 bytes from 10.32.0.1: seq=0 ttl=64 time=7.822 ms
64 bytes from 10.32.0.1: seq=1 ttl=64 time=1.068 ms

--- bbox1 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 1.068/4.445/7.822 ms
[root@nas5 ~]# docker exec bbox3 ping -c 2 bbox2
PING bbox2 (10.32.0.2): 56 data bytes
64 bytes from 10.32.0.2: seq=0 ttl=64 time=8.946 ms
64 bytes from 10.32.0.2: seq=1 ttl=64 time=1.308 ms

--- bbox2 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 1.308/5.127/8.946 ms

  

bbox1、bbox2和bbox3的ip分别为10.32.0.1/12、10.32.0.2/12和10.44.0.0/12,掩码都为12,实际三个ip位于同一个subnet 10.32.0.0/12。通过nas4和nas5之间的vxlan隧道,三个容器逻辑上是在同一在lan中,所以可直接通信,bbox3 ping bbox1数据流如下图:

 

分析流量:

1)数据包目的地址为10.32.0.1,根据bbox3的路由表,数据从ethwe发送出去

[root@nas5 ~]# docker exec bbox3 route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         10.5.56.1       0.0.0.0         UG    0      0        0 eth0
10.5.56.0       0.0.0.0         255.255.255.0   U     0      0        0 eth0
10.32.0.0       0.0.0.0         255.240.0.0     U     0      0        0 ethwe
224.0.0.0       0.0.0.0         240.0.0.0       U     0      0        0 ethwe

  

2)nas5 weave查询到目的主机,将数据通过vxlan发送给nas4

3)nas4接受到数据,根据目的ip将数据发给bbox1


weave网络隔离

默认配置下,weave使用一个subnet(10.32.0.0/12),所有主机的容器都从这个地址空间中分配ip,因为同属于一个subnet,容器可以直接通信。如果要实现网络隔离,可以通过环境变量WEAVE_CIDR为容器分配不同subnet的ip,

weave网络隔离,-e设置环境变量,

为容器分配不同的subnet的ip

[root@nas5 ~]# docker run -e WEAVE_CIDR=net:10.32.2.0/24 -itd --name bbox4 busybox
f931ab9b44a2e449aeb0ac23145563d8bf00aed711b8f0a27664b061b36f9a07

[root@nas5 ~]# docker exec bbox4 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 1450 qdisc noqueue 
    link/ether 02:42:0a:05:38:03 brd ff:ff:ff:ff:ff:ff
    inet 10.5.56.3/24 brd 10.5.56.255 scope global eth0
       valid_lft forever preferred_lft forever
20: ethwe@if21: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1376 qdisc noqueue 
    link/ether 86:17:14:3b:6a:1d brd ff:ff:ff:ff:ff:ff
    inet 10.32.2.128/24 brd 10.32.2.255 scope global ethwe
       valid_lft forever preferred_lft forever
[root@nas5 ~]# docker exec bbox4 ping -c 2 bbox3
PING bbox3 (10.44.0.0): 56 data bytes

--- bbox3 ping statistics ---
2 packets transmitted, 0 packets received, 100% packet loss
[root@nas5 ~]# docker exec bbox4 route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         10.5.56.1       0.0.0.0         UG    0      0        0 eth0
10.5.56.0       0.0.0.0         255.255.255.0   U     0      0        0 eth0
10.32.2.0       0.0.0.0         255.255.255.0   U     0      0        0 ethwe
224.0.0.0       0.0.0.0         240.0.0.0       U     0      0        0 ethwe

  

bbox3和bbox4分别处于10.32.0.0/12、10.32.2.0/24,位于不同subnet,所以不通

 

为容器分配指定的ip

[root@nas5 ~]# docker run -e WEAVE_CIDR=ip:10.32.6.6/24 -itd --name=bbox5 busybox
97d6b68b91434c5b3735d19312cc7719573b2f4d9ebe2a7a366b6e271440f308
[root@nas5 ~]# docker exec bbox5 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
22: eth0@if23: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1450 qdisc noqueue 
    link/ether 02:42:0a:05:38:04 brd ff:ff:ff:ff:ff:ff
    inet 10.5.56.4/24 brd 10.5.56.255 scope global eth0
       valid_lft forever preferred_lft forever
24: ethwe@if25: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1376 qdisc noqueue 
    link/ether 46:65:07:93:9a:93 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与外网的连通性

weave是一个私有的vxlan网络,默认与外部网络隔离,

[root@nas4 ~]# ip a show weave
8: weave: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1376 qdisc noqueue state UP group default qlen 1000
    link/ether ba:79:3b:55:4f:35 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::b879:3bff:fe55:4f35/64 scope link 
       valid_lft forever preferred_lft forever

  

如何实现外部网络能访问到weave中的容器?
将主机加入到weave网络,然后把主机当作访问weave网络的网关

[root@nas4 ~]# weave expose
10.32.0.3

  

该ip 10.32.0.3会被配置到host1的weave网桥上

[root@nas4 ~]# ip a show weave
8: weave: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1376 qdisc noqueue state UP group default qlen 1000
    link/ether ba:79:3b:55:4f:35 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::b879:3bff:fe55:4f35/64 scope link 
       valid_lft forever preferred_lft forever

  

当前host1的网络结构:如下图

 

weave网桥位于root namespace,它负责将容器接入weave网络。给weave配置同一subnet的ip其本质就是将nas4接入weave网络,nas4现在已经可以直接与同一weave网络中的容器通信啦,无论容器是否位于nas4

测试,在nas4中ping 同一主机的bbox1

[root@nas4 ~]# ping -c 2 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.271 ms
64 bytes from 10.32.0.1: icmp_seq=2 ttl=64 time=0.095 ms

--- 10.32.0.1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 0.095/0.183/0.271/0.088 ms

  

ping nas5上的bbox3

[root@nas4 ~]# ping -c 2 10.44.0.0
PING 10.44.0.0 (10.44.0.0) 56(84) bytes of data.
64 bytes from 10.44.0.0: icmp_seq=1 ttl=64 time=8.23 ms
64 bytes from 10.44.0.0: icmp_seq=2 ttl=64 time=0.895 ms

--- 10.44.0.0 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1002ms
rtt min/avg/max/mdev = 0.895/4.567/8.239/3.672 ms

  

其他非weave主机访问bbox1和,bbox3,添加路由,网关指向weave机器就好

[root@nas5 ~]# route add -net 10.32.0.0 netmask 255.240.0.0  gw 10.1.1.14
[root@nas5 ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.200.1   0.0.0.0         UG    0      0        0 ens37
10.1.1.0        0.0.0.0         255.255.255.0   U     0      0        0 ens33
10.5.56.0       0.0.0.0         255.255.255.0   U     0      0        0 docker0
10.32.0.0       10.1.1.14       255.240.0.0     UG    0      0        0 ens33
169.254.0.0     0.0.0.0         255.255.0.0     U     1002   0        0 ens33
169.254.0.0     0.0.0.0         255.255.0.0     U     1003   0        0 ens37
192.168.200.0   0.0.0.0         255.255.255.0   U     0      0        0 ens37

[root@node12 ~]# ip route
default via 192.168.2.1 dev ens33 proto dhcp metric 100 
10.32.0.0/12 via 192.168.2.215 dev ens33 
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 
192.168.2.0/24 dev ens33 proto kernel scope link src 192.168.2.102 metric 100 

[root@nas5 ~]# ping -c 2 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=63 time=2.23 ms
64 bytes from 10.32.0.1: icmp_seq=2 ttl=63 time=0.631 ms

--- 10.32.0.1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1002ms
rtt min/avg/max/mdev = 0.631/1.431/2.232/0.801 ms
[root@nas5 ~]# ping -c 2 10.44.0.0
PING 10.44.0.0 (10.44.0.0) 56(84) bytes of data.
64 bytes from 10.44.0.0: icmp_seq=1 ttl=63 time=5.01 ms
64 bytes from 10.44.0.0: icmp_seq=2 ttl=63 time=2.07 ms

--- 10.44.0.0 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1002ms
rtt min/avg/max/mdev = 2.074/3.545/5.016/1.471 ms

  

通过上面添加路由实现外网到weave方向的通信,反方向呢?

容器本身挂载默认的bridge网络上,docker0已经是实现了nat可访问外网


IPAM

10.32.0.0/12 是 weave 网络使用的默认 subnet,如果此地址空间与现有 IP 冲突,可以通过 --ipalloc-range 分配特定的 subnet。

weave launch --ipalloc-range 10.2.0.0/16

  

不过请确保所有 host 都使用相同的 subnet。

 

posted @ 2019-09-11 15:57  larlly  阅读(348)  评论(0)    收藏  举报