交換機的vlan是根據端口來划分的,如果一個PC接入vlan10的端口它就在vlan10中,否則就在其他vlan中。而 MAC VLAN 則可以有效解決這個問題,它根據 終端設備的 MAC 地址來划分 VLAN。這樣,即使用戶改變了接入端口,也仍然處在原 VLAN 中。
macvlan 允許你在主機的一個網絡接口上配置多個虛擬的網絡接口,這些網絡 interface 有自己獨立的 mac 地址,也可以配置上 ip 地址進行通信。macvlan 下的虛擬機或者容器網絡和主機在同一個網段中,共享同一個廣播域。macvlan 和 bridge 比較相似,但因為它省去了 bridge 的存在,所以配置和調試起來比較簡單,而且效率也相對高。除此之外,macvlan 自身也完美支持 VLAN。
同一Vlan間數據傳輸是通過二層互訪,即mac地址實現的,不需要使用路由。不同vlan的用戶單播默認不能直接通信,如果想要通信,還需要三層設備做路由,Macvlan也是如此。用Macvlan技術虛擬出來的虛擬網卡,在邏輯上和物理網卡是對等的。物理網卡也就相當於一個交換機,記錄着對應的虛擬網卡和MAC地址,當物理網卡收到數據包后,會根據目的mac地址判斷這個包屬於哪一個虛擬網卡。
1.1 條件
- Macvlan是Linux內核支持的網絡接口。要求的Linux內部版本是v3.9–3.19和4.0+。
- 大多數雲服務商限制了macvlan。確保自身的網絡設備可以使用
- 只適合在linux服務器上運行。Mac和windows版本的Docker並不支持,在Windows Server中Docker EE也不支持
- 請將網卡名稱 eth0 改成自己的網卡名稱
1.2 工作原理
- 通過為物理網卡創建Macvlan子接口,允許一塊物理網卡擁有多個獨立的MAC地址和IP地址。虛擬出來的子接口將直接暴露在底層物理網絡中。從外界看來,就像是把網線分成多股,分別接到了不同的主機上一樣。
- 物理網卡收到包后,會根據收到包的目的MAC地址判斷這個包需要交給哪個虛擬網卡。
1.3 工作模式
- VEPA(Virtual Ethernet Port Aggregator)mode:需要主接口連接的交換機支持 VEPA/802.1Qbg 特性。所有發送出去的報文都會經過交換機,交換機作為再發送到對應的目標地址(即使目標地址就是主機上的其他 macvlan 接口),也就是 hairpin mode 模式,這個模式用在交互機上需要做過濾、統計等功能的場景。
- Brideg mode: 常用 通過虛擬的交換機將主接口的所有 macvlan 接口連接在一起,這樣的話,不同 macvlan 接口之間能夠直接通信,不需要將報文發送到主機之外。這個模式下,主機外是看不到主機上 macvlan interface 之間通信的報文的
- Private mode: 過濾掉所有來自其他 macvlan 接口的報文,因此不同 macvlan 接口之間無法互相通信
- Passthru mode:
配置Docker Macvlan
2.1 系統環境
節點 | IP | kernel |
macvlan-01 | 192.168.1.221 | 3.10.0-693.el7.x86_64 |
macvlan-02 | 192.168.1.222 | 3.10.0-693.el7.x86_64 |
MacVLAN有兩種橋接模式
- Bridge模式:不創建子接口的情況下直接去橋接物理接口。直接橋接到與宿主級的同網段。
- VLAN Bridge模式:創建子接口去橋接物理接口。可划分多個VLAN。
Macvlan Bridge模式 容器專屬網絡
1、節點1節點2操作:創建macvlan網絡
[root@macvlan-01 ~]# docker network create -d macvlan --subnet=172.100.1.0/24 --gateway=172.100.1.1 -o parent=ens33 macvlan_net 1fba93fda898ed05dc1356f0d469e72d872c33ef5a6ea27fa5e7ed75dfd41b25 docker network create 創建網絡 -d 指定網絡驅動程序為macvlan --subnet 指定一個子網段 --gateway 指定網關 -o parent=ens33 指定宿主接口 macvlan_net 自定義網絡名稱 命令解析 [root@macvlan-01 ~]# docker network ls NETWORK ID NAME DRIVER SCOPE 4a571c4dae3e bridge bridge local 03cf5e32ed93 host host local 1fba93fda898 macvlan_net macvlan local 2f461342dd7b none null local
[root@macvlan-2 ~]# docker network create -d macvlan --subnet=172.100.1.0/24 --gateway=172.100.1.1 -o parent=ens33 macvlan_net cd740b4417662283b8e4c70d96426ab9d995eac111a15df111b5110c84cfc699 [root@macvlan-2 ~]# docker network ls NETWORK ID NAME DRIVER SCOPE a8f47ed48090 bridge bridge local 7c0c22cca61d host host local cd740b441766 macvlan_net macvlan local 904ed969c396 none null local
注:如果需要訪問外網,需要將網絡設置為與宿主級相同網絡下。
注:本地不可訪問,因為橋接的本地網絡。
注:單個網卡只能綁定一次如重復添加會報如下錯誤。
# ens33網卡已被綁定,不多次綁定。
Error response from daemon: network dm-0a48ab454840 is already using parent interface ens33
# 刪除綁定網卡網絡集
docker network rm ID號
測試通信
[root@macvlan-01 ~]# docker run -it --net macvlan_net --ip=172.100.1.10 busybox Unable to find image 'busybox:latest' locally latest: Pulling from library/busybox 322973677ef5: Pull complete Digest: sha256:1828edd60c5efd34b2bf5dd3282ec0cc04d47b2ff9caa0b6d4f07a21d1c08084 Status: Downloaded newer image for busybox:latest / # ifconfig eth0 Link encap:Ethernet HWaddr 02:42:AC:64:01:0A inet addr:172.100.1.10 Bcast:172.100.1.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:65 errors:0 dropped:11 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:4032 (3.9 KiB) TX bytes:0 (0.0 B) lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B) / # ping 172.100.1.11 PING 172.100.1.11 (172.100.1.11): 56 data bytes 64 bytes from 172.100.1.11: seq=0 ttl=64 time=0.542 ms 64 bytes from 172.100.1.11: seq=1 ttl=64 time=0.516 ms 64 bytes from 172.100.1.11: seq=2 ttl=64 time=0.547 ms 64 bytes from 172.100.1.11: seq=3 ttl=64 time=0.951 ms 64 bytes from 172.100.1.11: seq=4 ttl=64 time=1.417 ms ^C --- 172.100.1.11 ping statistics --- 5 packets transmitted, 5 packets received, 0% packet loss round-trip min/avg/max = 0.516/0.794/1.417 ms / #
[root@macvlan-2 ~]# docker run -it --net macvlan_net --ip=172.100.1.11 busybox Unable to find image 'busybox:latest' locally latest: Pulling from library/busybox 322973677ef5: Pull complete Digest: sha256:1828edd60c5efd34b2bf5dd3282ec0cc04d47b2ff9caa0b6d4f07a21d1c08084 Status: Downloaded newer image for busybox:latest / # ifconfig eth0 Link encap:Ethernet HWaddr 02:42:AC:64:01:0B inet addr:172.100.1.11 Bcast:172.100.1.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:10 errors:0 dropped:2 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:624 (624.0 B) TX bytes:0 (0.0 B) lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B) / # ping 172.100.1.10 PING 172.100.1.10 (172.100.1.10): 56 data bytes 64 bytes from 172.100.1.10: seq=0 ttl=64 time=3.031 ms 64 bytes from 172.100.1.10: seq=1 ttl=64 time=1.223 ms 64 bytes from 172.100.1.10: seq=2 ttl=64 time=0.921 ms 64 bytes from 172.100.1.10: seq=3 ttl=64 time=0.683 ms ^C --- 172.100.1.10 ping statistics --- 4 packets transmitted, 4 packets received, 0% packet loss round-trip min/avg/max = 0.683/1.464/3.031 ms / #
Macvlan VLAN Bridge模式 容器專屬網絡
1、節點1節點2操作:創建一個VLAN,VLAN ID 50
節點1 [root@localhost ~]# ip link add link ens33 name ens33.50 type vlan id 50
[root@localhost ~]# systemctl restart docker
節點2 [root@localhost ~]# ip link add link ens33 name ens33.50 type vlan id 50
[root@localhost ~]# systemctl restart docker
2、節點1節點2操作:創建Macvlan網絡
節點1 [root@localhost ~]# docker network create -d macvlan --subnet=172.99.0.0/24 --gateway=172.99.0.1 -o parent=ens33.50 macvlan_net99 5f98cb03e8eea0899ee8e5a04258b5a7a895d0f9455e9bef572a22a215592798 docker network create 創建網絡 -d 指定網絡驅動程序為macvlan --subnet 指定一個子網段 --gateway 指定網關 -o parent=ens33 指定宿主接口 macvlan_net99 自定義網絡名稱 命令解析 [root@localhost ~]# docker network ls NETWORK ID NAME DRIVER SCOPE d44397fdd827 bridge bridge local 03cf5e32ed93 host host local 5f98cb03e8ee macvlan_net99 macvlan local 2f461342dd7b none null local
節點2 [root@localhost ~]# docker network create -d macvlan --subnet=172.99.0.0/24 --gateway=172.99.0.1 -o parent=ens33.50 macvlan_net99 53715dd1fcd5db475770e9f091c757f720c5fa65a837217246afa82fe3e2fa14 [root@localhost ~]# docker network ls NETWORK ID NAME DRIVER SCOPE 01893ed0bb21 bridge bridge local 7c0c22cca61d host host local 53715dd1fcd5 macvlan_net99 macvlan local 904ed969c396 none null local
3、測試互通