Docker网络(六)—跨主机通信之Weave网络

 2017年9月24日 20:57   Nick王   云计算    1 评论   255 浏览 

Weave 脚本版本:weave script 2.0.4

Weave 版本 : weave 2.0.4

操作系统:CentOs 7.3

Docker版本:17.06.1-ce

Docker网络(六)—跨主机通信之Weave网络

项目文档:https://www.weave.works/docs/net/latest/overview/

项目地址:https://github.com/weaveworks/weave

Weave网络介绍

Weave网络会创建一个虚拟网络,用来连接横跨多个主机的Docker容器。

使用Weave网络构建的微服务容器,可以在同一个主机,多个主机,甚至于横跨多个数据中心都是没问题的。

Weave网络就像一个大的交换机,应用程序可以很方便的互相访问。而不需要使用端口映射和复杂的link操作。

Weave网络不需要额外的存储。

AA

为什么使用Weave网络?

  • 抛弃繁琐的配置:可以使用标准的端口管理服务(不需要端口映射),使用IP或者容器名称直接通信(内置DNS服务, 不需要做NAT,不需要link)

  • 服务发现:内置DNS服务

  • 不需要外部的集群存储

  • 非常快速

  • 使用VxLan封装,非常友好,这意味着可以非常方便的进行诊断操作

  • 非常安全

  • 多播支持

  • 可以和Kubernetes,Mesos,AWS ECS结合

一个Weave网络是由一定数量的Weave节点构成的。每个Weave路由器运行在不同的宿主机上。

Weave网络中的每个节点都有一个名字,默认是Weave网卡的地址。还有一个人类便于识别的名称,默认是主机名,也可以在Weave启动的时候指定一个名称。

Weave路由器节点之间会建立TCP连接,通过TCP连接,进行心跳检测和交换路由信息。通过配置可以让这条链接进行加密处理。

Weave路由器节点之间也会建立UDP连接,通过UDP连接,进行网络数据包的封装。同样也可以将UDP链接进行加密处理。

Weave路由器节点之间的连接(TCP连接或者UDP连接)可以穿透防火墙,意味着,Weave网络可用于跨数据中心的Docker通信。

Weave网络会在每个宿主机上创建一个网桥,每个容器通过veth pair连接到这个Weave 网桥。容器里面的veth网卡会获取到Weave网络分配给的IP地址和子网掩码。

Weave网络在不通宿主机之间路由数据的方法有两种:fast data path模式(完全工作在内核态),sleeve模式,在这种模式中,发往非本地容器的数据会被内核捕获,然后交给用户态的Weave网络路由器处理,通过UDP发送到其他的Weave节点路由器,然后注入到内核空间,最后再转发到本地的容器中。

Weave网络路由器会学习其他节点特定的MAC地址,然后将已知的信息和拓扑结合起来。

Weave网络可以在partially connected路由数据,通过拓扑交换。比如下图中:节点1 直接连接着 节点2和节点3,如果节点1 先要发送数据到 节点4或者节点5 ,那么先必须发送到节点3。

AA

Weave 网络如何了解网络拓扑?

官网地址:https://www.weave.works/docs/net/latest/concepts/network-topology/

Peers之间的拓扑交流

连接到Weave网络的节点会捕获其他Peers节点的拓扑信息。Weave节点会将自己已知的拓扑,和改变的内容传递给其他节点,以便于所有的Weave Peers了解整过网络拓扑。

Weave节点之间的通信建立在TCP上的,有两种方法:

  • 基于STP(生成树)的广播方法

  • 基于邻居Gossip方法(八卦算法)

以下情况,拓扑信息会发送:

  1. 当一个连接新加入进来的时候,如果远程节点似乎是新加入到Weave网络中的,那么会发送整个网络拓扑,并且增量更新,广播节点两端的连接。

  2. 当一个连接被标记为已经建立,则意味着远端可以从本端接受UDP报文,然后广播一个包含本端信息的数据包。

  3. 当一个连接断开,一个包含本端信息的报文被广播。

  4. 周期性的定时器,整个拓扑信息被gossip给邻居,这是为了拓扑敏感的随机分布系统。这是为了防止由于频繁的拓扑变化,造成广播路由表过时,而使前面提到的广播没有到达所有的peers。

如果Peers更新拓扑信息之后,发现有一个Peer已经离线,那么就会清除掉这个Peer相关的所有的信息。

拓扑过期怎么办?

将拓扑变化信息广播给所有peers不是立即发生的。这就意味着,很有可能一个节点有过期的网络拓扑视图。

如果目的peer的数据包仍然可达,那么过期的拓扑可能会导致一次低效的路由选择。

如果过期的拓扑中目的peer不可达,那么数据包会被丢弃,对于很多协议(如TCP),数据发送会在稍后重新尝试,在这期间拓扑信息应当被正确更新。


安装部署Weave网络

注意:确保宿主机的Linux内核版本在3.8以后,确保Docker版本在1.10以后,并且Docker正在运行。

提示:Weave网络需要TCP 6783端口 和 UDP 6783/6784端口开启;Weave 节点之间会通过 6783 进行通信。

使用下面的命令安装Weave网络:

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

启动Weave 网络

启动之前,先确定Docker是否启动。

Weave网络是以Docker容器的方式运行的,weave会从Docker Hub下载最新的Weave Net Image并启动:

# weave launch
9efa078e85ad704ce0e5faecdc16592364b7ee314811e05baf621c02fd4ead58


# docker ps -a
CONTAINER ID        IMAGE                        COMMAND                  CREATED             STATUS              PORTS               NAMES
9efa078e85ad        weaveworks/weave:2.0.4       "/home/weave/weave..."   4 seconds ago       Up 4 seconds                            weave
2dbcdf45c550        weaveworks/weaveexec:2.0.4   "/bin/false"             5 seconds ago       Created                                 weavevolumes-2.0.4
20393361b1b6        weaveworks/weavedb           "data-only"              5 seconds ago       Created                                 weavedb

