关于vlan说明

Macvlan和ipvlan是Linux网络驱动程序,它们将底层或主机接口直接暴露给在主机中运行的VM或容器。

Macvlan允许单个物理接口使用macvlan子接口具有多个mac和ip地址。这与使用vlan在物理接口上创建子接口不同。使用vlan子接口,每个子接口使用vlan属于不同的L2域,所有子接口都具有相同的mac地址。使用macvlan,每个子接口将获得唯一的mac和ip地址,并将直接暴露在底层网络中。Macvlan接口通常用于虚拟化应用程序,每个macvlan接口都连接到Container或VM。每个容器或VM可以直接从公共服务器获取dhcp地址,就像主机一样。这将有助于希望Container成为传统网络的客户使用他们已有的IP寻址方案。Macvlan有4种类型(Private, VEPA, Bridge, Passthru)。常用的类型是Macvlan网桥,它允许单个主机中的端点能够在没有数据包离开主机的情况下相互通信。对于外部连接,使用底层网络。下图显示了两个使用macvlan网桥相互通信以及外部世界的容器。两个容器将使用Macvlan子接口直接暴露在底层网络中。

image

使用mavvlan构建docker网络

Macvlan,MACVLAN或MAC-VLAN允许您在单个物理接口上配置多个第2层(即以太网MAC)地址。 Macvlan允许您配置父物理以太网接口(也称为上层设备)的子接口(也称为从设备),每个接口都有自己唯一的(随机生成的)MAC地址,因此也有自己的IP地址。然后,应用程序、VM和容器可以绑定到特定的子接口,以使用自己的MAC和IP地址直接连接到物理网络。

Mavlan子接口不能直接与父接口通信,即VM不能直接与主机通信。如果需要VM主机通信,则应添加另一个macvlan子接口并将其分配给主机。

Macvlan子接口使用 eth0.20@eth0 表示法来清楚地识别子接口及其父接口。子接口状态绑定到其父级状态。如果eth0关闭,则 eth0.20@eth0 也会关闭。

image

配置macvlan先决条件

  • 至少需要Linux内核版本3.9以上,建议使用4.0或更高版本。

环境准备

主机名IP地址地位软件环境
物理机10.0.0.1物理机windows10
网关10.0.0.2宿主机网关vmvare网关
c110.0.0.3容器01docker
c210.0.0.4容器02docker
node0110.0.0.15宿主机01(vm虚拟机)centos 7.3/docker-ce1806
node0210.0.0.16宿主机02(vm虚拟机)centos 7.3/docker-ce1806

2.3 启动网卡混合模式

两台主机网卡使用桥接模式,网卡混杂模式开启全部允许。

主机上配置的eth0网卡和创建的vlan网卡,均需要开启混杂模式。如果不开启混杂模式会导致macvlan网络无法访问外界,具体在不使用vlan时,表现为无法ping通路由,无法ping通同一网络内其他主机。

sh
1
2
ip link set eth0 promisc on
ip link set eth0  promisc off

开启后查看网卡状态

sh
1
2
3
4
5
6
7
$ ip addr
2: eth0: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:84:f3:29 brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.15/24 brd 10.0.0.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe84:f329/64 scope link 
       valid_lft forever preferred_lft forever

其中BROADCAST,MULTICAST,PROMISC,UP,LOWER_UPPROMISC说明网卡eth0已开启成混杂模式。


注:以上设置临时生效


基于macvlan构建docker跨宿主机通讯

sh
1
2
3
4
5
docker network create \
-d macvlan \
--subnet=10.10.0.0/24 \
--gateway=10.10.0.254 \
-o parent=eth0 mvl1

说明:容器默认使用主机的DNS设置,因此无需配置DNS服务器。


查看创建结果

sh
1
2
3
4
5
$ docker network ls 
NETWORK ID          NAME                DRIVER              SCOPE
3d2449dfe4b1        bridge              bridge              local
7110f9183457        host                host                local
9852fc2a7109        mvl1                macvlan             local

在node01上运行容器

sh
1
docker run -tid --name c1 --net mvl1 --ip 10.10.0.1 busybox

在node02上运行容器

sh
1
docker run -tid --name c2 --net mvl1 --ip 10.10.0.2 busybox

在C1上平C2 检查结果

sh
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
/ # ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:0A:0A:00:01  
          inet addr:10.10.0.1  Bcast:10.10.0.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

