Docker跨主机网络——manual


在 Macvlan 出现之前,我们只能为一块以太网卡添加多个 IP 地址,却不能添加多个 MAC 地址,因为 MAC 地址正是通过其全球唯一性来标识一块以太网卡的,即便你使用了创建 ethx:y 这样的方式,你会发现所有这些“网卡”的 MAC 地址和 ethx 都是一样的,本质上,它们还是一块网卡,这将限制你做很多二层的操作。有了 Macvlan 技术,你可以这么做了。Macvlan 允许你在主机的一个网络接口上配置多个虚拟的网络接口,这些网络 interface 有自己独立的 MAC 地址,也可以配置上 IP 地址进行通信。Macvlan 下的虚拟机或者容器网络和主机在同一个网段中,共享同一个广播域。Macvlan 和 Bridge 比较相似,但因为它省去了 Bridge 的存在,所以配置和调试起来比较简单,而且效率也相对高。除此之外,Macvlan 自身也完美支持 VLAN。同一 VLAN 间数据传输是通过二层互访,即 MAC 地址实现的,不需要使用路由。不同 VLAN 的用户单播默认不能直接通信,如果想要通信,还需要三层设备做路由,Macvlan 也是如此。用 Macvlan 技术虚拟出来的虚拟网卡,在逻辑上和物理网卡是对等的。物理网卡也就相当于一个交换机,记录着对应的虚拟网卡和 MAC 地址,当物理网卡收到数据包后,会根据目的 MAC 地址判断这个包属于哪一个虚拟网卡。这也就意味着,只要是从 Macvlan 子接口发来的数据包(或者是发往 Macvlan 子接口的数据包),物理网卡只接收数据包,不处理数据包,所以这就引出了一个问题:本机 Macvlan 网卡上面的 IP 无法和物理网卡上面的 IP 通信!关于这个问题的解决方案我们下一节再讨论。

简单来说,Macvlan 虚拟网卡设备是寄生在物理网卡设备上的。发包时调用自己的发包函数,查找到寄生的物理设备,然后通过物理设备发包。收包时,通过注册寄生的物理设备的 rx_handler 回调函数,处理数据包。macvlan 就如它的名字一样,是一种网卡虚开发云主机域名拟化技术,它能够将一个物理网卡虚拟出多个接口,每个接口都可以配置 MAC 地址,同样每个接口也可以配自己的 IP,每个接口就像交换机的端口一样,可以为它划分 VLAN。macvlan 的做法其实就是将这些虚拟出来的接口与 Docker 容器直连来达到通信的目的。一个 macvlan 网络对应一个接口,不同的 macvlan 网络分配不同的子网,因此,相同的 macvlan 之间可以互相通信,不同的 macvlan 网络之间在二层上不能通信,需要借助三层的路由器才能完成通信,如下,显示的就是两个不同的 macvlan 网络之间的通信流程。

