每天5分鐘玩轉 Docker 容器技術(57)
上一節我們建立了兩個 macvlan 並部署了容器,網路結構如下:
本節驗證 macvlan 之間的連通性。
bbox1 能 ping 通 bbox3,bbox2 能 ping 通 bbox4。即:同一 macvlan 網路能通訊。
bbox1 無法 ping 通 bbox2 和 bbox4。即:不同 macvlan 網路之間不能通訊。但更準確的說法應該是:不同 macvlan 網路不能在二層上通訊。在三層上可以通過閘道器將 macvlan 連通,下面我們就啟用閘道器。
我們會將 Host 192.168.56.101 配置成一個虛擬路由器,設定閘道器並轉發 VLAN10 和 VLAN20 的流量。當然也可以使用物理路由器達到同樣的效果。首先確保作業系統 IP Forwarding 已經啟用。
輸出為 1 則表示啟用,如果為 0 可通過如下命令啟用:
sysctl -w net.ipv4.ip_forward=1
在 /etc/network/interfaces 中配置 vlan sub-interface:
auto eth2
iface eth2 inet manual
auto eth2.10
iface eth2.10 inet manual
vlan-raw-device eth2
auto eth2.20
iface eth2.20 inet manual
vlan-raw-device eth2
啟用 sub-interface:
ifup eth2.10
ifup eth2.20
將閘道器 IP 配置到 sub-interface:
ifconfig eth2.10 172.16.10.1 netmask 255.255.255.0 up
ifconfig eth2.20 172.16.20.1 netmask 255.255.255.0 up
新增 iptables 規則,轉發不同 VLAN 的資料包。
iptables -t nat -A POSTROUTING -o eth2.10 -j MASQUERADE
iptables -t nat -A POSTROUTING -o eth2.20 -j MASQUERADE
iptables -A FORWARD -i eth2.10 -o eth2.20 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i eth2.20 -o eth2.10 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i eth2.10 -o eth2.20 -j ACCEPT
iptables -A FORWARD -i eth2.20 -o eth2.10 -j ACCEPT
當前網路拓撲如下圖所示:
現在 host1 上位於 mac_net10 的 bbox1 已經可以與 host2 上位於 mac_net20 的 bbox4 通訊了。
下面我們分析資料包是如何從 bbox1(172.16.10.10)到達 bbox4(172.16.20.11)的。整個過程如下圖所示:
① 因為 bbox1 與 bbox4 在不同的 IP 網段,跟據 bbox1 的路由表:
資料包將傳送到閘道器 172.16.10.1。
② 路由器從 eth2.10 收到資料包,發現目的地址是 172.16.20.11,檢視自己的路由表:
於是將資料包從 eth2.20 轉發出去。
③ 通過 ARP 記錄的資訊,路由器能夠得知 172.16.20.11 在 host2 上,於是將資料包傳送給 host2。
④ host2 根據目的地址和 VLAN 資訊將資料包傳送給 bbox4。
macvlan 網路的連通和隔離完全依賴 VLAN、IP subnet 和路由,docker 本身不做任何限制,使用者可以像管理傳統 VLAN 網路那樣管理 macvlan。
至此,macvlan 就討論完了,恭喜大家又學完一個網路方案,下一節我們開始學習 flannel。