首页 > 代码库 > openstack之Neutron网络模式vlan,gre,vxlan详解

openstack之Neutron网络模式vlan,gre,vxlan详解

第一:neutron openvswitch + vlan虚拟网络

一:基础知识

  vlan基础知识

  1.vlan介绍

    1.1:首先说下lan,LAN 表示 Local Area Network,本地局域网,通常使用 Hub 和 Switch 来连接LAN 中的计算机。(一个 LAN 表示一个广播域)

      vlan:(Virutal LAN) 将同一个LAN上的用户在逻辑上分成多个虚拟局域网,换句话说,一个带有 VLAN 功能的switch 能够同时处于多个 LAN 中,每个vlan中的主机连接交换机的端口是access口,从而保证了交换机只在同一个vlan中转发包

    1.2:IEEE 802.1Q 标准定义了 VLAN Header 的格式。它在普通以太网帧结构的 SA (src addr)之后加入了 4bytes 的 VLAN Tag/Header 数据,其中包括 12-bits 的 VLAN ID。VLAN ID 最大值为4096,但是有效值范围是 1 - 4094。  

     vlan数据帧格式介绍:

          技术分享

    

      TPID(Tag Protocol Identifier,标签协议标识)值规定为0x8100。设备缺省采用协议规定的TPID值,交换机通过TPID来确定数据帧是否附加基于IEEE802.1Q的VLAN信息。

          TCI(Tag Control Information,标签控制信息)字段分为Pri、CFI和VLAN三部分。Pri表示报文优先级(也称1p优先级、COS或1q优先级),CFI(Canonical Format Indicator)标识MAC地址在不同传输介质中是否以标准格式进行封装,通常为0(标准格式)。Vlan ID标识该报文所属的VLAN编号,取值范围为 0~4095,一般0和4095保留(中兴设备Vid=0表示priority-tagged帧)。

    1.3  带vlan的交换机端口划分:

      Access port:这些端口被打上了 VLAN Tag。离开交换机的 Access port 进入计算机的以太帧中没有 VLAN Tag,这意味着连接到 access ports 的机器不会觉察到 VLAN 的存在。离开计算机进入这些端口的数据帧被打上了 VLAN Tag。

      Trunk port: 两台或者多台交换机通过一个根线连接,线的两头都是trunk口,可以转发多个vlan信息。

     2.vlan类型

   基于port的vlan(数据帧中不包含vlan tag,vlan信息从交换机的端口pvid上得知,交换机转发包也基于此)

     基于tagged vlan(数据帧中包含vlan tag,vlan信息从数据帧内包含的vlan信息,交换机需要有对该数据帧拆包/封包的能力,即连接到这种端口的网络设备必须是8021.Q)

  3.vlan的不足

   VLAN 使用 12-bit 的 VLAN ID,所以 VLAN 的第一个不足之处就是它最多只支持 4096 个 VLAN 网络(当然这还要除去几个预留的),对于大型数据中心的来说,这个数量是远远不够的。

   VLAN 是基于 L2 的,所以很难跨越 L2 的边界,在很大程度上限制了网络的灵活性。

   VLAN 操作需手工介入较多,这对于管理成千上万台机器的管理员来说是难以接受的。

   以上上中在小公司,用在小规模的云平台服务完全是可以的,但是每一个小公司都有一颗做大的心嘛,所以还是不提倡的

 交换机基础知识

  1.交换机工作原理:

    交换机在接收到数据帧以后,首先、会记录数据帧中的源MAC地址和对应的接口到MAC表中,接着、会检查自己的MAC表中是否有数据帧中目标MAC地址的信息,如果有则会根据MAC表中记录的对应接口将数据帧发送出去(也就是单播),如果没有,则会将该数据帧从非接收接口发送出去(也就是广播)。

  1.mac地址:

    mac地址表:在交换机中有一张记录着局域网主机MAC地址与交换机接口的对应关系的表,交换机就是根据这张表负责将数据帧传输到指定的主机上的。

    mac地址学习:

     技术分享 

  1)主机A将一个源MAC地址为自己,目标MAC地址主机C的数据帧发送给交换机

  2)交换机1收到此数据帧后,会学习源MAC地址,并检查MAC地址表,发现没有目标MAC地址的记录,则会将数据帧广播出去,主机B和交换机2都会收到此数据帧。

  3)交换机2收到此数据帧后也会将数据帧中的源MAC地址和对应的接口记录到MAC地址表中,并检查自己的MAC地址表,发现没有目标MAC地址的记录,则会广播此数据帧。

  4)主机C收到数据帧后,会响应这个数据帧,并回复一个源MAC地址为自己的数据帧,这时交换机1和交换机2都会将主机C的MAC地址记录到自己的MAC地址表中,并且以单播的形式将此数据帧发送给主机A。

  5)这时,主机A和主机C通信就是一单播的形式传输数据帧了,主机B和主机C通信如上述过程一样,因此交换机2的MAC地址表中记录着主机A和主机B的MAC地址都对应接口f 0/1。

  总结:交换机具有动态学习源MAC地址的功能,并且交换机的一个接口可以对应多个MAC地址,但是一个MAC地址只能对应一个接口    

  2.arp原理:

    技术分享  

  主机A与主机B在同一网段

  1)如果主机A想发送数据给主机B,主机A首先会检查自己的ARP缓存表,查看是否有主机B的IP地址和MAC地址的对应关系,如果有,则会将主机B的MAC地址作为源MAC地址封装到数据帧中。如果没有,主机A则会发送一个ARP请求信息,请求的目标IP地址是主机B的IP地址,目标MAC地址是MAC地址的广播帧(即FF-FF-FF-FF-FF-FF),源IP地址和MAC地址是主机A的IP地址和MAC地址。

  2)当交换机接受到此数据帧之后,发现此数据帧是广播帧,因此,会将此数据帧从非接收的所有接口发送出去。

  3)当主机B接受到此数据帧后,会校对IP地址是否是自己的,并将主机A的IP地址和MAC地址的对应关系记录到自己的ARP缓存表中,同时会发送一个ARP应答,其中包括自己的MAC地址。

  4)主机A在收到这个回应的数据帧之后,在自己的ARP缓存表中记录主机B的IP地址和MAC地址的对应关系。而此时交换机已经学习到了主机A和主机B的MAC地址了。

  主机A与主机B不在同一网段

    技术分享

  不在同一网段的话,就需要借助路由器了 

  1)HostA在网络层将来自上层的报文封装成IP数据包,其中源IP地址为自己,目标IP地址是HostB,HostA会用本机配置的24位子网掩码与目标地址进行“与”运算,得出目标地址与本机不是同一网段,因此发送HostB的数据包需要经过网关路由A的转发。

  2)HostA通过ARP请求获取网关路由A的E0口的MAC地址,并在链路层将路由器E0接口的MAC地址封装成目标MAC地址,源MAC地址是自己。

  3)路由器A从E0可接收到数据帧,把数据链路层的封装去掉,并检查路由表中是否有目标IP地址网段(即192.168.2.2的网段)相匹配的的项,根据路由表中记录到192.168.2.0网段的数据请发送给下一跳地址10.1.1.2,因此数据在路由器A的E1口重新封装,此时,源MAC地址是路由器A的E1接口的MAC地址,封装的目标MAC地址则是路由器2的E1接口的MAC地址。

  4)路由B从E1口接收到数据帧,同样会把数据链路层的封装去掉,对目标IP地址进行检测,并与路由表进行匹配,此时发现目标地址的网段正好是自己E0口的直连网段,路由器B通过ARP广播,获知HostB的MAC地址,此时数据包在路由器B的E0接口再次封装,源MAC地址是路由器B的E0接口的MAC地址,目标MAC地址是HostB的MAC地址。封装完成后直接从路由器的E0接口发送给HostB。

  5)此时HostB才会收到来自HostA发送的数据。

  总结:路由表负责记录一个网络到另一个网络的路径,因此路由器是根据路由表工作的。

二:openvswitch+vlan组网

  1.物理网络vlan配置 

    管理网络,用于 OpenStack 节点之间的通信,假设 VLAN ID 范围为 50 - 99.

    数据网络,用于虚拟机之间的通讯。由于Vlan模式下,租户建立的网络都具有独立的 Vlan ID,故需要将连接虚机的服务器的交换机端口设置为 Trunk 模式,并且设置所允许的 VLAN ID 范围,比如 100~300。

    外部网络,用于连接外部网络。加上 VLAN ID 范围为 1000-1010。

    技术分享

    

  • 如果该物理交换机接到一个物理路由器并做相应的配置,则数据网络可以使用这个物理路由器,而不需要使用 Neutron 的虚拟路由器。
  • 如果不使用物理的路由器,可以在网络节点上配置虚拟路由器。

  2.Neutron 配置生效的过程:

  配置就不详细说了,后续将会整理成一个完成的部署博客,下面简述下Neutron配置生效的过程。

  当 Neutron L2 Agent (OVS Agent 或者 Linux Bridge agent)在计算和网络节点上启动时,它会根据各种配置在节点上创建各种 bridge。以 OVS Agent 为例,

  (1)创建 intergration brige(默认是 br-int);如果 enable_tunneling = true 的话,创建 tunnel bridge (默认是 br-tun)。

  (2)根据 bridge_mappings,配置每一个 VLAN 和 Flat 网络使用的 physical network interface 对应的预先创建的 OVS bridge。

  (3)所有虚机的 VIF 都是连接到 integration bridge。同一个虚拟网络上的 VM VIF 共享一个本地 VLAN (local VLAN)。Local VLAN ID 被映射到虚拟网络对应的物理网络的 segmentation_id。  

  (4)对于 GRE 类型的虚拟网络,使用 LSI (Logical Switch identifier)来区分隧道(tunnel)内的租户网络流量(tenant traffic)。这个隧道的两端都是每个物理服务器上的 tunneling bridge。使用 Patch port 来将 br-int 和 br-tun 连接起来。

  (5)对于每一个 VLAN 或者 Flat 类型的网络,使用一个 veth 或者一个 patch port 对来连接 br-int 和物理网桥,以及增加 flow rules等。

  (6)最后,Neutron L2 Agent 启动后会运行一个RPC循环任务来处理 端口添加、删除和修改。管理员可以通过配置项 polling_interval 指定该 RPC 循环任务的执行间隔,默认为2秒。

  3.Neutron代码的实现流程

     boot虚拟机的过程。nova依次会

    1调用neutron rest api申请一个或多个port,neutron会根据数据库中的配置进行分配

    2计算机节点上,nova调用ovs-vsctl命令将虚拟机的VIF被plug到br-int上

    3启动虚拟机

    neutron l2 agent的循环任务每隔2秒会

      1)调用ovs-vsctl list-ports命令获取br-int上的port,在根据上次保存的历史记录,生成所有变更端口的列表(包括添加的,删除的,更新的)

      2)为每一个待处理端口,根据其ID从DB中取出详细信息

      3)针对每一个增加或变更的port设置local vlan tag,调用命令ovs-ofctl mod-flows命令来设置br-tun或者物理的bridge的flow rules;并设置db中其状态为up

      4)针对每一个被删除的port,设置db中其状态为down

  4.Neutron的vlan模式的虚拟网络

    4.1一个计算节点上的网络示例:

      1) Neutron 使用 Open vSiwtch。

      2) 一台物理服务器,网卡 eth1 接入物理交换机,预先配置了网桥 br-eth1。

      3) 创建了两个 neutron VLAN network,分别使用 VLAN ID 101 和 102。

      4) 该服务器上运行三个虚机,vm1 和 vm2 分别有一个网卡接入 network 1;vm2 和 vm3 分别有一个网卡接入 network 2.

    技术分享

    neutron在该计算节点上做的事情:

      创建了OVS Integration bridge br-int。它的四个Access口中,两个打上了内部vlan Tag1,连接接入network1的两个网卡;另外两个端口打上的是vlan tag 2

      创建一对patch port连接br-int和br-eth1

      设置br-int中的flow rules。对从access ports进入的数据帧,加上相应的vlan tag,转发到patch port;从patch port进入的数据帧,将vlan id 101修改为1,102修改为2,再转发到相应的access ports

      设置br-eth1中的flow rules。从patch port进入的数据帧,将内部vlan id 1修改为101,内部vlan id 2修改为102,再从eth1端口发出。对从eht1进入的数据帧做相反的处理

    4.2连接到同一个物理交换机上的两个计算节点的内部通信

      4.2.1:同一个物理节点上,同一个vlan之间的通信

          相同物理服务器上的虚机,如果 VM1 和 VM2 属于同一个 tenant network 的同一个subnet,那么两者的通信直接经过 br-int 进行广播

           技术分享

            例如:vm1:10.0.0.2----》vm2:10.0.0.3

            vm1 ping vm2,由于vm1与vm2同时属于一个vlan,当包到达br-int的时候,后查询vm2的mac地址表,如果不存在,则发送广播,寻找,这个时候vm2收到mac地址,一看是我的,他就回给br-int,br-int就会把mac地址缓存起来,并回给vm1即可

      4.2.2:同一个物理节点上,不同vlan之间的通信

      4.2.3:不同物理节点上,同一个vlan之间的通信

      4.2.4:不同物理节点上,不同vlan之间的通信

第二:neutron openvswitch + gre/vxlan虚拟网络

一.gre介绍

二.vxlan介绍

三.gre与vxlan的对比

四: Neutron 通过 OVS 对 GRE 和 VXLAN 的支持

五:介绍几个典型的流程案例

案例一:同一个主机上同一个子网内虚机之间的通信过程

案例二:不同主机上同一个子网内的虚机之间的通信过程

案例三:同一个主机上不同子网内虚机之间的通信流程

案例三:不同主机上不同子网内的虚机之间的通信流程

案例四: 虚机访问外网

案例五: 虚机发送DHCP请求 

 

 

参考资料:http://20161215.blog.51cto.com/2276215/1766742

openstack之Neutron网络模式vlan,gre,vxlan详解