ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

深入理解Neutron网络

2019-03-14 16:52:03  阅读:1130  来源: 互联网

标签:network int 网络 虚拟 深入 br 节点 Neutron


一、Neutron中的三种网络

1. External Network/API Network

这个网络是链接外网的,无论是用户调用OpenStack的API,还是创建出来的虚拟机要访问外网,或者外网要ssh到虚拟机,都需要通过这个网络。

2. Data Network

数据网络,虚拟机之间的数据传输通过这个网络来进行,比如一个虚拟机要连接到另一个虚拟机,虚拟机要连接虚拟路由都是通过这个网络来进行。

3. Management Network

管理网络,OpenStack各个模块之间的交互,连接数据库,连接Message Queue都是通过这个网络来进行。

二、Neutron中的三个节点

1. Controller节点

      neutron-server用于接受API请求创建网络,子网,路由器等,然而创建的这些东西仅仅是一些数据结构在数据库里面。

2. Network节点

   (1)neutron-l3-agent用于创建和管理虚拟路由器,当neutron-server将路由器的数据结构创建好,neutron-l3-agent是做具体事情的,真正的调用命令行将虚拟路由器,路由表,namespace,iptables规则全部创建好。

   (2)neutron-dhcp-agent用于创建和管理虚拟DHCP server,每个虚拟网络都会有一个DHCP server,这个DHCP server为这个虚拟网络里面的虚拟机提供IP。

   (3)neutron-openvswitch-plugin-agent用于创建L2的switch,在Network节点上,Router和DHCP Server都会连接到二层的switch上。

3. Compute节点

      neutron-openvswitch-plugin-agent用于创建L2的switch,在compute节点上,虚拟机的网卡也是连接到二层的switch上。

三、租户创建网络过程

   (1)为这个Tenant创建一个private network,不同的private network是需要通过VLAN tagging进行隔离的,互相之间广播(broadcast)不能到达,网络类型可以是vxlan\gre等;

   (2)为private network创建一个subnet,subnet才是真正配置IP网段的地方,对于vpc网络,我们常常用192.168.0.0/24这个网段;

   (3)为这个Tenant创建一个Router,访问外网;

   (4)将private network连接到Router上;

   (5)创建一个External Network;

   (6)创建一个External Network的Subnet,这个外网逻辑上代表了我们数据中心的物理网络,通过这个物理网络,我们可以访问外网;

   (7)将Router连接到External Network;

       设置外部网络时PUBLIC_GATEWAY应该设为数据中心里面的Gateway,PUBLCI_RANGE也应该和数据中心的物理网络的CIDR一致,否则连不通。之所以设置PUBLIC_START和PUBLIC_END,是因为在数据中心中,不可能所有的IP地址都给OpenStack使用,另外的可能搭建了VMware vCenter,可能有物理机,所以仅仅分配一个区间给OpenStack来用。

四、Neutron中的技术

       Neutron能提供虚拟的分布式(跨物理机虚机在同一个vlan)二层vswitch(提供虚拟的network\subnet\port)、三层router、防火墙、负载均衡等抽象网络功能,能为每个租户提供独立的虚拟网络环境。所谓虚拟网络,就是虚机启动的时候会有一个虚拟网卡,虚拟网卡会连接到虚拟switch上,虚拟switch连接到虚拟router上,虚拟router最终和物理网卡连通,从而实现虚拟网络和物理网络连通起来。可能用到的技术包括:

五、举例说明

1. GRE网络原理

       假设虚拟机VM0虚拟网卡veth0有网络数据包向外网发送,那么会经过如下过程:

       (1)数据包会经过qbr Linux Bridge设备,qvb(quantum veth bridge)和qvo(quantum veth ovs)虚拟网络设备;

       (2)数据包到达OVS网桥br-int上,br-int将数据包attach到OVS网桥br-tun上(br-int完成标记和去除内部即本地租户VLAN TAG,本机虚机L2层流量的本地转发);

       (3)数据包再从compute节点OVS网桥的br-tun和network节点OVS网桥br-tun构成的GRE隧道穿过(br-tun是OVS虚拟出来的网桥,进行隧道封装,并完成VNI和VLAN映射,通过它将环境中的所有物理机连通起来,这样物理节点之间就可以形成一个GRE的点对点通信网络或者vxlan网络);

       (4)交付到Network节点的OVS网桥br-int上;

       (5)网络节点的br-int通过qr设备借助Linux命名空间qrouter连通到br-ex上的qg设备,将数据包交付到OVS网桥br-ex上(qrouter就是网络节点上的neutron-l3-agent);

       (6)最后br-ex通过网络节点的外部物理端口eth1把数据包传送到外部路由器的网关。