/ # ping 10.10.0.2
PING 10.10.0.2 (10.10.0.2): 56 data bytes
64 bytes from 10.10.0.2: seq=0 ttl=64 time=0.397 ms
64 bytes from 10.10.0.2: seq=1 ttl=64 time=0.278 ms

构建macvlan与宿主机同网段docker网络

在两台主机上分别创建docker网络

sh
1
docker network create -d macvlan --subnet=10.0.0.0/24 --gateway=10.0.0.2 -o parent=eth0 mvl1

说明:

  • --gateway为宿主机的网关,如宿主机为物理机则设置路由器的ip。
  • --subnet为宿主机所在网段。

在两台主机上分别创建容器

sh
1
2
docker run -ti --net mvl1 --ip 10.0.0.4 busybox
docker run -ti --net mvl1 --ip 10.0.0.3 busybox

测试网络连通情况

ping网关,结论:通。

sh
1
2
3
/ # ping 10.0.0.2
PING 10.0.0.2 (10.0.0.2): 56 data bytes
64 bytes from 10.0.0.2: seq=0 ttl=128 time=0.330 ms

ping宿主机,结论:不通。

sh
1
2
/ # ping 10.0.0.15
PING 10.0.0.15 (10.0.0.15): 56 data bytes

ping其他宿主机,结论:通。

sh
1
2
3
/ # ping 10.0.0.16
PING 10.0.0.16 (10.0.0.16): 56 data bytes
64 bytes from 10.0.0.16: seq=0 ttl=64 time=0.530 ms

ping其他容器,结论:通。

sh
1
2
3
/ # ping 10.0.0.3
PING 10.0.0.3 (10.0.0.3): 56 data bytes
64 bytes from 10.0.0.3: seq=0 ttl=64 time=0.435 ms

带有VLAN的macvlan

说明

单个Docker主机网络接口只能作为一个macvlan或ipvlan网络的父接口。然而,一个macvlan,一个第2层域和每个物理接口一个子网是现代虚拟化解决方案中相当严重的限制。幸运的是,Docker主机子接口可以作为macvlan网络的父接口。这与VLAN的Linux实现完全一致,其中802.1Q中继连接上的每个VLAN都在物理接口的子接口上。

image

vlan介绍

VLAN(Virtual Local Area Network)又称虚拟局域网,是指在局域网的基础上,采用网络管理软件构建的可跨越不同网段、不同网络的端到端的逻辑网络。

一个VLAN组成一个逻辑子网,即一个逻辑广播域,它可以覆盖多个网络设备,允许处于不同地理位置的网络用户加入到一个逻辑子网中。使用VLAN功能后,能够将网络分割成多个广播域。

Linux支持在物理网卡上创建vlan子接口。每个vlan子接口属于不同的二层域,所有的vlan子接口拥有相同的MAC地址。这点是和Macvlan子接口不同的地方。

vlan范围说明

范围说明
0,4095保留 仅限系统使用 用户不能查看和使用这些VLAN
1 正常Cisco默认VLAN 用户能够使用该VLAN,但不能删除它
2-1001正常 用于以太网的VLAN 用户可以创建、使用和删除这些VLAN
1002-1005正常 用于FDDI和令牌环的Cisco默认VLAN 用户不能删除这些VLAN
1006-1024保留 仅限系统使用 用户不能查看和使用这些VLAN
1025-4094扩展 仅用于以太网VLAN

环境准备

主机名IP地址地位软件环境
c110.10.0.1容器01-02docker
c210.10.0.2容器01-02docker
c310.10.0.3容器02-01docker
c410.10.0.4容器02-02docker
gateway0110.0.0.253容器01网关
gateway0110.0.0.254容器01网关
node0110.0.0.15宿主机01(vm虚拟机)centos 7.3/docker-ce1806
node0210.0.0.16宿主机02(vm虚拟机)centos 7.3/docker-ce1806

创建VLAN

为node01物理网卡创建macvlan子接口

sh
1
2
ip link add link eth0 name eth0.100 type vlan id 100
ip link add link eth0 name eth0.200 type vlan id 200

启用macvlan

sh
1
2
ip link set eth0.100 up
ip link set eth0.200 up

设置macvlan的ip和网关

text
1
2
3
4
5
ip addr add 10.10.0.254/24 dev eth0.100
ip addr add 10.20.0.254/24 dev eth0.200

ip route add default via 10.10.0.254 dev eth0.100
ip route add default via 10.20.0.254 dev eth0.200

参考网址

Exploring Docker Networking – Host, None, and MACVLAN | raid-zero.com | Page 3

Docker Networking: macvlans with VLANs – HiCube