weave网络

作者: 逗比的一生 | 来源:发表于2019-12-04 10:40 被阅读0次

    安装部署 weave

    weave 安装非常简单,在 host1 和 host2 上执行如下命令:

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

    启动 weave

    在 host1 中执行 weave launch 命令,启动 weave 相关服务。weave 的所有组件都是以容器方式运行的,weave 会从 docker hub 下载最新的 image 并启动容器。


    weave 运行了三个容器:
    weave 是主程序,负责建立 weave 网络,收发数据 ,提供 DNS 服务等。
    weaveplugin 是 libnetwork CNM driver,实现 Docker 网络。
    weaveproxy 提供 Docker 命令的代理服务,当用户运行 Docker CLI 创建容器时,它会自动将容器添加到 weave 网络。
    weave 会创建一个新的 Docker 网络 weave:

    driver 为 weavemesh,IP 范围 10.32.0.0/12。
    docker network inspect weave
    ......
               "Config": [
                   {
                       "Subnet": "10.32.0.0/12"
                   }
               ]
    ......
    

    Weave 网络结构分析

    在 host1 中运行容器 bbox1:

    eval $(weave env)
    docker run --name bbox1 -itd busybox
    

    首先执行 eval $(weave env)很重要,其作用是将后续的 docker 命令发给 weave proxy 处理。如果要恢复之前的环境,可执行eval $(weave env --restore)
    查看一下当前容器 bbox1 的网络配置:


    bbox1 有两个网络接口 eth0 和 ethwe,其中 eth0 连接的是默认 bridge 网络,即网桥 docker0。

    现在我们重点分析 ethwe。从命名和分配的 IP 10.32.0.1/12 可以猜测 ethwe 与 weave 相关,ethwe@if77 告诉我们与 ethwe 对应的是编号 77 的 interface。从 host1 的 ip link 命令输出中找到该 interface:



    vethwepl22809 与 ethwe 是一对 veth pair,而且 vethwepl22809 挂在 host1 的 Linux bridge weave 上。


    除了 vethwepl22809,weave 上还挂了一个 vethwe-bridge,这是什么?让我们更深入的分析一下,查看 ip -d link 输出:



    这里出现了多个新 interface:
    ① vethwe-bridge 与 vethwe-datapath 是 veth pair。
    ② vethwe-datapath 的父设备(master)是 datapath。
    ③ datapath 是一个 openvswitch。
    ④ vxlan-6784 是 vxlan interface,其 master 也是 datapath,weave 主机间是通过 VxLAN 通信的。
    host1 的网络结构如下图所示:


    weave 网络包含两个虚拟交换机:Linux bridge weaveOpen vSwitch datapathveth pair vethwe-bridgevethwe-datapath 将二者连接在一起。

    weavedatapath 分工不同,weave 负责将容器接入 weave 网络,datapath 负责在主机间VxLAN隧道中并收发数据。
    再运行一个容器 bbox2。
    docker run --name bbox2 -itd busybox
    weave DNS 为容器创建了默认域名 weave.local,bbox1 能够直接通过 hostname 与 bbox2 通信。


    当前 host1 网络结构为:

    Weave 的连通和隔离特性

    首先在host2 执行如下命令:
    weave launch 192.168.56.104
    这里必须指定 host1 的 IP 192.168.56.104,这样 host1 和 host2 才能加入到同一个 weave 网络。

    运行容器 bbox3:
    eval $(weave env)
    docker run --name bbox3 -itd busybox
    bbox3 能够直接 ping bbox1 和 bbox2



    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。通过 host1 和 host2 之间的 VxLAN 隧道,三个容器逻辑上是在同一个 LAN 中的,当然能直接通信了。bbox3 ping bbox1 的数据流向如下图所示:

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

    ② host2 weave 查询到目的地主机,将数据通过 VxLAN 发送给 host1。
    ③ host1 weave 接受到数据,根据目的 IP 将数据转发给 bbox1。

    weave 网络隔离

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


    这里 WEAVE_CIDR=net:10.32.2.0/24 的作用是使容器分配到 IP 10.32.2.2。由于 10.32.0.0/1210.32.2.0/24位于不同的 subnet,所以无法 ping 到 bbox1。除了 subnet,我们还可以直接为容器分配特定的 IP:

    Weave 如何与外界通信

    weave 是一个私有的 VxLAN 网络,默认与外部网络隔离。外部网络如何才能访问到 weave 中的容器呢?
    答案是:

    1. 首先将主机加入到 weave 网络。
    2. 然后把主机当作访问 weave 网络的网关。
      要将主机加入到 weave,执行 weave expose

      这个 IP 10.32.0.3 会被配置到 host1 的 weave 网桥上。

      这是个精妙的设计,让我们再看看下面 host1 的网络结构:

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

      ping host2 上的 bbox3:

      接下来要让其他非 weave 主机访问到 bbox1 和 bbox3,只需将网关指向 host1。例如在 192.168.56.101 上添加如下路由:
      ip route add 10.32.0.0/12 via 192.168.56.104
      能够 ping 到 weave 中的容器了。

      通过上面的配置我们实现了外网到 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。

    相关文章

      网友评论

        本文标题:weave网络

        本文链接:https://www.haomeiwen.com/subject/wuwcgctx.html