20、《每天5分鐘玩轉Docker容器技術》學習--macvlan Network

------------------------------------重要說明------------------------------------

本文內容都是參考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) 實驗環境描述

Docker host(Ubuntu02) 192.168.56.130

圖片.png

Docker host(Ubuntu03) 192.168.56.128

圖片.png 

b) 環境準備

使用 docker02 和 docker03 上單獨的網卡 ens33 創建 macvlan。爲保證多個 MAC 地址的網絡包都可以從 ens33 通過,我們需要打開網卡的混雜模式。

ip link set ens33 promisc on

確保 ens33 狀態 UP 並且 promisc 模式已經生效

圖片.png

圖片.png

圖片.png 

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

圖片.png

c) 創建macvlan

在 docker02 和 docker03 中創建 macvlan 網絡 mac_net1:

圖片.png

這裏使用的網關是ens33網卡的IP地址;

圖片.png 

這裏使用的網關是ens33網卡的IP地址;

注意:在 host2 中也要執行相同的命令。

① -d macvlan 指定 driver 爲 macvlan。

② macvlan 網絡是 local 網絡,爲了保證跨主機能夠通信,用戶需要自己管理 IP subnet。

③ 與其他網絡不同,docker 不會爲 macvlan 創建網關,這裏的網關應該是真實存在的,否則容器無法路由。

④ -o parent 指定使用的網絡 interface。

在 docker02 中運行容器 bbox1 並連接到 mac_net1

圖片.png 

由於 docker02 中的 mac_net1 與 docker03 中的 mac_net1 本質上是獨立的,爲了避免自動分配造成 IP 衝突,我們最好通過 --ip 指定 bbox1 地址爲 172.16.56.151

在 docker03 中運行容器 bbox2,指定 IP 172.16.56.152

圖片.png 

d) 連通測試

1) 驗證 bbox1 和 bbox1 的連通性

圖片.png 

看到bbox1可以ping同bbox2的IP地址,那測試ping主機名,驗證是否能夠解析:

圖片.png

可見 docker 沒有爲 macvlan 提供 DNS 服務,這點與 overlay 網絡是不同的。

2) 驗證 bbox 和 docker02 docker03主機 的連通性

bbox1在docker02主機(192.168.56.130)

圖片.png

圖片.png
 

Bbox2在docker03主機(192.168.56.128)

圖片.png 

圖片.png 

3) 驗證與互聯網的連通性

圖片.png 

圖片.png 

重新創建macvlan網絡,使用host的網關地址,測試是否可以與互聯網通信

將創建的之前創建的container和network刪除

創建網絡

圖片.png 

這裏使用的網關是host(docker02、docker03)的網關地址;

圖片.png

這裏使用的網關是host(docker02、docker03)的網關地址;

運行容器在macvlan網絡

圖片.png 

圖片.png 

bbox1的IP:192.168.56.151  bbox2的IP:192.168.56.152

測試連通性

圖片.png 

圖片.png 

容器之間可以ping通;

圖片.png 

圖片.png 

對方主機可以ping通;

圖片.png
 

圖片.png 

可以ping通www.baidu.com

圖片.png 

圖片.png 

容器所在host的ip,無法ping通

圖片.png
 

圖片.png
 

不具備DNS解析功能,ping hostname無法解析;

e) macvlan網絡結構分析

macvlan 不依賴 Linux bridge,brctl show 可以確認沒有創建新的 bridge。

圖片.png

圖片.png
 

查看一下容器的網絡設備:

docker02

圖片.png 

docker03

圖片.png
 

除了 lo,容器只有一個 eth0,請注意 eth0 後面的 @if4,這表明該 interface 有一個對應的 interface,其全局的編號爲 4。根據 macvlan 的原理,我們有理由猜測這個 interface 就是主機的 ens33,確認如下:

圖片.png 

 

可見,容器的 eth0 就是 ens33 通過 macvlan 虛擬出來的 interface。容器的 interface 直接與主機的網卡連接,這種方案使得容器無需通過 NAT 和端口映射就能與外網直接通信(只要有網關),在網絡上與其他獨立主機沒有區別。當前網絡結構如圖所示(引用cloudman博客中圖)

圖片.png

f) 用 sub-interface 實現多 macvlan 網絡

macvlan 會獨佔主機的網卡,也就是說一個網卡只能創建一個 macvlan 網絡,否則會報錯:

圖片.png

但主機的網卡數量是有限的,如何支持更多的 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。

圖片.png

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

圖片.png

然後啓用 sub-interface

systemctl restart networking.service

圖片.png
 

配置docker02主機vlan10接口(ens33.10)的macvlan網絡

圖片.png
 

配置docker02主機vlan20接口(ens33.20)的macvlan網絡

圖片.png
 

配置docker03主機vlan10接口(ens33.10)的macvlan網絡

圖片.png
 

配置docker03主機vlan20接口(ens33.20)的macvlan網絡

圖片.png
 

配置docker02主機vlan10的容器(172.16.10.11)

圖片.png
 

配置docker02主機vlan20的容器(172.16.20.11)

圖片.png
 

配置docker03主機vlan10的容器(172.16.10.12)

圖片.png 

配置docker03主機vlan20的容器(172.16.20.12)

圖片.png 

圖片.png 

3) sub-interface連通性測試

圖片.png
 

圖片.png 

bbox1 能 ping 通 bbox2,bbox3 能 ping 通 bbox4。即:同一 macvlan 網絡能通信。

bbox1 無法 ping 通 bbox3 和 bbox4。即:不同 macvlan 網絡之間不能通信。但更準確的說法應該是:不同 macvlan 網絡不能 在二層上 通信。在三層上可以通過網關將 macvlan 連通,下面我們就啓用網關。

將 Host 192.168.56.130 配置成一個虛擬路由器,設置網關並轉發 VLAN10 和 VLAN20 的流量。當然也可以使用物理路由器達到同樣的效果。首先確保操作系統 IP Forwarding 已經啓用。

圖片.png

輸出爲 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




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章