Docker Macvlan 應用部署


交換機的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 條件

  1. Macvlan是Linux內核支持的網絡接口。要求的Linux內部版本是v3.9–3.19和4.0+。
  2. 大多數雲服務商限制了macvlan。確保自身的網絡設備可以使用
  3. 只適合在linux服務器上運行。Mac和windows版本的Docker並不支持,在Windows Server中Docker EE也不支持
  4. 請將網卡名稱 eth0 改成自己的網卡名稱

  1.2 工作原理

  1. 通過為物理網卡創建Macvlan子接口,允許一塊物理網卡擁有多個獨立的MAC地址和IP地址。虛擬出來的子接口將直接暴露在底層物理網絡中。從外界看來,就像是把網線分成多股,分別接到了不同的主機上一樣。
  2. 物理網卡收到包后,會根據收到包的目的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、測試互通


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM