一、MacVlan的概念
实现码头工人的跨主机网络通信的方案有很多,比如在之前博文中写到的通过部署领事服务实现码头工人容器跨主机通信,而这篇博文将Macvlan写下来
Macvlan工作原理:
<李> Macvlan是Linux内核支持的网络接口。要求的Linux内部版本是v3.9 - 3.19和4.0 +,李> <李>通过为物理网卡创建Macvlan子接口,允许一块物理网卡拥有多个独立的MAC地址和IP地址。虚拟出来的子接口将直接暴露在相邻物理网络中。从外部看来,就像是把网线隔开多股,分别接受了不同的主机上一样,李> <李>物理网卡收到包后,会根据收到包的目的MAC地址判断这个包需要交给其中虚拟网卡。李>
引用>当容器需要直连入物理网络时,可以使用Macvlan.Macvlan本身不创建网络,本质上首先使宿主机物理网卡工作在“混杂模式的,这样物理网卡的MAC地址将会失效,所有二层网络中的流量物理网卡都能收的到。接下来就是在这张物理网卡上创建虚拟网卡,并为虚拟网卡指定MAC地址,实现一卡多,用在物理网络看来,每张虚拟网卡都是一个单独的接口。
使用Macvlan有几点需要注意:
<李>容器直接连接物理网络,由物理网络负责分配IP地址,可能的结果是物理网络IP地址被耗尽,另一个后果是网络性能问题,物理网络中接入的主机变多,广播包占比快速升高而引起的网络性能下降问题;李> <李>宿主机上的某张网上需要工作在“混乱模式”下,李> <李>前面说到,工作在混乱模式下的物理网卡,其MAC地址会失效,所以,此模式中运行的容器并不能与外网进行通信,但是不会影响宿主机与外网通信;李> <李>从长远来看桥网络与叠加网络是更好的选择,原因就是虚拟网络应该与物理网络隔离而不是共享。李>
引用><>强工作示意图如下:强>
二,配置实例
实例1(实现容器基于macvlan的单网段跨主机通信):
实现效果:
<李>两台centos 7.5,分别运行着码头工人服务,李> <李>两台码头工人服务器创建相同的一个MacVlan网络,使码头工人服务器上的容器可以实现跨主机通信。李>
引用><强>开始配置:强>
<强>(1)第一台码头工人服务器配置如下:强><代码> [root@docker ~] # ip链路群ens33 promisc alt="码头工人容器跨主机多网段通信解决方案”>
<强>(1)第二台码头工人服务器配置如下(与第一台码头工人服务器的配置基本相似):强><代码> [root@docker02 ~] # ip链路群ens33 promisc alt="码头工人容器跨主机多网段通信解决方案"><强>使用第二台码头工人服务器上的容器box2对第一台码头工人服务器上的容器box1进行平测试:强>
好的,跨主机的容器通信就通过macvlan实现了。由于使用混杂模式会造成物理网卡的MAC地址失效,所以容器并不能通过此模式进行与外网的通信。
实例2(基于macvlan的跨主机网络多网段的解决方案)
实现的效果如下:
<李>两台centos 7.5,分别运行着码头工人服务,李> <李>每台宿主机创建了两个MacVlan网段供容器使用(172.10.16.0/24和172.20.16.0/24);李> <李>第一台码头工人服务器上运行容器bbox1和bbox2,第二台码头工人服务器运行容器bbox3和bbox4。李> <李>最终实现跨主机的同网段容器互相通信。李>
引用><强>开始配置:强>
<强>(1)第一台码头工人服务器配置如下:强><代码> [root@docker ~] # ip链路群ens33 promisc alt="码头工人容器跨主机多网段通信解决方案"><代码> [root@docker ~] # modprobe 8021 q #若没有加载8021 q模块,则执行此命令 root@docker ~ # cd/etc/sysconfig/network-scripts/[root@docker network-scripts] # vim ifcfg-ens33 #更改物理网卡配置 ............... #省略部分内容 BOOTPROTO=手动#将此配置项该为“手动”,也是手动的意思 ............... #省略部分内容 #更改完成后,保存退出即可 [root@docker network-scripts] # cp - p ifcfg-ens33 ifcfg-ens33.10 #将网卡配置文件复制一份 #“p”表示保留文件原本的属性 [root@docker network-scripts] # vim ifcfg-ens33.10 #更改复制出来的配置文件如下 BOOTPROTO=没有 NAME=ens33.10 #注意更改名称 设备=ens33.10 #注意更改名称 ONBOOT=yes IPADDR=192.168.10.10 #给虚拟网卡设置一个IP 前缀=24 网关=192.168.10.2 VLAN=yes #更改完成后,保存退出即可,注意,以上的IP与容器将要使用的IP并不是同一网段 [root@docker network-scripts] # cp ifcfg-ens33.10 ifcfg-ens33.20 [root@docker network-scripts] # vim ifcfg-ens33.20 #编辑如下 BOOTPROTO=没有 NAME=ens33.20 #注意更改名称 设备=ens33.20 #注意更改名称 ONBOOT=yes IPADDR=192.168.30.10 #注意,此处的IP与ens33.10并不在同一网段 前缀=24 网关=192.168.30.2 VLAN=yes #更改完成后,保存退出即可 [root@docker network-scripts] # ifdown ens33; ifup ens33 #重启网卡,使更改生效 [root@docker network-scripts] # ifup ens33.10 #开启ens33.10 [root@docker network-scripts] # ifup ens33.20 #开启ens33.20 (root@docker ~) #码头工人网络创建网关172.10.16.1 - o - d macvlan——子网172.10.16.0/24父母=ens33.10 mac_net10 #创建一个macvlan网络,给其定义一个网段,网关及绑定到ens33.10 (root@docker ~) #码头工人网络创建网关172.20.16.1 - o - d macvlan——子网172.20.16.0/24父母=ens33.20 mac_net20 #创建一个macvlan网络,给其定义一个网段,网关及绑定到ens33.20 #接下来分别基于刚刚创建的macvlan网络运行一个容器 (root@docker ~) #码头工人运行itd——名字bbox1——网络mac_net10——ip 172.10.16.10 busybox #基于网络mac_net10运行一个容器,并指定其IP (root@docker ~) #码头工人运行itd——名字bbox2——网络mac_net20——ip 172.20.16.20 busybox #基于网络mac_net10运行一个容器,并指定其IP码头工人容器跨主机多网段通信解决方案