第 8 章 容器网络 - 056 - macvlan 网络结构分析

macvlan 网络结构分析

macvlan 不依赖 Linux bridge,brctl show 可以确认没有创建新的 bridge。

 

查看一下容器 bbox1 的网络设备:

除了 lo,容器只有一个 eth0,请注意 eth0 后面的 @if2,这表明该 interface 有一个对应的 interface,其全局的编号为 2。

 

根据 macvlan 的原理,我们有理由猜测这个 interface 就是主机的 ens192,确认如下:

 

由此可见,容器的 eth0 就是 ens192 通过 macvlan 虚拟出来的 interface。

容器的 interface 直接与主机的网卡连接,这种方案使得容器无需通过 NAT 和端口映射就能与外网直接通信(只要有网关),在网络上与其他独立主机没有区别。

当前网络结构如图所示:

 

用 sub-interface 实现多 macvlan 网络

macvlan 会独占主机的网卡,也就是说一个网卡只能创建一个 macvlan 网络,否则会报错:

 

但主机的网卡数量是有限的,如何支持更多的 macvlan 网络呢?

好在 macvlan 不仅可以连接到 interface(如 ens192),也可以连接到 sub-interface(如 ens192.xxx)。

VLAN 是现代网络常用的网络虚拟化技术,它可以将物理的二层网络划分成多达 4094 个逻辑网络,这些逻辑网络在二层上是隔离的,每个逻辑网络(即 VLAN)由 VLAN ID 区分,VLAN ID 的取值为 1-4094。

Linux 的网卡也能支持 VLAN(apt-get install vlan),同一个 interface 可以收发多个 VLAN 的数据包,不过前提是要创建 VLAN 的 sub-interface。

比如希望 ens192 同时支持 VLAN10 和 VLAN20,则需创建 sub-interface ens192.10 和 ens192.20。

 

在交换机上,如果某个 port 只能收发单个 VLAN 的数据,该 port 为 Access 模式,如果支持多 VLAN,则为 Trunk 模式,所以接下来实验的前提是:

ens192 要接在交换机的 trunk 口上。如果是虚拟机,则不需要额外配置了。

 

在 ens192.10 和 ens192.20 上创建 macvlan 网络。

首先编辑 host1 和 host2 的 /etc/network/interfaces,配置 sub-interfaces:

 

然后启用 sub-interface:

 

创建 macvlan 网络:

host1上:

docker network create -d macvlan --subnet=172.16.10.0/24 --gateway=172.16.10.1 -o parent=ens192.10 mac_net10

docker network create -d macvlan --subnet=172.16.20.0/24 --gateway=172.16.20.1 -o parent=ens192.20 mac_net20

host2上用同样方法创建macvlan网络。

 

在 host1 中运行容器:

 

 

在 host2 中运行容器:

 

 

当前网络结构如图所示:

 

 

-----------------------------------------引用来自------------------------------------------------------

https://mp.weixin.qq.com/s?__biz=MzIwMTM5MjUwMg==&mid=2653587790&idx=1&sn=6c79e09b475f77e931d6a3a7f55f0fc9&chksm=8d308157ba470841985623869ebeadedbfcb0df38db46a78e0709d79b6dbb87125a0c5ed7b64&scene=21#wechat_redirect

posted @ 2019-03-25 11:31  gsophy  阅读(171)  评论(0编辑  收藏  举报