摘要:首先分別在兩臺(tái)主機(jī)上將物理網(wǎng)口創(chuàng)建出兩個(gè)子接口。然后創(chuàng)建兩個(gè)子接口,一個(gè)作為網(wǎng)絡(luò)的網(wǎng)關(guān),一個(gè)作為的網(wǎng)關(guān)。對(duì)子接口配置網(wǎng)關(guān)并啟用這樣之后再從和,就可以通了。
本文首發(fā)于我的公眾號(hào) Linux云計(jì)算網(wǎng)絡(luò)(id: cloud_dev),專注于干貨分享,號(hào)內(nèi)有 10T 書籍和視頻資源,后臺(tái)回復(fù)「1024」即可領(lǐng)取,歡迎大家關(guān)注,二維碼文末可以掃。
上一篇文章我們?cè)敿?xì)介紹了 macvlan 這種技術(shù),macvlan 詳解,由于它高效易配置的特性,被用在了 Docker 的網(wǎng)絡(luò)方案設(shè)計(jì)中,這篇文章就來說說這個(gè)。
01 macvlan 用于 Docker 網(wǎng)絡(luò)在 Docker 中,macvlan 是眾多 Docker 網(wǎng)絡(luò)模型中的一種,并且是一種跨主機(jī)的網(wǎng)絡(luò)模型,作為一種驅(qū)動(dòng)(driver)啟用(-d 參數(shù)指定),Docker macvlan 只支持 bridge 模式。
下面我們做兩個(gè)實(shí)驗(yàn),分別驗(yàn)證相同 macvlan 網(wǎng)絡(luò)和不同 macvlan 網(wǎng)絡(luò)的連通性。
1.1 相同 macvlan 網(wǎng)絡(luò)之間的通信首先準(zhǔn)備兩個(gè)主機(jī)節(jié)點(diǎn)的 Docker 環(huán)境,搭建如下拓?fù)鋱D示:
1 首先使用 docker network create 分別在兩臺(tái)主機(jī)上創(chuàng)建兩個(gè) macvlan 網(wǎng)絡(luò):
root@ubuntu:~# docker network create -d macvlan --subnet=172.16.10.0/24 --gateway=172.16.10.1 -o parent=enp0s8 mac1
這條命令中,
-d 指定 Docker 網(wǎng)絡(luò) driver
--subnet 指定 macvlan 網(wǎng)絡(luò)所在的網(wǎng)絡(luò)
--gateway 指定網(wǎng)關(guān)
-o parent 指定用來分配 macvlan 網(wǎng)絡(luò)的物理網(wǎng)卡
之后可以看到當(dāng)前主機(jī)的網(wǎng)絡(luò)環(huán)境,其中出現(xiàn)了 macvlan 網(wǎng)絡(luò):
root@ubuntu:~# docker network ls NETWORK ID NAME DRIVER SCOPE 128956db798a bridge bridge local 19fb1af129e6 host host local 2509b3717813 mac1 macvlan local d5b0798e725e none null local
2 在 host1 運(yùn)行容器 c1,并指定使用 macvlan 網(wǎng)絡(luò):
root@ubuntu:~# docker run -itd --name c1 --ip=172.16.10.2 --network mac1 busybox
這條命令中,
--ip 指定容器 c1 使用的 IP,這樣做的目的是防止自動(dòng)分配,造成 IP 沖突
--network 指定 macvlan 網(wǎng)絡(luò)
同樣在 host2 中運(yùn)行容器 c2:
root@ubuntu:~# docker run -itd --name c2 --ip=172.16.10.3 --network mac1 busybox
3 在 host1 c1 中 ping host2 c2:
root@ubuntu:~# docker exec c1 ping -c 2 172.16.10.3 PING 172.16.10.3 (172.16.10.3): 56 data bytes 64 bytes from 172.16.10.3: seq=0 ttl=64 time=0.641 ms 64 bytes from 172.16.10.3: seq=1 ttl=64 time=0.393 ms --- 172.16.10.3 ping statistics --- 2 packets transmitted, 2 packets received, 0% packet loss round-trip min/avg/max = 0.393/0.517/0.641 ms
注意:以上的實(shí)驗(yàn)都需要物理網(wǎng)卡 enp0s8 開啟混雜模式,不然會(huì) ping 不通。1.2 不同 macvlan 網(wǎng)絡(luò)之間的通信
接下來,我們來看看不同 macvlan 網(wǎng)絡(luò)之間的連通性,搭建以下的拓?fù)洵h(huán)境:
由于 macvlan 網(wǎng)絡(luò)會(huì)獨(dú)占物理網(wǎng)卡,也就是說一張物理網(wǎng)卡只能創(chuàng)建一個(gè) macvlan 網(wǎng)絡(luò),如果我們想創(chuàng)建多個(gè) macvlan 網(wǎng)絡(luò)就得用多張網(wǎng)卡,但主機(jī)的物理網(wǎng)卡是有限的,怎么辦呢?
好在 macvlan 網(wǎng)絡(luò)也是支持 VLAN 子接口的,所以,我們可以通過 VLAN 技術(shù)將一個(gè)網(wǎng)口劃分出多個(gè)子網(wǎng)口,這樣就可以基于子網(wǎng)口來創(chuàng)建 macvlan 網(wǎng)絡(luò)了,下面是具體的創(chuàng)建過程。
1 首先分別在兩臺(tái)主機(jī)上將物理網(wǎng)口 enp0s8 創(chuàng)建出兩個(gè) VLAN 子接口。
# 使用 vconfig 命令在 eth0 配置兩個(gè) VLAN root@ubuntu:~# vconfig add enp0s8 100 root@ubuntu:~# vconfig add enp0s8 200 # 設(shè)置 VLAN 的 REORDER_HDR 參數(shù),默認(rèn)就行了 root@ubuntu:~# vconfig set_flag enp0s8.100 1 1 root@ubuntu:~# vconfig set_flag enp0s8.200 1 1 # 啟用接口 root@ubuntu:~# ifconfig enp0s8.100 up root@ubuntu:~# ifconfig enp0s8.200 up
2 分別在 host1 和 host2 上基于兩個(gè) VLAN 子接口創(chuàng)建 2 個(gè) macvlan 網(wǎng)絡(luò),mac10 和 mac20。
root@ubuntu:~# docker network create -d macvlan --subnet=172.16.10.0/24 --gateway=172.16.10.1 -o parent=enp0s8.100 mac10 root@ubuntu:~# docker network create -d macvlan --subnet=172.16.20.0/24 --gateway=172.16.20.1 -o parent=enp0s8.200 mac20
3 分別在 host1 和 host2 上運(yùn)行容器,并指定不同的 macvlan 網(wǎng)絡(luò)。
# host1 root@ubuntu:~# docker run -itd --name d1 --ip=172.16.10.10 --network mac10 busybox root@ubuntu:~# docker run -itd --name d2 --ip=172.16.20.10 --network mac20 busybox # host2 root@ubuntu:~# docker run -itd --name d3 --ip=172.16.10.11 --network mac10 busybox root@ubuntu:~# docker run -itd --name d4 --ip=172.16.20.11 --network mac20 busybox
通過驗(yàn)證,d1 和 d3,d2 和 d4 在同一 macvlan 網(wǎng)絡(luò)下,互相可以 ping 通,d1 和 d2,d1 和 d4 在不同的 macvlan 網(wǎng)絡(luò)下,互相 ping 不通。
這個(gè)原因也很明確,不同 macvlan 網(wǎng)絡(luò)處于不同的網(wǎng)絡(luò),而且通過 VLAN 隔離,自然 ping 不了。
但這也只是在二層上通不了,通過三層的路由是可以通的,我們這就來驗(yàn)證下。
重新找一臺(tái)主機(jī) host3,通過打開 ip_forward 把它改造成一臺(tái)路由器(至于為什么可以這樣,可以參考我之前的一篇文章),用來打通兩個(gè) macvlan 網(wǎng)絡(luò),大概的圖示如下所示:
1 首先對(duì) host3 執(zhí)行 sysctl -w net.ipv4.ip_forward=1 打開路由開關(guān)。
2 然后創(chuàng)建兩個(gè) VLAN 子接口,一個(gè)作為 macvlan 網(wǎng)絡(luò) mac10 的網(wǎng)關(guān),一個(gè)作為 mac20 的網(wǎng)關(guān)。
[root@localhost ~]# vconfig add enp0s8 100 [root@localhost ~]# vconfig add enp0s8 200 [root@localhost ~]# vconfig set_flag enp0s8.100 1 1 [root@localhost ~]# vconfig set_flag enp0s8.200 1 1 # 對(duì) vlan 子接口配置網(wǎng)關(guān) IP 并啟用 [root@localhost ~]# ifconfig enp0s8.100 172.16.10.1 netmask 255.255.255.0 up [root@localhost ~]# ifconfig enp0s8.200 172.16.20.1 netmask 255.255.255.0 up
3 這樣之后再從 d1 ping d2 和 d4,就可以 ping 通了。
root@ubuntu:~# docker exec d1 ping -c 2 172.16.20.10 PING 172.16.20.10 (172.16.20.10): 56 data bytes 64 bytes from 172.16.20.10: seq=0 ttl=63 time=0.661 ms 64 bytes from 172.16.20.10: seq=1 ttl=63 time=0.717 ms --- 172.16.20.10 ping statistics --- 2 packets transmitted, 2 packets received, 0% packet loss round-trip min/avg/max = 0.661/0.689/0.717 ms
root@ubuntu:~# docker exec d1 ping -c 2 172.16.20.11 PING 172.16.20.11 (172.16.20.11): 56 data bytes 64 bytes from 172.16.20.11: seq=0 ttl=63 time=0.548 ms 64 bytes from 172.16.20.11: seq=1 ttl=63 time=0.529 ms --- 172.16.20.11 ping statistics --- 2 packets transmitted, 2 packets received, 0% packet loss round-trip min/avg/max = 0.529/0.538/0.548 ms
PS:可能有些系統(tǒng)做了安全限制,可能 ping 不通,這時(shí)候可以添加以下 iptables 規(guī)則,目的是讓系統(tǒng)能夠轉(zhuǎn)發(fā)不通 VLAN 的數(shù)據(jù)包。
iptables -t nat -A POSTROUTING -o enp0s8.100 -j MASQUERADE iptables -t nat -A POSTROUTING -oenp0s8.200 -j MASQUERADE iptables -A FORWARD -i enp0s8.100 -o enp0s8.200 -m state --state RELATED,ESTABLISHED -j ACCEPT iptables -A FORWARD -i enp0s8.200 -o enp0s8.100 -m state --state RELATED,ESTABLISHED -j ACCEPT iptables -A FORWARD -i enp0s8.100 -o enp0s8.200 -j ACCEPT iptables -A FORWARD -i enp0s8.200 -o enp0s8.100 -j ACCEPT
為什么配置 VLAN 子接口,配上 IP 就可以通了,我們可以看下路由表就知道了。
首先看容器 d1 的路由:
root@ubuntu:~# docker exec d1 ip route default via 172.16.10.1 dev eth0 172.16.10.0/24 dev eth0 scope link src 172.16.10.10
我們?cè)趧?chuàng)建容器的時(shí)候指定了網(wǎng)關(guān) 172.16.10.1,所以數(shù)據(jù)包自然會(huì)被路由到 host3 的接口。再來看下 host3 的路由:
[root@localhost ~]# ip route default via 192.168.108.1 dev enp0s3 proto dhcp metric 100 172.16.10.0/24 dev enp0s8.100 proto kernel scope link src 172.16.10.1 172.16.20.0/24 dev enp0s8.200 proto kernel scope link src 172.16.20.1 192.168.56.0/24 dev enp0s8 proto kernel scope link src 192.168.56.122 metric 101 192.168.108.0/24 dev enp0s3 proto kernel scope link src 192.168.108.2 metric 100
可以看到,去往 172.16.10.0/24 網(wǎng)段的數(shù)據(jù)包會(huì)從 enp0s8.100 出去,同理 172.16.20.0/24 網(wǎng)段也是,再加上 host3 的 ip_forward 打開,這就打通了兩個(gè) macvlan 網(wǎng)絡(luò)之間的通路。
02 總結(jié)macvlan 是一種網(wǎng)卡虛擬化技術(shù),能夠?qū)⒁粡埦W(wǎng)卡虛擬出多張網(wǎng)卡。
macvlan 的四種通信模式,常用模式是 bridge。
在 Docker 中,macvlan 只支持 bridge 模式。
相同 macvlan 可以通信,不同 macvlan 二層無法通信,可以借助三層路由完成通信。
思考一下:
macvlan bridge 和 bridge 的異同點(diǎn)
還有一種類似的技術(shù),多張?zhí)摂M網(wǎng)卡共享相同 MAC 地址,但有獨(dú)立的 IP 地址,這是什么技術(shù)?
后臺(tái)回復(fù)“加群”,帶你進(jìn)入高手如云交流群
我的公眾號(hào) 「Linux云計(jì)算網(wǎng)絡(luò)」(id: cloud_dev) ,號(hào)內(nèi)有 10T 書籍和視頻資源,后臺(tái)回復(fù) 「1024」 即可領(lǐng)取,分享的內(nèi)容包括但不限于 Linux、網(wǎng)絡(luò)、云計(jì)算虛擬化、容器Docker、OpenStack、Kubernetes、工具、SDN、OVS、DPDK、Go、Python、C/C++編程技術(shù)等內(nèi)容,歡迎大家關(guān)注。
參考:
https://www.cnblogs.com/Cloud...
https://blog.csdn.net/dog250/...
https://www.hi-linux.com/post...
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/27858.html
摘要:首先分別在兩臺(tái)主機(jī)上將物理網(wǎng)口創(chuàng)建出兩個(gè)子接口。然后創(chuàng)建兩個(gè)子接口,一個(gè)作為網(wǎng)絡(luò)的網(wǎng)關(guān),一個(gè)作為的網(wǎng)關(guān)。對(duì)子接口配置網(wǎng)關(guān)并啟用這樣之后再從和,就可以通了。 本文首發(fā)于我的公眾號(hào) Linux云計(jì)算網(wǎng)絡(luò)(id: cloud_dev),專注于干貨分享,號(hào)內(nèi)有 10T 書籍和視頻資源,后臺(tái)回復(fù)「1024」即可領(lǐng)取,歡迎大家關(guān)注,二維碼文末可以掃。 上一篇文章我們?cè)敿?xì)介紹了 macvlan 這種...
摘要:通過不同的子接口,也能做到流量的隔離。會(huì)根據(jù)收到包的目的地址判斷這個(gè)包需要交給哪個(gè)虛擬網(wǎng)卡,虛擬網(wǎng)卡再把包交給上層的協(xié)議棧處理。總結(jié)是一種網(wǎng)卡虛擬化技術(shù),能夠?qū)⒁粡埦W(wǎng)卡虛擬出多張網(wǎng)卡。 本文首發(fā)于我的公眾號(hào) cloud_dev,專注于干貨分享,號(hào)內(nèi)有大量書籍和視頻資源,后臺(tái)回復(fù)「1024」即可領(lǐng)取,歡迎大家關(guān)注,二維碼文末可以掃。 01 macvlan 簡(jiǎn)介 前面的文章講過了幾種 Li...
閱讀 863·2023-04-26 00:11
閱讀 2660·2021-11-04 16:13
閱讀 2112·2021-09-09 09:33
閱讀 1481·2021-08-20 09:35
閱讀 3830·2021-08-09 13:42
閱讀 3613·2019-08-30 15:55
閱讀 1063·2019-08-30 15:55
閱讀 2224·2019-08-30 13:55