2. 进一步理解

       (1)DHCP

       为什么会有个DHCP Server呢?同一个private network里的虚拟机得到IP都是通过这个DHCP Server来的,这个DHCP Server也是连接到br-int上和虚拟机进行通信的。

       (2)qbr与br-int

       既然qbr与br-int都是网桥,为什么不直接连接到br-int,而要通过qvb和qvo这两个虚拟网络设备来连接,为什么要用到qbr呢?因为Security group。OVS网桥br-int没有设置iptables规则的功能,但是openstack又需要提供安全组的服务,因此借助了Linux Bridge(qbr),虽然都是二层网桥,但为了功能互补就同时出现了。具体Openstack中的安全组开通哪些端口,屏蔽哪些端口是用iptables来实现的,而br-int这些虚拟网桥都是通过OVS创建,openstack的Kernel mode和netfilter的kernel mode不兼容。一个IP包进来要么走iptables规则进行处理,要么走OVS规则进行处理,br-int上有很多OVS的规则,比如vlan tag等,所以iptables必须要另外建立一个linux bridge来做,因此有了qbr。在了解拓扑结构的时候,可以将qbr忽略,VM直接连接到br-int上就可以。

       (3)namespace

       为什么会有namespace呢,java的namespace是为了在不同namespace下有相同的类名,openstack也是类似。不同tenant都创建自己的router和private network,彼此不知道别人指定了哪些网段,很有可能两个tenant都指定了同一个网段,这样不同的private network的路由表、DHCP Server就需要隔离,否则就乱了,因此有了namespace。

       (4)OVS一体化网桥br-int

       每个机器上都有了自己的br-int,但是对于虚机和虚拟router来说,它们仍然觉得自己连接到了一个大的L2的br-int上,通过这个br-int相互通信,它们感受不到br-int下面的虚拟网卡br-tun。所以对于多节点结构,我们可以想象br-int是一个大的、横跨所有compute节点和network节点的L2层switch,实现虚机之间的通信以及虚机和router的通信,好像open stack环境中所有的虚机都连接到了一个巨型的虚拟交换机上。

       但是br-int毕竟被物理的割开了,需要有一种方式将其串联,openstack提供了多种方式,可以用GRE将不同机器的br-int连接起来,也可以通过vlan或是vxlan。这就是为什么openstack有了br-int这个bridge,但是不把所有的openvswitch的规则都在它上面实现。就是为了提供这种灵活性,对于虚拟机来讲,看到的是一大整个br-int,不同机器的br-int可以有多种方式连接,这在br-int下面的网卡上面实现。

       (5)OVS隧道网桥br-tun

       br-tun也是OVS创建的虚拟网桥,它是一个中间层,接收br-int的网络数据,然后再通过特定的网络协议与各个节点的br-tun相连构成一个通道层。如果所有的br-int构成的抽象层定义为虚拟二层网络,那么所有的br-tun构成的抽象层便是虚拟三层网络了。

       (6)网络数据包隔离

       如果有不同的tenant,创建了不同的private network,为了在data network上对包进行隔离,创建private network的时候,需要指定vlanid。因此不同的tenant的private network上建的虚机,连接到br-int上的时候是带tag的,所以不同tenant的虚机,即便连接到同一个br-int上,因为tag不同,也不能相互通信。

       但是同一个节点上的tag是仅在此节点有效的,并不是使用我们创建private network的时候指定的全局唯一的vlanid,一个compute节点上的br-int上的tag 1和另一个compute节点上的br-int的tag1很可能是两码事。全局的vlanid仅仅在br-int以下的虚拟网卡和物理网络中使用,虚机所有能看到的东西,到br-int为止,看不到打通br-int所要使用的vlanid。

       从局部有效的tag到全局有效的vlanid的转换,都是通过openvswitch的规则,在br-tun上实现。

标签:network,int,网络,虚拟,深入,br,节点,Neutron
来源: https://www.cnblogs.com/viviane/p/10531289.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有