发现运行了三个容器:

  • weave容器是主程序,负责建立weave网络,提供DNS服务,收发数据。

  • weavevolumes容器提供卷存储

  • weavedb容器提供数据存储

特别提示:weave容器和主机共享的网络堆栈,和主机共享进程相关的命名空间。

查看容器weave信息:

# docker inspect weave
[
    {
        ……省略……
        "Path": "/home/weave/weaver",
        "Args": [
            "--port",
            "6783",
            "--nickname",
            "container-host-1",
            "--host-root=/host",
            "--docker-bridge",
            "docker0",
            "--weave-bridge",
            "weave",
            "--datapath",
            "datapath",
            "--ipalloc-range",
            "10.32.0.0/12",
            "--dns-effective-listen-address",
            "172.17.0.1",
            "--dns-listen-address",
            "172.17.0.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"
        ],
        ……省略……
        "Name": "/weave",
        ……省略……
        "HostConfig": {
            "Binds": [
                "/var/run/docker.sock:/var/run/docker.sock",
                "/var/run/weave:/var/run/weave",
                "/etc:/var/run/weave/etc",
                "/run/docker/plugins:/run/docker/plugins",
                "/etc:/host/etc",
                "/var/lib/dbus:/host/var/lib/dbus"
            ],
            ……省略……
            "NetworkMode": "host",
            "VolumeDriver": "",
            "VolumesFrom": [
                "weavedb",
                "weavevolumes-2.0.4"
            ],
            ……省略……
            "PidMode": "host",
            "Privileged": true,
            ……省略……
        },
        ……省略……
        "Mounts": [
            ……省略……
            {
                "Type": "bind",
                "Source": "/var/run/weave",
                "Destination": "/var/run/weave",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            },
            {
                "Type": "bind",
                "Source": "/etc",
                "Destination": "/var/run/weave/etc",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            },
            {
                "Type": "bind",
                "Source": "/run/docker/plugins",
                "Destination": "/run/docker/plugins",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            },
            ……省略……
        ],
        "Config": {
            "Hostname": "container-host-1",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "DOCKER_BRIDGE",
                "WEAVE_DEBUG",
                "WEAVE_HTTP_ADDR",
                "WEAVE_PASSWORD",
                "CHECKPOINT_DISABLE",
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
            ],
            "Cmd": [
                "--port",
                "6783",
                "--nickname",
                "container-host-1",
                "--host-root=/host",
                "--docker-bridge",
                "docker0",
                "--weave-bridge",
                "weave",
                "--datapath",
                "datapath",
                "--ipalloc-range",
                "10.32.0.0/12",
                "--dns-effective-listen-address",
                "172.17.0.1",
                "--dns-listen-address",
                "172.17.0.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"
            ],
            "Image": "weaveworks/weave:2.0.4",
            "Volumes": {
                "/var/run/weave:/var/run/weave": {}
            },
            "WorkingDir": "/home/weave",
            "Entrypoint": [
                "/home/weave/weaver"
            ],
            "OnBuild": null,
            ……省略……
        },
        "NetworkSettings": {
            ……省略……
            "Networks": {
                "host": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": null,
                    "NetworkID": "81914897bf39e380ccf670e4199e0ef09072acc439c8970c269cc680a7a96592",
                    "EndpointID": "44af7cd255b121998c5fa2dd9e3568c8b1c0ccaa07cbb9466f245c1662ba58fc",
                    "Gateway": "",
                    "IPAddress": "",
                    "IPPrefixLen": 0,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "",
                    "DriverOpts": null
                }
            }
        }
    }
]

从上面的信息,可以知道:

  1. 容器weave使用的网络驱动是host,也就是用的宿主机的网络命名空间

  2. 容器weave的进程相关的命名空间,也是共享的宿主机的

  3. 宿主机目录/var/run/weave/存储的weave proxy的socket文件

  4. 宿主机目录/var/run/docker/plugins/是Docker网络插件相关的文件

  5. 真正的应用程序是容器中的/home/weave/weaver

此时,weave网络已经就绪:

# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
2f26251d3331        bridge              bridge              local
81914897bf39        host                host                local
d85b0bfc506e        none                null                local
cb8bae80d719        weave               weavemesh           local


# docker network inspect weave
[
    {
        "Name": "weave",
        ……省略……
        "IPAM": {
            "Driver": "weavemesh",
            "Options": null,
            "Config": [
                {
                    "Subnet": "10.32.0.0/12"
                }
            ]
        },
        ……省略……
        "Options": {
            "works.weave.multicast": "true"
        },
        "Labels": {}
    }
]

查看Weave网络的主进程:

# ps -ef|grep $(docker inspect --format="{{.State.Pid}}" weave)
root     25580 25563  0 15:52 ?        00:00:09 /home/weave/weaver --port 6783 --nickname container-host-1 --host-root=/host --docker-bridge docker0 --weave-bridge weave --datapath datapath --ipalloc-range 10.32.0.0/12 --dns-effective-listen-address 172.17.0.1 --dns-listen-address 172.17.0.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网络的所有网卡:

# ip add show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    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
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
    link/ether 00:16:3e:32:15:e1 brd ff:ff:ff:ff:ff:ff
    inet 192.168.10.61/24 brd 192.168.10.255 scope global dynamic eth0
       valid_lft 31511750sec preferred_lft 31511750sec
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN
    link/ether 02:42:2f:01:16:58 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 scope global docker0
       valid_lft forever preferred_lft forever
