安装

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

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

启动 weave

weave launch

生成的三个容器一个是运行服务的容器,其他的两个是数据库服务,和存储服务

查看你weava配置

driver 为 weavemesh,IP 范围 10.32.0.0/12

容器使用weave网络

1.在node2上执行以下命令

eval $(weave env)

其中 $(weave env) 为 export DOCKER_HOST=unix:///var/run/weave/weave.sock

首先执行 eval $(weave env) 很重要,其作用是将后续的 docker 命令发给 weave proxy 处理。如果要恢复之前的环境,可执行 eval $(weave env --restore)

2.运行容器docker run --name bbox1 -itd busybox

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

ethwe。从命名和分配的 IP 10.32.0.2/12 可以猜测 ethwe 与 weave 相关,ethwe@if23与 ethwe 对应的是编号 23 的 interface。从 node2 的 ip link 命令输出中找到该 interface:

vethwe-bridgevethwe-datapath 是 veth pair。

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

datapath 是一个 openvswitch。

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

node2的网络结构如下图

weave 网络包含两个虚拟交换机:Linux bridge weave 和 Open vSwitch datapath,veth pair vethwe-bridgevethwe-datapath 将二者连接在一起。weavedatapath 分工不同,weave 负责将容器接入 weave 网络,datapath 负责在主机间 VxLAN 隧道中并收发数据。

运行一个容器 bbox2。

docker run --name bbox2 -itd busybox

root@node-2:~# docker exec -it bbox2 hostname
bbox2.weave.local
root@node-2:~#

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

当前 host1 网络结构为:

weave 网络连通性

首先在node-1执行如下命令:

weave launch 192.168.180.4

指定 host1 的 IP 192.168.180.4,使node1 和 node2 才能加入到同一个 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 与外网通信

与外界通信的方法

  1. 首先将主机加入到 weave 网络。

    root@node-1:~# weave expose
    10.32.2.129
    root@node-1:~#
  2. 然后把主机当作访问 weave 网络的网关

root@node-1:~# ip addr show weave
10: weave: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1376 qdisc noqueue state UP group default qlen 1000
link/ether fa:f1:c0:c5:c5:7d brd ff:ff:ff:ff:ff:ff
inet 10.32.2.129/12 brd 10.47.255.255 scope global weave
valid_lft forever preferred_lft forever
inet6 fe80::f8f1:c0ff:fec5:c57d/64 scope link
valid_lft forever preferred_lft forever
root@node-1:~#

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

在 host1 中 ping 同一主机的 bbox1,bbox2:

让其他非 weave 主机访问到 bbox1 和 bbox3,只需将网关指向 host1。例如在 192.168.56.101 上添加如下路由:

ip route add 10.32.0.0/12 via 192.168.180.4

能够 ping 到 weave 中的容器了。

IPAM

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

weave launch --ipalloc-range 10.2.0.0/16

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

最新文章

  1. Leetcode Simplify Path
  2. 初学Python之异步多线程:sockserver
  3. opencv统计二值图黑白像素个数
  4. JS中的call()和apply()方法和bind()
  5. HTML5外包团队——技术分享:HTML5判断设备在线离线及监听网络状态变化例子
  6. Linux dd——备份命令
  7. 几个app maker的网站
  8. basename usage in linux
  9. Android 解析JSON数组
  10. (转)sql通配符
  11. 讲解:为什么重写equals时必须重写hashCode方法
  12. LR访问Https接口
  13. OpenCV+Qt+CMake安装+十种踩坑
  14. redis哨兵模式,数据尽量少的丢失
  15. 需要序列化的类中没有写serialVersionUID的解决办法
  16. python性能还是不错的
  17. hdu1542 Atlantis (线段树+扫描线+离散化)
  18. C++面向对象高级开发课程(第三周)
  19. MySQL中LOCATE用法
  20. vijos 1288 箱子游戏 计算几何

热门文章

  1. 浅谈Semaphore类
  2. 设置chrome浏览器背景颜色
  3. PHP多条件分类列表筛选功能开发实例
  4. 基于TCP 协议的RPC
  5. mysql面试题
  6. LeetCode算法题-Binary Tree Tilt(Java实现)
  7. bsp makefile2
  8. mysql 报错ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executin
  9. Centos7.x做开机启动脚本
  10. Cesium如何通过addImageryProvider方法加载SkylineGlobe Server发布的WMS服务