(十八)容器在 Weave 中如何通信和隔離?
上一節我們分析了 Weave 的網路結構,今天討論 Weave 的連通和隔離特性,
首先在host2 執行如下命令:
root@host2:~# weave launch 10.0.0.21
e1057e986c0e485b59bf3089e7abb27ee0e5b18b48d8a1725de64f275f8026de
這里必須指定 host1 的 IP 10.0.0.21,這樣 host1 和 host2 才能加入到同一個 weave 網路,
運行容器 bbox3:
eval $(weave env)
docker run --name bbox3 -itd busybox
(1)weave 網路連通性
bbox3 能夠直接 ping bbox1 和 bbox2
root@host2:~# docker exec bbox3 ping -c 2 bbox1
root@host2:~# docker exec bbox3 ping -c 2 bbox2
? bbox1、bbox2 和 bbox3 的 IP 分別為 10.32.0.1/12、10.32.0.2/12 和 10.320.3/12,注意掩碼為 12 位,實際上這三個 IP 位于同一個 subnet 10.32.0.0/12,通過 host1 和 host2 之間的 VxLAN 隧道,三個容器邏輯上是在同一個 LAN 中的,當然能直接通信了,bbox3 ping bbox1 的資料流向如下圖所示:

① 資料包目的地址為 10.32.0.1,根據 bbox3 的路由表,資料從 ethwe 發送出去,
root@host2:~# docker exec bbox3 ip route
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
root@host2:~#
② host2 weave 查詢到目的地主機,將資料通過 VxLAN 發送給 host1,
③ host1 weave 接受到資料,根據目的 IP 將資料轉發給 bbox1,
(2)weave 網路隔離
? 默認配置下,weave 使用一個大 subnet(例如 10.32.0.0/12),所有主機的容器都從這個地址空間中分配 IP,因為同屬一個 subnet,容器可以直接通信,如果要實作網路隔離,可以通過環境變數 WEAVE_CIDR 為容器分配不同 subnet 的 IP,舉例如下:
root@host2:~# docker run -e WEAVE_CIDR=net:10.32.2.0/24 -it busybox
/ # ip route
default via 172.17.0.1 dev eth0
172.17.0.0/16 dev eth0 scope link src 172.17.0.3
10.32.2.0/24 dev ethwe src 10.32.2.2
/ # ping -c 2 bbox2
ping: bad address 'bbox2'
/ #
? 這里 WEAVE_CIDR=net:10.32.2.0/24 的作用是使容器分配到 IP 10.32.2.2,由于 10.32.0.0/12 與 10.32.2.0/24 位于不同的 subnet,所以無法 ping 到 bbox1,除了 subnet,我們還可以直接為容器分配特定的 IP:
root@host2:~# docker run -e WEAVE_CIDR=ip:10.32.6.6/24 -ti busybox
/ # ip route
default via 172.17.0.1 dev eth0
172.17.0.0/16 dev eth0 scope link src 172.17.0.3
10.32.6.0/24 dev ethwe src 10.32.6.6
/ # ping -c 2 bbox2
/ #
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/236436.html
標籤:其他