4: datapath: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1376 qdisc noqueue state UNKNOWN qlen 1000
    link/ether b6:4b:a4:0a:a8:48 brd ff:ff:ff:ff:ff:ff
6: weave: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1376 qdisc noqueue state UP qlen 1000
    link/ether f2:db:ef:36:d8:06 brd ff:ff:ff:ff:ff:ff
7: dummy0: <BROADCAST,NOARP> mtu 1500 qdisc noop state DOWN qlen 1000
    link/ether ea:60:2b:18:31:a9 brd ff:ff:ff:ff:ff:ff
9: vethwe-datapath@vethwe-bridge: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1376 qdisc noqueue master datapath state UP
    link/ether 12:44:ea:be:48:b0 brd ff:ff:ff:ff:ff:ff
10: vethwe-bridge@vethwe-datapath: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1376 qdisc noqueue master weave state UP
    link/ether 36:17:da:59:b8:06 brd ff:ff:ff:ff:ff:ff
16: vxlan-6784: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 65470 qdisc noqueue master datapath state UNKNOWN qlen 1000
    link/ether 8e:5d:1b:18:fe:e4 brd ff:ff:ff:ff:ff:ff

Weave 状态检查,日志查看

#### 查看状态
# weave status

        Version: 2.0.4 (up to date; next check at 2017/09/22 12:41:59)

        Service: router     ### 路由服务
       Protocol: weave 1..2
           Name: f2:db:ef:36:d8:06(container-host-1)
     Encryption: disabled
  PeerDiscovery: enabled
        Targets: 0
    Connections: 0
          Peers: 1
 TrustedSubnets: none

        Service: ipam    ### IP地址管理服务
         Status: idle
          Range: 10.32.0.0/12
  DefaultSubnet: 10.32.0.0/12

        Service: dns       ### DNS 服务
         Domain: weave.local.
       Upstream: 100.100.2.136, 100.100.2.138
            TTL: 1
        Entries: 0

        Service: proxy     ### Docker代理服务
        Address: unix:///var/run/weave/weave.sock

        Service: plugin (legacy)   ### 插件服务
     DriverName: weave

查看weave服务日志:

