当前位置 主页 > 网站技术 > 代码类 >

    docker部署Macvlan实现跨主机网络通信的实现

    栏目:代码类 时间:2019-10-31 15:10

    基本概念:

    Macvlan工作原理:

    Macvlan是Linux内核支持的网络接口。要求的Linux内部版本是v3.9–3.19和4.0+;通过为物理网卡创建Macvlan子接口,允许一块物理网卡拥有多个独立的MAC地址和IP地址。虚拟出来的子接口将直接暴露在相邻物理网络中。从外部看来,就像是把网线隔开多股,分别接受了不同的主机上一样;物理网卡收到包后,会根据收到包的目的MAC地址判断这个包需要交给其中虚拟网卡。

    当容器需要直连入物理网络时,可以使用Macvlan。Macvlan本身不创建网络,本质上首先使宿主机物理网卡工作在‘混杂模式',这样物理网卡的MAC地址将会失效,所有二层网络中的流量物理网卡都能收到。接下来就是在这张物理网卡上创建虚拟网卡,并为虚拟网卡指定MAC地址,实现一卡多用,在物理网络看来,每张虚拟网卡都是一个单独的接口。

    使用Macvlan需要注意以下几点:
    容器直接连接物理网络,由物理网络负责分配IP地址,可能的结果是物理网络IP地址被耗尽,另一个后果是网络性能问题,物理网络中接入的主机变多,广播包占比快速升高而引起的网络性能下降问题; 宿主机上的某张网上需要工作在‘混乱模式'下; 前面说到,工作在混乱模式下的物理网卡,其MAC地址会失效,所以,此模式中运行的容器并不能与外网进行通信,但是不会影响宿主机与外网通信; 从长远来看bridge网络与overlay网络是更好的选择,原因就是虚拟网络应该与物理网络隔离而不是共享。

    项目环境:

    两台docker主机:(centos7)
    docker01: 172.16.1.30
    docker02: 172.16.1.31

    项目操作:

    实例一:macvlan跨主机单网络解决方案:

    docker01:

    (1)开启ens33网卡的混杂模式,开启网卡的多个虚拟interface(接口)

    [root@sqm-docker01 ~]# ip link set ens33 promisc on
    ##查看网卡的状态:
    [root@sqm-docker01 ~]# ip link show ens33

    (2)创建macvlan网络:

    [root@sqm-docker01 ~]# docker network create -d macvlan --subnet 172.16.100.0/24 --gateway 172.16.100.1 -o parent=ens33 mac_net1

    参数解释:
    -o: 绑定在哪张网卡之上(基于ens33网卡)

    (3)基于刚创建的网络运行一个容器:

    [root@sqm-docker01 ~]# docker run -itd --name box1 --ip 172.16.100.10 --network mac_net1 busybox
    

    docker02:(与docker01相同操作)

    开启混杂模式
    [root@sqm-docker02 ~]# ip link set ens33 promisc on
    [root@sqm-docker02 ~]# ip link show ens33

    //创建macvlan网络
    [root@sqm-docker02 ~]# docker network create -d macvlan --subnet 172.16.100.0/24 --gateway 172.16.100.1 -o parent=ens33 mac_net1
    //运行一个容器:
    [root@sqm-docker02 ~]# docker run -itd --name box2 --network mac_net1 --ip 172.16.100.20 busybox

    (4)测试两个主机间的两个容器相互通信: