容器网络(八)Weave 如何与外网通信?【61】

(十九)Weave 如何与外网通信?

上一节我们学习了 Weave 网络内部如何通信,今天讨论 Weave 如何与外界通信。

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

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

要将主机加入到 weave,执行 weave expose

root@host1:~# weave expose
10.32.0.3
root@host1:~# 

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

root@host1:~# ip addr show weave
20: weave: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1376 qdisc noqueue state UP group default qlen 1000
    link/ether c6:16:0b:58:37:f6 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::c416:bff:fe58:37f6/64 scope link 
       valid_lft forever preferred_lft forever
root@host1:~# 

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

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

在 host1 中 ping 同一主机的 bbox1,ping host2 上的 bbox3:

root@host1:~# 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.091 ms
64 bytes from 10.32.0.1: icmp_seq=2 ttl=64 time=0.038 ms

--- 10.32.0.1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1027ms
rtt min/avg/max/mdev = 0.038/0.064/0.091/0.027 ms
root@host1:~# 
root@host1:~# ping -c 2 10.32.0.3
PING 10.32.0.3 (10.32.0.3) 56(84) bytes of data.
64 bytes from 10.32.0.3: icmp_seq=1 ttl=64 time=0.067 ms
64 bytes from 10.32.0.3: icmp_seq=2 ttl=64 time=0.034 ms

--- 10.32.0.3 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1011ms
rtt min/avg/max/mdev = 0.034/0.050/0.067/0.017 ms
root@host1:~# 

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

ip route add 10.32.0.0/12 via 10.0.0.21

能够 ping 到 weave 中的容器了。

root@ubuntu-01:~# ip route 
default via 10.0.0.254 dev ens33 proto static 
10.0.0.0/24 dev ens33 proto kernel scope link src 10.0.0.20 
10.32.0.0/12 via 10.0.0.21 dev ens33 
root@ubuntu-01:~# 
root@ubuntu-01:~# 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=1.17 ms
64 bytes from 10.32.0.1: icmp_seq=2 ttl=63 time=0.339 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 @ 2020-12-18 12:11  cuiyongchao007  阅读(215)  评论(0编辑  收藏  举报