此篇文章介紹 Docker MACVLAN Network 及其運作方式
環境介紹
以下的測試將會在以下環境進行:
-
OS:
Ubuntu 18.04
-
Docker:
18.03.1-ce
網卡配置:
-
eth0:
10.103.19.0/24
-
eth1:
trunk port (10.103.[17-18].0/24)
Prerequisites & Limitations
使用 MACVLAN 功能,在環境上是有所限制的:
-
大多數的 cloud provider 是不支援這個功能的,因為這會需要使用到實體的網路設備
-
需要 Linux kernel 3.9 以上 or 4.0 以上
-
承上,所以僅支援 Linux
-
網卡必須開啟
promiscuous mode
,網卡才可以設定多個 MAC address 上去
簡易檢測
MACVLAN 這個功能需要 Linux Kernel(v3.9–3.19
and 4.0+
) 的支援,為了確保 MACVLAN 可用,必須做以下檢查:
1
|
# 掛載模組
|
上面若是有指令發生錯誤,或是第二個指令沒有回傳任何結果,就表示該 host 上的 Linux kernel 不支援 MACVLAN 的功能。
MACVLAN 簡介
MACVLAN 允許你在主機的一個 NIC 上配置多個虛擬的 NIC,這些 NIC 有自己獨立的 MAC 地址,也可以配置上 IP address 進行通訊。在 MACVLAN 下的 VM 或者 container 的網路和Host 都在同一個網段中,共享同一個 broadcast domain。
Bridge v.s. MACVLAN
Bridge
Bridge 有以下特點:
-
Bridge 是 layer 2 設備,僅用來處理 layer 2 的通訊
-
Bridge 使用 MAC address table 來決定網路封包要怎麼 forward
-
Bridge 會從 host 之間的通訊中的封包中學習 MAC address
-
可以是硬體設備,也可以是純軟體(例如:Linux Bridge)
以下是一個在 Linux Host 上,多個 VM 使用 bridge 相互通訊的狀況:
MACVLAN
MACVLAN 有以下特點:
-
可讓使用者在同一張實體網卡上設定多個 Layer 2 address (一般就是 MAC address)
-
承上,帶有上述設定的 MAC address 的網卡稱為 sub interface;=而實體網卡則稱為 parent interface
-
可在 parent/sub interface 上設定的不只是 MAC address,IP address 同樣也是可以被設定
-
sub interface 無法直接與 parent interface 通訊 (帶有 sub interface 的 VM or container 無法與 host 直接通訊)
-
承上,若 VM or container 需要與 host 通訊,那就必須額外建立一個 sub interface 給 host 用
-
sub interface 通常以
mac0@eth0
的形式來命名以方便區別
以下用張圖來解釋一下設定 MACVLAN 後的樣子:
MACVLAN Modes
MACVLAN 共支援四種模式,分別是:
Private
在 private mode 下,sub interface 之間無法相互通訊
VEPA
在此 VEPA mode 下, sub interface 的通訊必須透過外部的 switch 來完成,而且此 switch 必須支援 IEEE 802.1Qbg
協定。
VM or container 之間的通訊透過外部的 switch,因此廠商可以在外部的 switch 上針對此類的流量進行優化設定,以達到更好的效能。
Bridge
sub interface 之間的通訊在 host 之間完成(類似上面使用 Linux bridge 時 VM or container 之間的通訊方式),且不用 Linux bridge,因此也沒有 MAC learning,也不需要 STP,因此效能比起使用 Linux bridge 好上很多。
Passthru
直接把實體網卡分配給單一 sub interface,因此使用此 sub interface 的 VM or container 可以自行修改網卡的 MAC address or 相關參數。
在 Docker 上使用 MACVLAN
使用 MACVLAN 的 container 會有以下幾個特點:
-
由於 container 的 interface 與 host NIC 連接,因此即使沒有 iptables or port mapping 的相關設定,就可以連外(只要 gateway 設定正確即可)
-
效能比起 bridge 方式相對好
-
若 container 很多,可能造成 IP 耗盡的狀況
-
需要自行管理眾多不同的 MAC address
Bridge Example
建立 container 並檢視結果:
1
|
# 根據 parent NIC 的網路配置,建立一個 MACVLAN network
|
最後從 container 內部來檢視一下網路情況:
1
|
# 檢視 IP,跟上面看到的是相同的
|
802.1Q Trunked Bridge Example
建立 container 並檢視結果:
1
|
# interface 預設是 down,因此要把它啟用
|
最後從 container 內部來檢視一下網路情況:
1
|
# 檢視 container IP 資訊,跟上面的詳細資訊相同
|
結論
Bridge 是 docker 中提供的預設方式,但使用者如果希望 container 的網路可以跟 host 的環境放在一起,選擇 MACVLAN 也是一種不錯的方式。
Docker 提供了非常多的網路設定選項,可以讓使用者根據需求選擇合適的方案;弄清楚每一種不同的 network driver 合適的場景、優缺點以及使用方式,container technology 一定可以在提供開發者以及維運人員更多的彈性。