云計算
1. macvlan 簡介
在 macvlan 出現(xiàn)之前,我們只能為一塊以太網(wǎng)卡添加多個 ip 地址,卻不能添加多個 mac 地址,因為 mac 地址正是通過其全球唯一性來標(biāo)識一塊以太網(wǎng)卡的,即便你使用了創(chuàng)建 ethx:y 這樣的方式,你會發(fā)現(xiàn)所有這些“網(wǎng)卡”的 mac 地址和 ethx 都是一樣的,本質(zhì)上,它們還是一塊網(wǎng)卡,這將限制你做很多二層的操作。有了 macvlan 技術(shù),你可以這么做了。
macvlan 允許你在主機(jī)的一個網(wǎng)絡(luò)接口上配置多個虛擬的網(wǎng)絡(luò)接口,這些網(wǎng)絡(luò) interface 有自己獨立的 mac 地址,也可以配置上 ip 地址進(jìn)行通信。macvlan 下的虛擬機(jī)或者容器網(wǎng)絡(luò)和主機(jī)在同一個網(wǎng)段中,共享同一個廣播域。macvlan 和 bridge 比較相似,但因為它省去了 bridge 的存在,所以配置和調(diào)試起來比較簡單,而且效率也相對高。除此之外,macvlan 自身也完美支持 vlan。
同一 vlan 間數(shù)據(jù)傳輸是通過二層互訪,即 mac 地址實現(xiàn)的,不需要使用路由。不同 vlan 的用戶單播默認(rèn)不能直接通信,如果想要通信,還需要三層設(shè)備做路由,macvlan 也是如此。用 macvlan 技術(shù)虛擬出來的虛擬網(wǎng)卡,在邏輯上和物理網(wǎng)卡是對等的。物理網(wǎng)卡也就相當(dāng)于一個交換機(jī),記錄著對應(yīng)的虛擬網(wǎng)卡和 mac 地址,當(dāng)物理網(wǎng)卡收到數(shù)據(jù)包后,會根據(jù)目的 mac 地址判斷這個包屬于哪一個虛擬網(wǎng)卡。這也就意味著,只要是從 macvlan 子接口發(fā)來的數(shù)據(jù)包(或者是發(fā)往 macvlan 子接口的數(shù)據(jù)包),物理網(wǎng)卡只接收數(shù)據(jù)包,不處理數(shù)據(jù)包,所以這就引出了一個問題:本機(jī) macvlan 網(wǎng)卡上面的 ip 無法和物理網(wǎng)卡上面的 ip 通信!關(guān)于這個問題的解決方案我們下一節(jié)再討論。
簡單來說,macvlan 虛擬網(wǎng)卡設(shè)備是寄生在物理網(wǎng)卡設(shè)備上的。發(fā)包時調(diào)用自己的發(fā)包函數(shù),查找到寄生的物理設(shè)備,然后通過物理設(shè)備發(fā)包。收包時,通過注冊寄生的物理設(shè)備的 rx_handler 回調(diào)函數(shù),處理數(shù)據(jù)包。
2.簡單介紹manual的流程
macvlan 就如它的名字一樣,是一種網(wǎng)卡虛擬化技術(shù),它能夠?qū)⒁粋€物理網(wǎng)卡虛擬出多個接口,每個接口都可以配置 mac 地址,同樣每個接口也可以配自己的 ip,每個接口就像交換機(jī)的端口一樣,可以為它劃分 vlan。
macvlan 的做法其實就是將這些虛擬出來的接口與 docker 容器直連來達(dá)到通信的目的。一個 macvlan 網(wǎng)絡(luò)對應(yīng)一個接口,不同的 macvlan 網(wǎng)絡(luò)分配不同的子網(wǎng),因此,相同的 macvlan 之間可以互相通信,不同的 macvlan 網(wǎng)絡(luò)之間在二層上不能通信,需要借助三層的路由器才能完成通信,如下,顯示的就是兩個不同的 macvlan 網(wǎng)絡(luò)之間的通信流程。
我們用一個 linux 主機(jī),通過配置其路由表和 iptables,將其配成一個路由器(當(dāng)然是虛擬的),就可以完成不同 macvlan 網(wǎng)絡(luò)之間的數(shù)據(jù)交換,當(dāng)然用物理路由器也是沒毛病的。
3.macvlan 的特點:
1.可讓使用者在同一張實體網(wǎng)卡上設(shè)定多個 mac 地址。
2.承上,帶有上述設(shè)定的 mac 地址的網(wǎng)卡稱為子接口(sub interface);而實體網(wǎng)卡則稱為父接口(parent interface)。
3.parent interface 可以是一個物理接口(eth0),可以是一個 802.1q 的子接口(eth0.10),也可以是 bonding 接口。
4.可在 parent/sub interface 上設(shè)定的不只是 mac 地址,ip 地址同樣也可以被設(shè)定。
5.sub interface 無法直接與 parent interface 通訊 (帶有 sub interface 的 vm 或容器無法與 host 直接通訊)。
承上,若 vm 或容器需要與 host 通訊,那就必須額外建立一個 sub 6.interface 給 host 用。
7.sub interface 通常以 mac0@eth0 的形式來命名以方便區(qū)別。
用張圖來解釋一下設(shè)定 macvlan 后的樣子:
4.實驗環(huán)境
docker01docker02192.168.1.11
192.168.1.13
關(guān)閉防火墻和禁用selinux,更改主機(jī)名
[root@localhost ~]# hostnamectl set-hostname docker01[root@localhost ~]# su -上一次登錄:二 12月 17 08:20:36 cst 2019從 192.168.1.1pts/0 上[root@docker01 ~]# systemctl stop firealldfailed to stop firealld.service: unit firealld.service not loaded.[root@docker01 ~]# setenforce 0setenforce: selinux is disabled[root@docker01 ~]# systemctl daemon-reload [root@docker01 ~]# systemctl restart docker4.1 macvlan的單網(wǎng)絡(luò)通信
1) 打開網(wǎng)卡的混雜模式
//需要在docker01和docker02_上都進(jìn)行操作。
[root@docker01 ~]# ip link show ens33//查看網(wǎng)卡模式
[root@docker01 ~]# ip link set ens33 promisc on//創(chuàng)建網(wǎng)卡模式為混雜模式[root@docker01 ~]# ip link show ens33//查看網(wǎng)卡模式2)在docker01.上創(chuàng)建macvlan網(wǎng)絡(luò)
[root@docker01 ~]# docker network create -d macvlan --subnet 172.22.16.0/24 --gateway 172.22.16.1 -o parent=ens33 mac_net1// 創(chuàng)建一個macvlan模式的網(wǎng)絡(luò)-o parent=綁定在哪張網(wǎng)卡之上[root@docker01 ~]# docker network ls//查看網(wǎng)卡信息
3)基于創(chuàng)建的macvlan網(wǎng)絡(luò)運行一個容器
[root@docker01 ~]# docker run -itd –name bbox1 –ip 172.22.16.10 –network mac_net1 busybox
4)在docker02.上創(chuàng)建macvlan網(wǎng)絡(luò)(要和docker01的macvlan一模一樣)
[root@docker02 ~]# docker network create -d macvlan --subnet 172.22.16.0/24 --gateway 172.22.16.1 -o parent=ens33 mac_net1[root@docker02 ~]# docker network ls
5)在docker02. 上,基于創(chuàng)建的macvlan網(wǎng)絡(luò)運行一個容器,驗證與docker01.上容器的通信。
[root@docker02 ~]# docker run -itd --name bbox2 --network mac_net1 --ip 172.22.16.20 busybox//基于busybox創(chuàng)建一個容器[root@docker02 ~]# docker exec -it bbox2 /bin/sh//進(jìn)入bbox2容器/ # ping 172.22.16.10//ping一下docker01的主機(jī)
4.2macvlan的多網(wǎng)絡(luò)通信
1) docker01和docker02驗證內(nèi)核模塊8021q封裝
macvlan需要解決的問題:基于真實的ens33網(wǎng)卡,生產(chǎn)新的虛擬網(wǎng)卡。
[root@docker01 ~]# modinfo 8021q//驗證內(nèi)核模塊8021q封裝
[root@docker01 ~]# modprobe 8021q//如果內(nèi)核模塊沒有開啟,運行上邊的命令導(dǎo)入一下2)docker01基于ens33創(chuàng)建虛擬網(wǎng)卡
修改ens33網(wǎng)卡配置文件
[root@docker01 ~]# cd /etc/sysconfig/network-scripts/[root@docker01 network-scripts]# vim ifcfg-ens33 手動添加虛擬網(wǎng)卡配置文件
[root@docker01 ~]# cd /etc/sysconfig/network-scripts/[root@docker01 network-scripts]# cp -p ifcfg-ens33 ifcfg-ens33.10//-p保留源文件或目錄的屬性[root@docker01 network-scripts]# vim ifcfg-ens33.10//修改ens33.10網(wǎng)卡配置文件bootproto=nonename=ens33.10device=ens33.10onboot=yesipadd