# docker logs weave
INFO: 2017/09/20 10:30:36.054285 Command line options: map[resolv-conf:/var/run/weave/etc/resolv.conf dns-effective-listen-address:172.17.0.1 dns-listen-address:172.17.0.1:53 plugin:true status-addr:127.0.0.1:6782 datapath:datapath nickname:container-host-1 proxy:true docker-bridge:docker0 http-addr:127.0.0.1:6784 port:6783 
……省略……

启动容器

在宿主机执行如下命令:

# weave env
export DOCKER_HOST=unix:///var/run/weave/weave.sock ORIG_DOCKER_HOST=

# eval $(weave env)

# echo $DOCKER_HOST
unix:///var/run/weave/weave.sock

特别说明:声明环境变量的作用是告诉后续的docker命令都发给weave proxy进行处理。如果要恢复之前的环境,可执行eval $(weave env --restore)

启动容器,并查看网卡配置:

# docker run -itd --name=container1 busybox
4627fe4bfb9ff74e984932158b02e906308c6736a019532d77ad5da4e5e8715f

# docker exec container1 ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1
    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
12: eth0@if13: <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 scope global eth0
       valid_lft forever preferred_lft forever
14: ethwe@if15: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1376 qdisc noqueue
    link/ether 62:31:a5:b7:db:d5 brd ff:ff:ff:ff:ff:ff
    inet 10.32.0.1/12 scope global ethwe
       valid_lft forever preferred_lft forever

利用Weave查看容器分配的IP地址:

# weave ps container1
container1 62:31:a5:b7:db:d5 10.32.0.1/12

Weave Net集群管理

官网相关链接:

上面我们启动了一个Weave Peer,现在在另外一台机器上启动另外一个Peer,并加入到一个集群

# weave launch 192.168.10.61

# weave status

        Version: 2.0.4 (up to date; next check at 2017/09/22 13:42:24)

        Service: router
       Protocol: weave 1..2
           Name: a2:5a:5a:16:2b:56(container-host-2)
     Encryption: disabled
  PeerDiscovery: enabled
        Targets: 1
    Connections: 1 (1 established)   ### 看这里, 表示链接成功
          Peers: 2 (with 2 established connections)  ### 看这里,表示有多少个节点
 TrustedSubnets: none

        Service: ipam
         Status: ready
          Range: 10.32.0.0/12
  DefaultSubnet: 10.32.0.0/12

        Service: dns
         Domain: weave.local.
       Upstream: 100.100.2.136, 100.100.2.138
            TTL: 1
        Entries: 1

        Service: proxy
        Address: unix:///var/run/weave/weave.sock

        Service: plugin (legacy)
     DriverName: weave

提示:还可以在启动的时候同时制定多个peer节点地址,比如weave launch <ip address> <ip address>

动态添加/删除Weave节点

官网地址:https://www.weave.works/docs/net/latest/tasks/manage/finding-adding-hosts-dynamically/

首先要启动Weave:

# weave launch

# weave status

        Version: 2.0.4 (up to date; next check at 2017/09/22 14:49:05)

        Service: router
       Protocol: weave 1..2
           Name: 2e:31:fc:55:39:fd(container-host-3)
     Encryption: disabled
  PeerDiscovery: enabled
        Targets: 0
    Connections: 0  ### 看这里
          Peers: 1
 TrustedSubnets: none

        Service: ipam
         Status: idle
          Range: 10.32.0.0/12
  DefaultSubnet: 10.32.0.0/12

        Service: dns
         Domain: weave.local.
       Upstream: 100.100.2.138, 100.100.2.136
            TTL: 1
        Entries: 0

        Service: proxy
        Address: unix:///var/run/weave/weave.sock

        Service: plugin (legacy)
     DriverName: weave

然后让这个节点加入到集群中:

# weave connect 192.168.10.61


# weave status

        Version: 2.0.4 (up to date; next check at 2017/09/22 14:49:05)

        Service: router
       Protocol: weave 1..2
           Name: 2e:31:fc:55:39:fd(container-host-3)
     Encryption: disabled
  PeerDiscovery: enabled
        Targets: 1
    Connections: 2 (2 established)    ### 看这里
          Peers: 3 (with 6 established connections) 
 TrustedSubnets: none

        Service: ipam
         Status: ready
          Range: 10.32.0.0/12
  DefaultSubnet: 10.32.0.0/12

        Service: dns
         Domain: weave.local.
       Upstream: 100.100.2.138, 100.100.2.136
            TTL: 1
        Entries: 1

        Service: proxy
        Address: unix:///var/run/weave/weave.sock

        Service: plugin (legacy)
     DriverName: weave

其他指令介绍:

# weave forget $DECOMMISSIONED_HOST


# weave connect --replace $NEW_HOST1 $NEW_HOST2   ## 替换节点,旧节点会forget


# weave launch --resume   ## 重启weave 网络,自动加入之前所在的集群; 执行之前 需要 先停止weave

启动,停止,删除节点

官网地址:https://www.weave.works/docs/net/latest/tasks/ipam/stop-remove-peers-ipam/

删除节点:

# weave rmpeer 192.168.10.69 
# eval $(weave env --restore)
# docker ps -a

停止Weave:

# weave stop
# weave status

weave container is not running.

重置(另外一种删除, 会关掉weave容器):

# weave reset

# weave status

weave container is not running.

# weave launch --resume
4f76a177a677d02aa76af9e9b4a08706458aa293b61b74285c88f8709dae2c71

# weave status

Weave网络安全

官网地址:https://www.weave.works/docs/net/latest/tasks/manage/security-untrusted-networks/


Weave网络,通信剖析

首先查看host1上的Weave网络启动是否正常:

# weave status

声明环境变量

# eval $(weave env)

单机容器网络通信剖析

创建一个容器:

# docker run -itd --name=container1 busybox

查看容器中的网卡:

# docker exec container1 ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1
    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
17: eth0@if18: <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 scope global eth0
       valid_lft forever preferred_lft forever
19: ethwe@if20: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1376 qdisc noqueue
    link/ether 16:66:86:ea:35:22 brd ff:ff:ff:ff:ff:ff
    inet 10.32.0.1/12 scope global ethwe
       valid_lft forever preferred_lft forever

可以发现有两块网卡:

  • eth0对端设备序号为18

  • ethwe对端设备序号为20

查看物理机网卡:

# ip a show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    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
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
    link/ether 00:16:3e:32:15:e1 brd ff:ff:ff:ff:ff:ff
    inet 192.168.10.61/24 brd 192.168.10.255 scope global eth0
       valid_lft forever preferred_lft forever
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP
    link/ether 02:42:97:03:01:4b brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 scope global docker0
       valid_lft forever preferred_lft forever
4: datapath: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1376 qdisc noqueue state UNKNOWN qlen 1000
    link/ether b2:61:c8:28:39:43 brd ff:ff:ff:ff:ff:ff
6: weave: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1376 qdisc noqueue state UP qlen 1000
    link/ether f2:db:ef:36:d8:06 brd ff:ff:ff:ff:ff:ff
7: dummy0: <BROADCAST,NOARP> mtu 1500 qdisc noop state DOWN qlen 1000
    link/ether e6:eb:1c:f0:bc:14 brd ff:ff:ff:ff:ff:ff
9: vethwe-datapath@vethwe-bridge: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1376 qdisc noqueue master datapath state UP
    link/ether 16:d6:0e:b3:d8:bd brd ff:ff:ff:ff:ff:ff
10: vethwe-bridge@vethwe-datapath: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1376 qdisc noqueue master weave state UP
    link/ether f2:ad:c0:f8:dc:89 brd ff:ff:ff:ff:ff:ff
16: vxlan-6784: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 65470 qdisc noqueue master datapath state UNKNOWN qlen 1000
    link/ether d6:e6:aa:f2:69:ea brd ff:ff:ff:ff:ff:ff
18: vethe557dfb@if17: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP
    link/ether c2:b8:86:e2:17:53 brd ff:ff:ff:ff:ff:ff link-netnsid 0
20: vethwepl20251@if19: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1376 qdisc noqueue master weave state UP
    link/ether 52:30:a0:3f:cf:19 brd ff:ff:ff:ff:ff:ff link-netnsid 0
  1. 序号为18的网卡为vethe557dfb,所属于docker0网桥(master xxx state UP)

  2. 序号为20的网卡为vethwepl20251,所属于weave网桥

查看网桥详细信息:

# brctl show
bridge name bridge id       STP enabled interfaces
docker0     8000.02429703014b   no      vethe557dfb
weave       8000.f2dbef36d806   no      vethwe-bridge
                            vethwepl20251


# ip link show master docker0
18: vethe557dfb@if17: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP mode DEFAULT
    link/ether c2:b8:86:e2:17:53 brd ff:ff:ff:ff:ff:ff link-netnsid 0


# ip link show master weave
10: vethwe-bridge@vethwe-datapath: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1376 qdisc noqueue master weave state UP mode DEFAULT
    link/ether f2:ad:c0:f8:dc:89 brd ff:ff:ff:ff:ff:ff
20: vethwepl20251@if19: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1376 qdisc noqueue master weave state UP mode DEFAULT
    link/ether 52:30:a0:3f:cf:19 brd ff:ff:ff:ff:ff:ff link-netnsid 0
  1. 网桥docker0只有一块网卡vethe557dfb,另一端连接在虚拟机中的eth0

  2. 网桥weave其中的一块网卡vethwepl20251,另一端连接在虚拟机中的ethwe

  3. 网桥weave其中的另一块网卡vethwe-bridge,另一端网卡是vethwe-datapath

查看网卡vethwe-datapath的详细信息:

# ip -d link show vethwe-datapath
9: vethwe-datapath@vethwe-bridge: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1376 qdisc noqueue master datapath state UP mode DEFAULT
    link/ether 16:d6:0e:b3:d8:bd brd ff:ff:ff:ff:ff:ff promiscuity 1
    veth
    openvswitch_slave addrgenmode eui64

查看网卡datapath的详细信息:

# ip -d link show datapath
4: datapath: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1376 qdisc noqueue state UNKNOWN mode DEFAULT qlen 1000
    link/ether b2:61:c8:28:39:43 brd ff:ff:ff:ff:ff:ff promiscuity 1
    openvswitch addrgenmode eui64    #### 看这里

特别注意:datapath是一个openvswitch设备。

还有一个vxlan设备,查看详细信息:

# ip -d link show vxlan-6784
16: vxlan-6784: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 65470 qdisc noqueue master datapath state UNKNOWN mode DEFAULT qlen 1000
    link/ether d6:e6:aa:f2:69:ea brd ff:ff:ff:ff:ff:ff promiscuity 1
    vxlan id 0 srcport 0 0 dstport 6784 nolearning ageing 300 udpcsum udp6zerocsumrx
    openvswitch_slave addrgenmode eui64

特别注意:VxLan网卡vxlan-6784属于网卡datapath

查看datapath网卡接入的设备:

# ip -d link show master datapath
9: vethwe-datapath@vethwe-bridge: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1376 qdisc noqueue master datapath state UP mode DEFAULT
    link/ether 16:d6:0e:b3:d8:bd brd ff:ff:ff:ff:ff:ff promiscuity 1
    veth
    openvswitch_slave addrgenmode eui64
16: vxlan-6784: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 65470 qdisc noqueue master datapath state UNKNOWN mode DEFAULT qlen 1000
    link/ether d6:e6:aa:f2:69:ea brd ff:ff:ff:ff:ff:ff promiscuity 1
    vxlan id 0 srcport 0 0 dstport 6784 nolearning ageing 300 udpcsum udp6zerocsumrx
    openvswitch_slave addrgenmode eui64    #### 看这里

特别注意:这两个网卡都是openvswitch_slave设备。

此时的网络结构如下图:

AA

Weave网络有两个网桥,分别是weave网桥和datapath网桥,这两个网桥通过一个veth pair联系起来(vethwe-bridgevethwe-datapath)。网桥weave是Linux传统的网桥,负责将容器接入到Weave网络中;网桥datapath是OpenVswitch网桥,负责在主机之间使用VxLan隧道进行收发数据。

此时在host1上再创建一个容器container2:

# docker run -itd --name=container2 busybox


# docker exec container2 ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1
    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
21: eth0@if22: <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 scope global eth0
       valid_lft forever preferred_lft forever
23: ethwe@if24: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1376 qdisc noqueue
    link/ether 9e:3f:92:f3:5f:50 brd ff:ff:ff:ff:ff:ff
    inet 10.32.0.2/12 scope global ethwe
       valid_lft forever preferred_lft forever

查看序号22和序号24的网卡:

# ip -d link show veth4a74463
22: veth4a74463@if21: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP mode DEFAULT
    link/ether ee:7a:7c:49:8e:36 brd ff:ff:ff:ff:ff:ff link-netnsid 1 promiscuity 1
    veth
    bridge_slave addrgenmode eui64

# ip -d link show vethwepl20918
24: vethwepl20918@if23: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1376 qdisc noqueue master weave state UP mode DEFAULT
    link/ether 36:e2:82:2e:6e:3d brd ff:ff:ff:ff:ff:ff link-netnsid 1 promiscuity 1
    veth
    bridge_slave addrgenmode eui64

此时网络结构图如下:

AA

测试联通性:

# docker exec container2 ping container1
PING container1 (10.32.0.1): 56 data bytes
64 bytes from 10.32.0.1: seq=0 ttl=64 time=0.118 ms
64 bytes from 10.32.0.1: seq=1 ttl=64 time=0.089 ms
64 bytes from 10.32.0.1: seq=2 ttl=64 time=0.058 ms
^C

查看DNS记录:

# weave dns-lookup container2
10.32.0.2

# weave dns-lookup container1
10.32.0.1

查看IP地址

# weave ps
weave:expose f2:db:ef:36:d8:06
8d6402685ebe 9e:3f:92:f3:5f:50 10.32.0.2/12
05c52f853cee 16:66:86:ea:35:22 10.32.0.1/12

查看主机名:

# docker inspect --format="{{.Config.Hostname}}" container1
container1

# docker inspect --format="{{.Config.Domainname}}" container1
weave.local

# docker exec container1 hostname
container1.weave.local


# weave report -f "{{.DNS.Entries}}"
[{container1.weave.local. f2:db:ef:36:d8:06 05c52f853cee656b508f328f1ff7236a2a976d9bce7d5f3cf3940b30f50dd67d 10.32.0.1 0 0} {container2.weave.local. f2:db:ef:36:d8:06 8d6402685ebe3633920fbf8939d13b1db3c796fa62fa167bc94494302cda9b6e 10.32.0.2 0 0}]

跨主机Weave网络

首先,host2要和host1的Weave网络要构成一个集群:

# weave launch 192.168.10.61  ### 指定host1的地址


#### 查看节点状态
# weave status peers
a2:5a:5a:16:2b:56(container-host-2)
   -> 192.168.10.61:6783    f2:db:ef:36:d8:06(container-host-1)   established
f2:db:ef:36:d8:06(container-host-1)
   <- 192.168.10.62:32946   a2:5a:5a:16:2b:56(container-host-2)   established

声明环境变量:

# eval $(weave env)

在host2上创建container3:

# docker run -itd --name=container3 busybox

查看容器中的网络:

# docker exec container3 ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1
    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 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 72:f7:7a:e9:62:56 brd ff:ff:ff:ff:ff:ff
    inet 10.44.0.0/12 scope global ethwe
       valid_lft forever preferred_lft forever

特别注意:这里的IP地址为10.44.0.0/12

查看容器中的路由:

# docker exec container3 ip route list
default via 172.17.0.1 dev eth0
10.32.0.0/12 dev ethwe scope link  src 10.44.0.0
172.17.0.0/16 dev eth0 scope link  src 172.17.0.2
224.0.0.0/4 dev ethwe scope link

说明:上外网还是用docker0网桥,主机通信才会用weave网络。

验证联通性:

# docker exec container3 ping -c 2 container1
PING container1 (10.32.0.1): 56 data bytes
64 bytes from 10.32.0.1: seq=0 ttl=64 time=1.174 ms
64 bytes from 10.32.0.1: seq=1 ttl=64 time=0.372 ms

--- container1 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.372/0.773/1.174 ms

此时网络架构如下图:

AA

注意:container1、container2、container3的地址都是在同一个subnet中的,他们的子网都是12。

特别提示:UDP 6784端口是用来VxLan通信的,所以这里的网卡名称命名为了vxlan-6784


Weave网络与外部网络通信

容器内部通向外网

首先来看一下容器内部的路由表:

# docker exec container1 ip route list
default via 172.17.0.1 dev eth0
10.32.0.0/12 dev ethwe scope link  src 10.32.0.1
172.17.0.0/16 dev eth0 scope link  src 172.17.0.2
224.0.0.0/4 dev ethwe scope link

默认路由指向了docker0网卡,说明上外网还是用的Docker默认网桥的NAT模式。

外部网络通向容器内部

Weave网络内部是一个私有的VxLan网络。默认和外界是隔离的。也就是说默认外部网络不能访问容器内部。

可以使用如下方法,使外部网络能够访问容器内部:

  1. 将宿主机加入Weave网络

  2. 把宿主机当做Weave网络网关

首先将宿主机加入到Weave网络:

# weave expose
10.32.0.3

查看Weave网络中所有的IP地址:

# weave ps
weave:expose f2:db:ef:36:d8:06 10.32.0.3/12
8d6402685ebe 9e:3f:92:f3:5f:50 10.32.0.2/12
05c52f853cee 16:66:86:ea:35:22 10.32.0.1/12

查看网卡weave的IP地址:

# ip address show weave
6: weave: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1376 qdisc noqueue state UP qlen 1000
    link/ether f2:db:ef:36:d8:06 brd ff:ff:ff:ff:ff:ff
    inet 10.32.0.3/12 scope global weave
       valid_lft forever preferred_lft forever

此时,网络结构如下图:   看红线

AA

weave网桥位于宿主机中,所以给weave网卡一个IP地址,就相当于是将宿主机加入了Weave网络中了。现在,宿主机本身已经可以和Weave网络中同一个子网中的所有的容器互相通信了。无论容器是否在该宿主机上。

验证联通性:

# ping 10.32.0.1 -c 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.106 ms

--- 10.32.0.1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.106/0.106/0.106/0.000 ms



# ping 10.32.0.2 -c 1
PING 10.32.0.2 (10.32.0.2) 56(84) bytes of data.
64 bytes from 10.32.0.2: icmp_seq=1 ttl=64 time=0.152 ms

--- 10.32.0.2 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.152/0.152/0.152/0.000 ms



# ping 10.44.0 -c 1
PING 10.44.0 (10.44.0.0) 56(84) bytes of data.
64 bytes from 10.44.0.0: icmp_seq=1 ttl=64 time=1.21 ms

--- 10.44.0 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 1.212/1.212/1.212/0.000 ms

至此,宿主机已经能访问容器内部了。下一步的目的是要让,其他物理机器,没有weave网桥,没加入Weave网络,也能和容器内部通信。

原理就是直接路由:

### 在host3上添加一条路由
# ip route add 10.32.0.0/12 via 192.168.10.61

# ip route list
default via 192.168.10.253 dev eth0
10.32.0.0/12 via 192.168.10.61 dev eth0
169.254.0.0/16 dev eth0  scope link  metric 1002
192.168.10.0/24 dev eth0  proto kernel  scope link  src 192.168.10.69

此时架构图如下:   看蓝线

AA

特别注意:云环境,不一定成功。经测试,阿里云添加静态路由不生效,必须修改ECS所在的VPC,在VPC上添加一条指向ECS的路由,就能实现。


Weave网络的IPAM

官网地址:https://www.weave.works/docs/net/latest/tasks/ipam/ipam/

Weave 网络会自动分配给容器一个唯一的IP地址,当容器被回收的时候,IP地址会被Weave网络释放。除非显示的指定一个IP地址。

Weave 网络还可以指定多个子网地址。

默认情况下,Weave网络配置的IP范围是10.32.0.0/12, 然而可以使用--ipalloc-range选项,覆盖这个默认值:

$ weave launch --ipalloc-range 10.2.0.0/16

注意:每台Weave节点都必须指定同样的地址范围。

IPAM的数据会存储在硬盘,所以当Weave重启的时候IPAM信息不会丢失。

给容器指定一个IP地址

官网地址:https://www.weave.works/docs/net/latest/tasks/ipam/manual-ip-address/

容器启动的时候会从Weave网络自动获取一个地址,可以通过如下命令查看:

$ weave ps container1

当容器退出的时候,Weave网络会检测并释放这个IP地址,以便于可以重复使用。

可以显示的指定IP和网络, 如下命令:

#### 在host1上
# docker run -e WEAVE_CIDR=10.32.10.1/24 -it busybox
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1
    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
25: eth0@if26: <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 scope global eth0
       valid_lft forever preferred_lft forever
27: ethwe@if28: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1376 qdisc noqueue
    link/ether 5e:c6:ad:39:6c:0d brd ff:ff:ff:ff:ff:ff
    inet 10.32.10.1/24 scope global ethwe
       valid_lft forever preferred_lft forever



#### 在host2上
# docker run -e WEAVE_CIDR=10.32.10.2/24 -it busybox
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1
    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 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 aa:d7:a6:77:a7:99 brd ff:ff:ff:ff:ff:ff
    inet 10.32.10.2/24 scope global ethwe
       valid_lft forever preferred_lft forever
/ # ping -c 2 10.32.10.1
PING 10.32.10.1 (10.32.10.1): 56 data bytes
64 bytes from 10.32.10.1: seq=0 ttl=64 time=1.221 ms
64 bytes from 10.32.10.1: seq=1 ttl=64 time=0.384 ms

--- 10.32.10.1 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.384/0.802/1.221 ms
/ #

特别提示:还可以这样指定# docker run -e WEAVE_CIDR=ip:10.32.10.3/24 -it busybox

特别提示:IP地址和子网掩码可以随便设置,只要不冲突就行。

分配多个子网

官网地址:https://www.weave.works/docs/net/latest/tasks/ipam/allocation-multi-ipam/

默认情况下Weave网络会将所有的容器分配到一个子网中。

如果想要隔离网络,可以使容器获取不同的子网范围。

可以在容器创建的时候,指定环境变量WEAVE_CIDR,指定不同的子网范围。

如下:

#### 在host1上
# docker run -e WEAVE_CIDR=net:10.32.20.0/24 -it busybox
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1
    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
29: eth0@if30: <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 scope global eth0
       valid_lft forever preferred_lft forever
31: ethwe@if32: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1376 qdisc noqueue
    link/ether 06:48:61:21:05:68 brd ff:ff:ff:ff:ff:ff
    inet 10.32.20.1/24 scope global ethwe
       valid_lft forever preferred_lft forever
/ #




#### 在host2上
# docker run -e WEAVE_CIDR=net:10.32.20.0/24 -it busybox
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1
    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
26: eth0@if27: <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 scope global eth0
       valid_lft forever preferred_lft forever
28: ethwe@if29: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1376 qdisc noqueue
    link/ether 22:9e:42:df:25:32 brd ff:ff:ff:ff:ff:ff
    inet 10.32.20.192/24 scope global ethwe
       valid_lft forever preferred_lft forever
/ # ping 10.32.20.1
PING 10.32.20.1 (10.32.20.1): 56 data bytes
64 bytes from 10.32.20.1: seq=0 ttl=64 time=1.218 ms
64 bytes from 10.32.20.1: seq=1 ttl=64 time=0.472 ms
^C
--- 10.32.20.1 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.472/0.845/1.218 ms


### 测试隔离
/ # ping 10.32.0.1
PING 10.32.0.1 (10.32.0.1): 56 data bytes
^C
--- 10.32.0.1 ping statistics ---
2 packets transmitted, 0 packets received, 100% packet loss

还可以分配多个不同的子网,并指定一个IP地址

# docker run -e WEAVE_CIDR="net:10.32.30.0/24 net:10.32.40.0/24 ip:10.32.50.1/24" -it busybox
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1
    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
30: eth0@if31: <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 scope global eth0
       valid_lft forever preferred_lft forever
32: ethwe@if33: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1376 qdisc noqueue
    link/ether ee:83:6f:35:76:b3 brd ff:ff:ff:ff:ff:ff
    inet 10.32.30.128/24 scope global ethwe
       valid_lft forever preferred_lft forever
    inet 10.32.40.128/24 scope global ethwe
       valid_lft forever preferred_lft forever
    inet 10.32.50.1/24 scope global ethwe
       valid_lft forever preferred_lft forever
/ #

注意:ethwe网卡会有多个地址,很精妙。

当Weave网络启动的时候指定默认使用的范围:

$ weave launch --ipalloc-range 10.2.0.0/16 --ipalloc-default-subnet 10.2.3.0/24

说明:--ipalloc-range覆盖整个Weave网络范围。--ipalloc-default-subnet是当默认没有明确指定的时候使用的子网范围。当想使用默认子网的时候可以这样net:default

其他

官网链接:https://www.weave.works/docs/net/latest/tasks/ipam/troubleshooting-ipam/


容器管理(隔离,添加删除等)

使用Weave网络隔离应用

官网链接:https://www.weave.works/docs/net/latest/tasks/manage/application-isolation/

要隔离应用,这里使用的是isolation-through-subnets技术。这是最常见的策略。

举例如下:

host1$ weave launch --ipalloc-range 10.2.0.0/16 --ipalloc-default-subnet 10.2.1.0/24
host1$ eval $(weave env)
host2$ weave launch --ipalloc-range 10.2.0.0/16 --ipalloc-default-subnet 10.2.1.0/24 $HOST1
host2$ eval $(weave env)

说明: 这表示,10.2.0.0/16子网代表整个Weave网络,但是如果未指定子网,将会从10.2.1.0/24子网获取地址。

接下来启动两个NC服务:

host1$ docker run --name a1 -ti weaveworks/ubuntu
host2$ docker run --name a2 -ti weaveworks/ubuntu

接下来测试隔离,启动多个容器在不同的子网

host1$ docker run -e WEAVE_CIDR=net:10.2.2.0/24 --name b1 -ti weaveworks/ubuntu
host2$ docker run -e WEAVE_CIDR=net:10.2.2.0/24 --name b2 -ti weaveworks/ubuntu

结论:

  • b1b2容器在一个子网,能通

  • b1a1容器不在一个子网,不能通

  • b1a2在一个子网,能通

动态添加容器到Weave网络

官网地址:https://www.weave.works/docs/net/latest/tasks/manage/dynamically-attach-containers/

比如:

host1$ C=$(docker run -e WEAVE_CIDR=none -dti weaveworks/ubuntu)
host1$ weave attach $C
10.2.1.3

提示:如果已经修改了DOCKER_HOST到Weave Proxy,也就是说执行了# eval $(weave env), 可以使用-e WEAVE_CIDR=none来创建一个没有IP的容器。

host1$ weave detach $C
10.2.1.3

还可以指定网络:

host1$ weave detach net:default $C
10.2.1.3
host1$ weave attach net:10.2.2.0/24 $C
10.2.2.3

将Weave网络和Host网络结合

官网地址:https://www.weave.works/docs/net/latest/tasks/manage/host-network-integration/

host2$ weave expose
10.2.1.132

此时主机就可以和容器通信了:

host2$ ping $(weave dns-lookup a1)

暴露多个子网:

#### 暴漏多个子网
host2$ weave expose net:default net:10.2.2.0/24
10.2.1.132 10.2.2.130


#### 隐藏多个子网
host2$ weave hide   net:default net:10.2.2.0/24
10.2.1.132 10.2.2.130

增加暴露地址到DNS:

host2$ weave expose -h exposed.weave.local
10.2.1.132

服务管理-Exporting, Importing, Binding 和 Routing

官网地址:https://www.weave.works/docs/net/latest/tasks/manage/service-management/


DNS管理

使用WeaveDNS发现容器

WeaveDNS是内嵌在Weave路由中的服务。这个服务会在Weave启动的时候自动启动。

当启动容器的时候,指定主机名就会使用WeaveDNS。

host1$ docker run -dti --name=pingme weaveworks/ubuntu
host1$ docker run -ti  --hostname=ubuntu.weave.local weaveworks/ubuntu

特别提示:当容器名--name和主机名--hostname同时指定的时候,主机名优先。

可以在Weave启动的时候,使用--without-dns进制DNS。

使用WeaveDNS实现负载均衡

官网地址:https://www.weave.works/docs/net/latest/tasks/weavedns/load-balance-fault-weavedns/

可以给不同的容器,指定相同的名字--name,WeaveDNS会负载都不同的容器上。

Domain管理

官网地址:https://www.weave.works/docs/net/latest/tasks/weavedns/managing-domains-weavedns/

管理DNS记录

官网地址:https://www.weave.works/docs/net/latest/tasks/weavedns/managing-entries-weavedns/


监控

官网地址:https://www.weave.works/docs/net/latest/tasks/manage/metrics/


事实上weave命令只是一个Shell脚本:

# ll /usr/local/bin/weave
-rwxr-xr-x 1 root root 52253 Sep 20 14:20 /usr/local/bin/weave


# file /usr/local/bin/weave
/usr/local/bin/weave: POSIX shell script, ASCII text executable

真正的程序是Docker容器中的weaver二进制程序。


本文涉及的命令

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

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

  • weave launch

  • ps -ef|grep $(docker inspect --format="{{.State.Pid}}" weave)

  • weave status

  • docker logs weave

  • eval $(weave env)

  • eval $(weave env --restore)

  • docker run -itd --name=container1 busybox

  • docker exec container1 ip a

  • weave ps container1

  • weave launch 192.168.10.61

  • weave connect 192.168.10.61

  • weave forget $DECOMMISSIONED_HOST

  • weave connect --replace $NEW_HOST1 $NEW_HOST2

  • weave launch --resume

  • weave stop

  • weave rmpeer 192.168.10.69

  • weave reset

  • brctl show

  • ip link show master docker0

  • ip link show master weave

  • ip -d link show vethwe-datapath

  • ip -d link show datapath

  • ip -d link show vxlan-6784

  • weave dns-lookup container2

  • weave ps

  • docker inspect --format="{{.Config.Hostname}}" container1

  • docker inspect --format="{{.Config.Domainname}}" container1

  • docker exec container1 hostname

  • weave report -f "{{.DNS.Entries}}"

  • weave status peers

  • weave expose

  • ip route add 10.32.0.0/12 via 192.168.10.61

  • weave launch --ipalloc-range 10.2.0.0/16

  • docker run -e WEAVE_CIDR=10.32.10.1/24 -it busybox

  • docker run -e WEAVE_CIDR=ip:10.32.10.3/24 -it busybox

  • docker run -e WEAVE_CIDR=net:10.32.20.0/24 -it busybox

  • docker run -e WEAVE_CIDR="net:10.32.30.0/24 net:10.32.40.0/24 ip:10.32.50.1/24" -it busybox

  • weave launch --ipalloc-range 10.2.0.0/16 --ipalloc-default-subnet 10.2.3.0/24

  • docker run -e WEAVE_CIDR=none -dti weaveworks/ubuntu

  • weave attach $C

  • weave detach $C

  • weave attach net:10.2.2.0/24 $C

  • weave expose net:default net:10.2.2.0/24

  • weave hide net:default net:10.2.2.0/24

  • weave expose -h exposed.weave.local




如无特殊说明,文章均为本站原创,转载请注明出处