(十九)Weave 如何與外網通信?
上一節我們學習了 Weave 網路內部如何通信,今天討論 Weave 如何與外界通信,
weave 是一個私有的 VxLAN 網路,默認與外部網路隔離,外部網路如何才能訪問到 weave 中的容器呢?答案是:
- 首先將主機加入到 weave 網路,
- 然后把主機當作訪問 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,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/237000.html
標籤:其他
