1霸褒、什么是macvlan 仓犬,解決什么問(wèn)題侠驯。有什么限制條件?
macvlan.png
1脐恩、網(wǎng)絡(luò)結(jié)構(gòu) 所有VM /namespace 復(fù)用 主機(jī)物理網(wǎng)卡 镐侯,不會(huì)涉及數(shù)據(jù)包的重新組裝與nat 轉(zhuǎn)發(fā)。所以比較高效
2、macvlan 設(shè)備實(shí)現(xiàn)了主機(jī)虛擬網(wǎng)絡(luò)苟翻,在eth0 下面的子設(shè)備擁有自己獨(dú)立的ip 與mac 地址韵卤,一臺(tái)物理主機(jī)可以擁有多個(gè)網(wǎng)絡(luò)設(shè)備通過(guò)eth0 直接與外部網(wǎng)關(guān)相連接。
3崇猫、 macvlan 子設(shè)備可以實(shí)現(xiàn)依靠eth0 沈条,組件自己的局域網(wǎng) 802.q。比如 mac0诅炉,mac1 在一個(gè)網(wǎng)端蜡歹,mac2 在一個(gè)網(wǎng)段,來(lái)實(shí)現(xiàn)網(wǎng)絡(luò)隔離涕烧。
4月而、物理主機(jī)網(wǎng)卡(eth0)的子設(shè)備,無(wú)法直接與主機(jī)網(wǎng)絡(luò)通信议纯,但是可以通過(guò)其他手段達(dá)到通信的效果父款,比如創(chuàng)建一個(gè)與主機(jī)物理網(wǎng)卡的ip 相同的一個(gè)子設(shè)備,或者子設(shè)備的數(shù)據(jù)通過(guò)eth0瞻凤,發(fā)給外部交換機(jī)路由器憨攒,由路由器或者交換機(jī)在發(fā)回 主機(jī)。間接實(shí)現(xiàn)子設(shè)備與主機(jī)通信
5阀参、 macvlan 有幾種連接模式
private :所有子設(shè)備不能通信肝集。
VEPA:子設(shè)備虛擬局網(wǎng)內(nèi)通信
Bridge :所有子設(shè)備可以通信,也可以與外部通信(docker 默認(rèn))
Passthru 结笨;只有一個(gè)設(shè)備
6包晰、需要物理網(wǎng)卡啟用混雜模式(這樣才能接受非主機(jī)mac 地址的數(shù)據(jù)包)以及內(nèi)核支持macvlan
7、一個(gè)物理網(wǎng)卡支持的macvlan 子設(shè)備的數(shù)量是有限制的炕吸,無(wú)線網(wǎng)絡(luò)可能不支持macvlan。
- macvlan 優(yōu)化成ipvlan 勉痴,一個(gè)物理網(wǎng)卡所有子設(shè)備的mac 地址與主機(jī)相同赫模,ip 地址與主機(jī)不同
2、macvlan 命令測(cè)試
注macvlan 地址設(shè)置應(yīng)該與主機(jī)的網(wǎng)絡(luò)環(huán)境一致蒸矛。
#!/usr/bin/env bash
#檢查 是否支持macvlan
modprobe macvlan
lsmod | grep macvlan
# 開(kāi)啟網(wǎng)卡混雜模式promiscuity=1 on
ip -d link show eth1 |grep promisc
ip link set [interface] promisc on
ifconfig [interface] promisc
#
sudo ip netns add net1
# 查看eth0 網(wǎng)卡地址
ifconfig eth0
# 創(chuàng)建的格式為 ip link add link <PARENT> <NAME> type macvlan瀑罗,
# 其中 <PARENT> 是 macvlan 接口的父 interface 名稱,<NAME> 是新建的 macvlan 接口的名稱雏掠,這個(gè)名字可以任意取斩祭。
# 使用 ip link 可以看到我們剛創(chuàng)建的 macvlan 接口,除了它自己的名字之外乡话,后面還跟著父接口的名字
# 使用 bridge 模式摧玫,沒(méi)加這個(gè) 默認(rèn)net1,net2 沒(méi)有ping 通
sudo ip link add link eth0 mac1 type macvlan mode bridge
# 查看
ip -d link show mac1
sudo ip link set mac1 netns net1
# 與 eth0 網(wǎng)段相同
sudo ip netns exec net1 ip addr add 10.0.2.21/24 dev mac1
sudo ip netns exec net1 ip link set mac1 up
sudo ip netns exec net1 ip a
# 添加默認(rèn)路由,與主機(jī)eth0 默認(rèn)路由一致
sudo ip netns exec net1 route add default gw 10.0.2.2
sudo ip netns add net2
sudo ip link add link eth0 mac2 type macvlan
sudo ip link set mac2 netns net2
sudo ip netns exec net2 ip addr add 10.0.2.22/24 dev mac2 mode bridge
sudo ip netns exec net2 ip link set mac2 up
sudo ip netns exec net2 route add default gw 10.0.2.2
sudo ip netns exec net1 ping 10.0.2.22
sudo ip netns exec net2 ping 10.0.2.21
# 修改 mode ,net1绑青,net2 沒(méi)有ping 通
sudo ip netns exec net2 ip link set mac2 type macvlan mode private
sudo ip netns exec net1 ping 10.0.2.22
sudo ip netns exec net2 ping 10.0.2.21
3诬像、macvlan 在docker 中應(yīng)用測(cè)試
#1屋群、單機(jī)
docker network create -d macvlan --subnet=10.0.2.0/24 --gateway=10.0.2.2 -o parent=eth0 macvlan0
docker run --rm -dit --network macvlan0 --name c1 hub.c.163.com/library/busybox sh
docker run --rm -dit --network macvlan0 --name c2 hub.c.163.com/library/busybox sh
docker exec -it c1 ping c2
docker exec -it c2 ping c1
# baidu
docker exec -it c2 ping 180.97.33.108
#2、macvlan 跨主機(jī)通信
# 一定需要對(duì)網(wǎng)卡開(kāi)啟混雜模式 坏挠,特別是虛擬機(jī)的設(shè)置芍躏。
sudo ip link set eth1 promisc [on|off]
# host A
docker network create -d macvlan --subnet=192.168.99.0/24 --gateway=192.168.99.1 -o parent=eth1 macvlan1
docker run --rm -dit --network macvlan1 --name c3 --ip 192.168.99.201 hub.c.163.com/library/busybox sh
# host B
docker network create -d macvlan --subnet=192.168.99.0/24 --gateway=192.168.99.1 -o parent=eth1 macvlan1
docker run --rm -dit --network macvlan1 --name c3 --ip 192.168.99.202 hub.c.163.com/library/busybox sh
#Host a
docker exec -it c3 ping 192.168.99.202
# host b
docker exec -it c3 ping 192.168.99.201
4、總結(jié)
1降狠、macvlan 網(wǎng)絡(luò)性能高对竣,但是沒(méi)有overlay 動(dòng)態(tài)全局分配ip 的功能,需要手動(dòng)指定
2榜配、macvlan 網(wǎng)絡(luò)使用有一定的限制條件 柏肪,可以考慮ipvlan 替換
5、參考
network-virtualization-macvlan
networking
docker-multi-host-networking
相關(guān)內(nèi)容
docker 網(wǎng)絡(luò)-準(zhǔn)備
docker 網(wǎng)絡(luò)-host
docker 網(wǎng)絡(luò)-bridge
docker 網(wǎng)絡(luò)-overlay
docker 網(wǎng)絡(luò)-macvlan