我们用一个 Linux 主机,通过配置其路由表和 iptables,将其配成一个路由器(当然是虚拟的),就可以完成不同 macvlan 网络之间的数据交换,当然用物理路由器也是没毛病的。1.可让使用者在同一张实体网卡上设定多个 MAC 地址。
2.承上,带有上述设定的 MAC 地址的网卡称为子接口(sub interface);而实体网卡则称为父接口(parent interface)。
3.parent interface 可以是一个物理接口(eth0),可以是一个 802.1q 的子接口(eth0.10),也可以是 bonding 接口。
4.可在 parent/sub interface 上设定的不只是 MAC 地址,IP 地址同样也可以被设定。
5.sub interface 无法直接与 parent interface 通讯 (带有 sub interface 的 VM 或容器无法与 host 直接通讯)。
承上,若 VM 或容器需要与 host 通讯,那就必须额外建立一个 sub 6.interface 给 host 用。
7.sub interface 通常以 mac0@eth0 的形式来命名以方便区別。
用张图来解释一下设定 Macvlan 后的样子:关闭防火墙和禁用selinux,更改主机名
1) 打开网卡的混杂模式
//需要在docker01和docker02_上都进行操作。
2)在docker01.上创建macvlan网络3)基于创建的macvlan网络运行一个容器[root@docker01 ~]# docker run -itd –name bbox1 –ip 172.22.16.10 –network mac_net1 busybox4)在docker02.上创建macvlan网络(要和docker01的macvlan一模一样)5)在docker02. 上,基于创建的macvlan网络运行一个容器,验证与docker01.上容器的通信。1) docker01和docker02验证内核模块8021q封装
macvlan需要解决的问题:基于真实的ens33网卡,生产新的虚拟网卡。2)docker01基于ens33创建虚拟网卡
修改ens33网卡配置文件
手动添加虚拟网卡配置文件这里注意,IP要和ens33网段做一个区分, 保证网关和网段IP的一致性,设备名称和配置文件的-致性,并且打开VLAN支持模式。创建第二个虚拟网卡配置文件docker01上的操作,启用创建的虚拟网卡:3)docker02基于ens33创建虚拟网卡
修改ens33网卡配置文件
手动添加虚拟网卡配置文件这里注意,IP要和ens33网段做一个区分, 保证网关和网段IP的一致性,设备名称和配置文件的-致性,并且打开VLAN支持模式。创建第二个虚拟网卡配置文件docker02上的操作,启用创建的虚拟网卡:
4)docekr01和docker02基于虚拟网卡,创建macvlan网络5)Docker01部署一个私有仓库
Docker01Docker026)docker01和docker02基于busybox:v1镜像和网卡mac_net10,mac_net20,创建容器。
Docker01***这里只需注意,我们在这里的操作跟在docker01和上面的操作是一模一样的,操作顺序大致为:
验证8021q内核封装
基于ens33网卡创建新的虚拟网卡,ens33.10和ens33.20 (注意和docker01. 上的ens33.10和ens33.20必须是在同一-网段,且IP不能冲突)基于此网络运行容器。(注意和docker01 上的容器,都是基于刚刚创建的macvlan网络,但IP地址不能冲突)7)验证
在docker01.上进入容器bbox10和docker02.上的bbox11进行通信。
在docker01.上进入容器bbox20和docker02.上的bbox21进行通信。
注意: VMware的网络必须设置为Bridge模式。

现在把docker01和docker02的网络模式设置为桥接模式
测试一下相同网卡的主机是否能ping通Macvlan 是将 VM 或容器通过二层连接到物理网络的近乎理想的方案,但它也有一些局限性:1.Linux 主机连接的交换机可能会限制同一个物理端口上的 MAC 地址数量。虽然你可以让网络管理员更改这些策略,但有时这种方法是无法实行的(比如你要去给客户做一个快速的 PoC 演示)。
2.许多 NIC 也会对该物理网卡上的 MAC地址数量有限制。超过这个限制就会影响到系统的性能。
3.IEEE 802.11 不喜欢同一个客户端上有多个 MAC 地址,这意味着你的 Macvlan 子接口在无线网卡或 AP 中都无法通信。可以通过复杂的办法来突破这种限制,但还有一种更简单的办法,那就是使用 Ipvlan,感兴趣可以自己查阅相关资料。macvlan是一种网卡虚拟化技术,能够将一张网卡虚拟出多张网卡。macvlan的特定通信模式,常用模式是bridge。在Docker中,macvlan只支持bridge模式。相同的macvlan可以通信,不同的macvlan二层无法通信,可以通过三层路由完成通信。思考一下:macvlan bridge和bridge的异同点
还有一种类似的技术,多张虚拟网卡共享相同MAC地址,但有独立的IP地址,这是什么技术?

相关推荐: Linux常用命令精讲

Bash是Linux系统中默认使用Shell程序外部命令是需要独立安装外部组建的。命令字 [选项] [参数]显示绝对路径,有跟就是绝对路径没有就是相对于当前所在开发云主机域名位置黑色:数据文件 如 word 记事本等绿色:可执行文件 如 脚本文件红色:压缩包蓝…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

Like (0)
Donate 微信扫一扫 微信扫一扫
Previous 05/13 20:19
Next 05/13 20:19

相关推荐