------------------------------------重要說明------------------------------------
本文內容都是參考Cloudman系列進行學習,是個人學習過程記錄,與原版不同!
原版請參考cloudman《每天5分鐘玩轉Docker容器技術》Cloudman博客如下:
http://blog.51cto.com/cloudman
------------------------------------重要說明------------------------------------
macvlan 本身是 linxu kernel 模塊,其功能是允許在同一個物理網卡上配置多個 MAC 地址,即多個 interface,每個 interface 可以配置自己的 IP。macvlan 本質上是一種網卡虛擬化技術,Docker 用 macvlan 實現容器網絡就不奇怪了。
macvlan 的最大優點是性能極好,相比其他實現,macvlan 不需要創建 Linux bridge,而是直接通過以太 interface 連接到物理網絡。下面我們就來創建一個 macvlan 網絡。
a) 實驗環境描述
l Docker host(Ubuntu02) 192.168.56.130
l Docker host(Ubuntu03) 192.168.56.128
b) 環境準備
使用 docker02 和 docker03 上單獨的網卡 ens33 創建 macvlan。爲保證多個 MAC 地址的網絡包都可以從 ens33 通過,我們需要打開網卡的混雜模式。
ip link set ens33 promisc on
確保 ens33 狀態 UP 並且 promisc 模式已經生效
1) Workstation promisc
如果使用的是workstation for linux做實驗,開啓workstation網卡的混雜模式promisc;
1.將當前的虛擬機都關閉,退出workstation;
2.查看host中的vmnet;
ls -l /dev/vmnet*
3.更改vmnet權限;
chmod a+rw /dev/vmnet*
4.啓動workstation;
2) Virtualbox promisc
c) 創建macvlan
在 docker02 和 docker03 中創建 macvlan 網絡 mac_net1:
這裏使用的網關是ens33網卡的IP地址;
這裏使用的網關是ens33網卡的IP地址;
注意:在 host2 中也要執行相同的命令。
① -d macvlan 指定 driver 爲 macvlan。
② macvlan 網絡是 local 網絡,爲了保證跨主機能夠通信,用戶需要自己管理 IP subnet。
③ 與其他網絡不同,docker 不會爲 macvlan 創建網關,這裏的網關應該是真實存在的,否則容器無法路由。
④ -o parent 指定使用的網絡 interface。
在 docker02 中運行容器 bbox1 並連接到 mac_net1
由於 docker02 中的 mac_net1 與 docker03 中的 mac_net1 本質上是獨立的,爲了避免自動分配造成 IP 衝突,我們最好通過 --ip 指定 bbox1 地址爲 172.16.56.151。
在 docker03 中運行容器 bbox2,指定 IP 172.16.56.152。
d) 連通測試
1) 驗證 bbox1 和 bbox1 的連通性
看到bbox1可以ping同bbox2的IP地址,那測試ping主機名,驗證是否能夠解析:
可見 docker 沒有爲 macvlan 提供 DNS 服務,這點與 overlay 網絡是不同的。
2) 驗證 bbox 和 docker02 docker03主機 的連通性
bbox1在docker02主機(192.168.56.130)
Bbox2在docker03主機(192.168.56.128)
3) 驗證與互聯網的連通性
重新創建macvlan網絡,使用host的網關地址,測試是否可以與互聯網通信
將創建的之前創建的container和network刪除
l 創建網絡
這裏使用的網關是host(docker02、docker03)的網關地址;
這裏使用的網關是host(docker02、docker03)的網關地址;
l 運行容器在macvlan網絡
bbox1的IP:192.168.56.151 bbox2的IP:192.168.56.152
l 測試連通性
容器之間可以ping通;
對方主機可以ping通;
可以ping通www.baidu.com
容器所在host的ip,無法ping通
不具備DNS解析功能,ping hostname無法解析;
e) macvlan網絡結構分析
macvlan 不依賴 Linux bridge,brctl show 可以確認沒有創建新的 bridge。
查看一下容器的網絡設備:
l docker02
l docker03
除了 lo,容器只有一個 eth0,請注意 eth0 後面的 @if4,這表明該 interface 有一個對應的 interface,其全局的編號爲 4。根據 macvlan 的原理,我們有理由猜測這個 interface 就是主機的 ens33,確認如下:
可見,容器的 eth0 就是 ens33 通過 macvlan 虛擬出來的 interface。容器的 interface 直接與主機的網卡連接,這種方案使得容器無需通過 NAT 和端口映射就能與外網直接通信(只要有網關),在網絡上與其他獨立主機沒有區別。當前網絡結構如圖所示(引用cloudman博客中圖):
f) 用 sub-interface 實現多 macvlan 網絡
macvlan 會獨佔主機的網卡,也就是說一個網卡只能創建一個 macvlan 網絡,否則會報錯:
但主機的網卡數量是有限的,如何支持更多的 macvlan 網絡呢?
好在 macvlan 不僅可以連接到 interface(如 ens33),也可以連接到 sub-interface(如 ens33.xxx)。
VLAN 是現代網絡常用的網絡虛擬化技術,它可以將物理的二層網絡劃分成多達 4094 個邏輯網絡,這些邏輯網絡在二層上是隔離的,每個邏輯網絡(即 VLAN)由 VLAN ID 區分,VLAN ID 的取值爲 1-4094。
1) 安裝VLAN
Linux 的網卡也能支持 VLAN(apt-get install vlan),同一個 interface 可以收發多個 VLAN 的數據包,不過前提是要創建 VLAN 的 sub-interface。
2) 配置VLAN接口
比如希望 ens33 同時支持 VLAN10 和 VLAN20,則需創建 sub-interface ens33.10 和 ens33.20。
在交換機上,如果某個 port 只能收發單個 VLAN 的數據,該 port 爲 Access 模式,如果支持多 VLAN,則爲 Trunk 模式,所以接下來實驗的前提是:
ens33 要接在交換機的 trunk 口上。不過我們用的是 workstation/VirtualBox 虛擬機,則不需要額外配置了。
下面演示如何在 ens33.10 和 ens33.20 上創建 macvlan 網絡。
首先編輯 docker02 和 docker03 的 /etc/network/interfaces,配置 sub-interface
然後啓用 sub-interface
systemctl restart networking.service
配置docker02主機vlan10接口(ens33.10)的macvlan網絡
配置docker02主機vlan20接口(ens33.20)的macvlan網絡
配置docker03主機vlan10接口(ens33.10)的macvlan網絡
配置docker03主機vlan20接口(ens33.20)的macvlan網絡
配置docker02主機vlan10的容器(172.16.10.11)
配置docker02主機vlan20的容器(172.16.20.11)
配置docker03主機vlan10的容器(172.16.10.12)
配置docker03主機vlan20的容器(172.16.20.12)
3) sub-interface連通性測試
bbox1 能 ping 通 bbox2,bbox3 能 ping 通 bbox4。即:同一 macvlan 網絡能通信。
bbox1 無法 ping 通 bbox3 和 bbox4。即:不同 macvlan 網絡之間不能通信。但更準確的說法應該是:不同 macvlan 網絡不能 在二層上 通信。在三層上可以通過網關將 macvlan 連通,下面我們就啓用網關。
將 Host 192.168.56.130 配置成一個虛擬路由器,設置網關並轉發 VLAN10 和 VLAN20 的流量。當然也可以使用物理路由器達到同樣的效果。首先確保操作系統 IP Forwarding 已經啓用。
輸出爲 1 則表示啓用,如果爲 0 可通過如下命令啓用:
sysctl -w net.ipv4.ip_forward=1
------------------------------------重要說明------------------------------------
本文內容都是參考Cloudman系列進行學習,是個人學習過程記錄,與原版不同!
原版請參考cloudman《每天5分鐘玩轉Docker容器技術》Cloudman博客如下:
http://blog.51cto.com/cloudman
------------------------------------重要說明------------------------------------
書籍:
1.《每天5分鐘玩轉Kubernetes》
https://item.jd.com/26225745440.html
2.《每天5分鐘玩轉Docker容器技術》
https://item.jd.com/16936307278.html
3.《每天5分鐘玩轉OpenStack》
https://item.jd.com/12086376.html