转载自:http://blog.sina.com.cn/s/blog_6de3aa8a0101pfgz.html
学习或者使用OpenStack普遍有这样的现象:50%的时间花费在了网络部分;30%的时间花费在了存储方面;20%的时间花费在了计算方面。OpenStack网络是不得不逾越的鸿沟,接下来我们一起尝试努力穿越这个沟壑吧……J
主要参考:
RDO官网对GRE网络的分析:
http://openstack.redhat.com/Networking_in_too_much_detail
OpenStack网络出错处理的一般步骤:
http://docs.openstack.org/trunk/openstack-ops/content/network_troubleshooting.html
OpenStack的主要网络部署场景:
http://docs.openstack.org/admin-guide-cloud/content/section_networking-scenarios.html
==
OpenStack整体系统架构:
http://docs.openstack.org/trunk/openstack-ops/content/architecture.html
OpenStack网络设计:
http://docs.openstack.org/trunk/openstack-ops/content/network_design.html
OpenStack网络组件详细介绍:
http://docs.openstack.org/admin-guide-cloud/content/ch_networking.html
一OpenStack软件架构
下图是OpenStack软件架构,可以看出主要的组件:
OpenStack Dashboard [Horizon]:提供web管理接口;
OpenStack Object Store [swift]:提供对象存储服务;
OpenStack Image Service [glance]:提供镜像管理服务;
OpenStack Computer [nova]:提供计算和简单的网络服务;
OpenStack Block Storage [cinder]:提供块存储服务;
OpenStack Networking[Neutron]:提供网络服务;
OpenStack Identity Service [keystone]:提供认证服务。
各个组件详细介绍请参考:
http://docs.openstack.org/admin-guide-cloud/content/ch_install-dashboard.html
二OpenStack系统架构介绍
请参考:
http://docs.openstack.org/trunk/openstack-ops/content/network_design.html#network_topology
http://blog.csdn.net/lynn_kong/article/details/8083924
第二种是OpenStackNetworking架构(先不理会HA),此种架构常用的网络拓扑模式包括:VlanManager,GRE和VXLAN。
三Neutron组件详细介绍
接下来是OpenStack Networking 组件Neutron的软件架构图,它作为OpenStack的一个独立组件,因此既可以独立部署在单独的主机上,也能与其它组件组合部署在同一主机上。但大多数情况下,Neutron组件在OpenStack架构中常以单独的host形式提供网络服务,作为网络节点,这也是我们下面将重点介绍的架构。
Neutron提供多种服务,具体而言:
neutron-server服务:
neutron-server是一个守护进程,用来提供外部调用的API和与其它组件交互的接口。从图中可看出,其中包括horizon组件,nova-compute服务和keystone认证服务。
neutron agent服务:
(1)
插件代理,需要部署在每一个运行hypervisor的主机上,它提供本地的vSwitch配置,更多的时候得依赖你具体所使用的插件类型。(常用的插件是OpenvSwitch,还包括BigSwitch,FloodinghtREST Proxy,Brocade,NSX,PLUMgrid,Ryu)
http://docs.openstack.org/admin-guide-cloud/content/section_plugin-arch.html
(2)
DHCP代理,给租户网络提供动态主机配置服务,主要用途是为租户网络内的虚拟机动态地分配IP地址。
(3)
L3代理,提供三层网络功能和网络地址转换(NAT)功能,来让租户的虚拟机可以与外部网络通信。
(4)
计量代理,为租户网络提供三层网络流量数据计量服务。
查看方式:
[root@rdo-allinone ~(keystone_admin)]# cd/etc/init.d/
[root@rdo-allinone init.d(keystone_admin)]# llneutron-*
-rwxr-xr-x. 1 root root 1778 Feb 19 11:10 neutron-dhcp-agent
-rwxr-xr-x. 1 root root 1814 Feb 19 11:10 neutron-l3-agent
-rwxr-xr-x. 1 root root 1783 Feb 19 11:10 neutron-lbaas-agent
-rwxr-xr-x. 1 root root 1798 Feb 19 11:10 neutron-metadata-agent
-rwxr-xr-x. 1 root root 1836 Feb 19 11:10 neutron-openvswitch-agent
-rwxr-xr-x. 1 root root 1160 Feb 19 11:10 neutron-ovs-cleanup
-rwxr-xr-x. 1 root root 1820 Feb 19 11:10 neutron-server
[root@rdo-allinone ~(keystone_admin)]# neutronagent-list
+--------------------------------------+--------------------+--------------+-------+----------------+
|id
+--------------------------------------+--------------------+--------------+-------+--------------
| 16436773-3170-46fa-8558-902d4d9c05de | DHCPagent
| 7dbebfde-128c-43a8-9c70-fdbe8e49a89e | L3agent
| 98cb47b5-bc50-4cd2-be24-913bf8111c57 | Open vSwitchagent | rdo-computer | :-) |True|
| ad9a4799-94a0-4541-be6a-5cab1fcb3dbf | Open vSwitchagent | rdo-allinone | :-)
+--------------------------------------+--------------------+--------------+-------+--------------
从图中也能看出Neutron不可避免与消息系统Queue和数据库neutrondatabase交互。
四OpenStack-Neutron-OVS-GRE部署
前面提到了OpenStack系统架构,接下来介绍的GRE网络使用的是上面提到的第二种架构,图上的HA可以暂不理会。概括来说这种系统架构有着独立的控制节点运行horizon,glance,cinder,keystone组件服务,还包括数据库,消息系统等;独立的网络节点运行neutron组件服务;一个或多个独立的计算节点运行nova组件服务。
·
·
·
为了安全和有机的让各个组件稳定的运行,划分网络是很重要的工作。OpenStack的网络主要有两类,内部网络和外部网络;再细分内部网络包括管理网络和虚拟机之间的数据网络,外部网络包括互联internet网络和API管控网络。其中:管理网络主要是来管理OpenStack中各个组件的,在安装部署时,很多配置文件项相关的网络IP就属于管理网络范畴;数据网络主要用于虚拟机之间的通信,虚拟网络划分,Networkas a Service等,它由OpenStack的网络组件Neutron和网络插件管理并操作;外部网络就是指可以访问互联网和被cloud之外主机访问或接入的通道;API网络是对cloud之外提供的可以管理的通道,一般不与外部网络区分开来。
·
·
·
·
具体网络划分如下:
管理网络:192.168.10.0/24(配置在eth0上),部署OpenStack环境时,各种服务的配置文件均会使用这个网卡上的IP。
数据网络:192.168.100.0/24(配置在eth1上),用来连通各个节点上的br-tun网桥,构造通信平面,这个通信层可以构建隧道[GRE],也可以构建L3通信协议层[VXLAN]。同时它也负责连通租户虚拟网络内的网络设备,使虚拟机之间进行网络通信。
Public/API网络:10.1.101.0/24(配置在eth2上)外部网关是10.1.101.254,一般用在控制节点和网络节点上,需要和外部通信。
租户网络:是用软件定义出来的虚拟网络[10.0.0.0/24],参考如下
neutron net-create Ext-Net--provider:network_type gre/vxlan--provider:segmentation_id 1 --router:external true
neutronsubnet-create
vim A_prepare.sh
#!/bin/bash
# Create Tenant and User#
tenant=TenantA
user=UserA
usermail=usera@stackinsider.com
role=Member
if keystone tenant-list | grep-q $tenant;then
else
fi
if keystone user-list | grep -q$user;then
else
fi
keystone user-role-add --tenant$tenant --user $user --role $role
neutron --os-tenant-name$tenant --os-username $user --os-password password--os-auth-url=http://localhost:5000/v2.0 net-create$tenant-Net
subnet_id=`neutron--os-tenant-name $tenant --os-username $user --os-password password--os-auth-url=http://localhost:5000/v2.0 subnet-create $tenant-Net10.0.0.0/24 | awk '$2~/^id/{print $4}'`
neutron --os-tenant-name$tenant --os-username $user --os-password password--os-auth-url=http://localhost:5000/v2.0 router-create$tenant-R1
neutron --os-tenant-name$tenant --os-username $user --os-password password--os-auth-url=http://localhost:5000/v2.0 router-interface-add$tenant-R1 ${subnet_id}
neutron router-gateway-set$tenant-R1 Ext-Net
可以参考RDO官方文档http://openstack.redhat.com/GettingStartedHavana_w_GRE使用RDO部署多节点的OpenStack-Neutron-OVS-GRE环境。按照以上网络划分和网卡地址分配,你将更容易的修改RDO的配置文件,部署你所需要的网络环境。
CONFIG_NEUTRON_OVS_TENANT_NETWORK_TYPE=gre
CONFIG_NEUTRON_OVS_TUNNEL_RANGES=1:1000
CONFIG_NEUTRON_OVS_TUNNEL_IF=eth1
安装完成后在安装了neutron组/插件的主机上可以看到vim/etc/neutron/plugins/openvswitch/ovs_neutron_plugin.ini +157配置项local_ip为eth1地址。
五
先了解一下这些网络设备命名的规律:
(1)TenantA的router和Linux网络命名空间qrouter名称
# neutron --os-tenant-name TenantA --os-username UserA--os-password password --os-auth-url=http://localhost:5000/v2.0router-list --field id
| 165f931b-4e08-46eb-a048-f8c62b72b48e|
# ip netns
qrouter-165f931b-4e08-46eb-a048-f8c62b72b48e
即租户虚拟路由器的ID号,与qrouter命名相对应。
(2)TenantA的network和Linux网络命名空间qdhcp名称
# neutron --os-tenant-name TenantA --os-username UserA--os-password password --os-auth-url=http://localhost:5000/v2.0net-list
|id
| 4b9ccec6-0d8c-496c-bad3-a26ce01af708 | TenantA-Net|
| 7f70cae2-fd78-486f-ac62-dabadfbb0959 |Ext-Net
# ip netns
qdhcp-4b9ccec6-0d8c-496c-bad3-a26ce01af708
即租户虚拟网络的ID号,与qdhcp命名相对应。
(3)TenantA网络端口和其它的网络设备的名称
# neutron --os-tenant-name TenantA --os-username UserA--os-password password --os-auth-url=http://localhost:5000/v2.0port-list
+--------------------------------------+------+-------------------+-------------------------------
|id
+--------------------------------------+------+-------------------+-------------------------------
| 4c2c44d9-4b00-4094-9b21-aeb811d213d9|
| 6455f9c4-2c63-4c22-abe6-a93bb59130fa|
| 9e6562b4-6bc8-4e73-b794-55215c1a9d7c|
| f2ce023b-aa4d-4a78-a36f-ae121c4164f7|
+--------------------------------------+------+-------------------+-------------------------------
可以使用下面这些命令验证:
# neutron port-list
# ifconfig
# ovs-vsctl show
# ip netns execqrouter-165f931b-4e08-46eb-a048-f8c62b72b48e ifconfig
# ip netns exec qdhcp-4b9ccec6-0d8c-496c-bad3-a26ce01af708ifconfig
举例说明:
系统中的网络设备:
一个外部网络Ext-Net(8583f2ba-37da-4fa0-b312-f9b0979a4fea);它的子网是ef11b954-d328-4851-a31e-f4bcaefba42b,网段为10.1.101.0/24,但是分配的地址池是从10.1.101.240到10.1.101.252。
还有一个租户网络TenantA-Net(TenantA的网络,ID号为84191af8-269f-485a-b394-85d79e53a39a,对应着qdhcp-84191af8-269f-485a-b394-85d79e53a39a);它的子网是b2bc3ba5-667c-4df1-a74f-448ce8261fff,网段为10.0.0.0/24,地址池是10.0.0.2到10.0.0.254。TenantA还有一个私有的路由器TenantA-R1(ID号为45765633-1bd6-41c7-bdfc-7d425818135a,对应着qrouter-45765633-1bd6-41c7-bdfc-7d425818135a)。
系统中的网络端口:
neuron port-list出来一共有6个端口:
显然端口974a43e3-90a5-4066-83b1-ac819b29966b(10.0.0.2)和端口0f474d5d-519d-4aef-a633-e4d910cc1b1a(10.0.0.4)是虚拟机cirros-0001和cirros-0002的私有IP地址端口(虚拟机tap网络设备端口)。[并且虚拟机cirros-0001位于computer-02上,cirros-0002位于computer-01上]
端口beabcafe-044d-43f2-bed9-7597d9dfe051(10.1.101.241)是一个浮点IP端口,它绑定在了虚拟机cirros-0001(0aaecb00-0ca2-4c60-bf7c-869eb0570ba8)上。
端口6defad4c-b22c-4216-8de6-8eba533f6c5b(10.0.0.1)和端口d7e5d255-6247-4483-841b-19860161392f(10.1.101.240)是qrouter上面的网络端口。分别作TenantA的网络环境中,子网是b2bc3ba5-667c-4df1-a74f-448ce8261fff(网段为10.0.0.0/24)的网关qr-6defad4c-b2和外网通道qg-d7e5d255-62。[多个网络对应多个qrouter,即qr和qg设备]
端口ae8517df-a628-4252-ad0c-38806d8549d8(10.0.0.3)是qdhcp上面的网络端口tapae8517df-a6,为TenantA的网络环境中,子网是b2bc3ba5-667c-4df1-a74f-448ce8261fff(网段为10.0.0.0/24)的网段动态分配私有IP地址,提供子网dhcp服务。[多个子网对应多个qdhcp,即tap设备]
网络节点上的Linux网桥和OVS网桥:
由上图可以看出网络节点没有运行虚拟机,所以Linux网桥为空。
computer-01节点上的Linux网桥和OVS网桥:
由上图可以看出计算节点computer-01节点上面运行虚拟机cirros-0002(3a0ad0d1-ae47-486b-98b2-6e56181fda9e)网络端口为0f474d5d-519d-4aef-a633-e4d910cc1b1a(10.0.0.4)。可以看到qvb0f474d5d-51端口qbr0f474d5d-51端口和tap0f474d5d-51端口。
computer-02节点上的Linux网桥和OVS网桥:
由上图可以看出计算节点computer-02节点上面运行虚拟机cirros-0001(0aaecb00-0ca2-4c60-bf7c-869eb0570ba8)网络端口为974a43e3-90a5-4066-83b1-ac819b29966b(10.0.0.2)。可以看到qvb974a43e3-90端口qbr974a43e3-90端口和tap974a43e3-90端口。
虚拟机中数据包传递路径:
分别介绍数据包途径的网络设备:
计算节点:
从上图中可以看出,Computer-02上面的虚拟机VM-003的eth0网口与一个tap设备相连。但这个tap设备为什么不直接与计算节点上的br-int网桥相连,而是上图黄色框中所展现的连接情况呢?理想的情况应该是Computer-01上面的绿色框所示。
既然br-int也是网桥,为什么还要穿过Linux bridgeqbr设备,这样qbr设备,qvb设备,qvo设备岂不是就显得多余了。没办法,哲学上说存在即合理,qbr的存在当然另有它用,官网文档有这样的一句话:
Security groups:iptables and Linux bridges
Ideally, the TAPdevice
Networking uses an extra Linuxbridge and a veth pair as a workaround for this issue. Instead ofconnecting
(2)OVS一体化网桥br-int
br-int是OpenvSwitch创建的虚拟网桥,但在实际运行中它充当着虚拟交换机的角色,br-int上的端口tap设备将宿主机上的虚拟机实例连接到同一网络交换层上。再透过本机OVS网桥br-tun的互联协议可以将OpenStack系统架构中所有节点的br-int组织成一个更大的虚拟交换机BR-INT{compuer-01-br-int+ compuer-02-br-int….}。这是一种很重要的抽象思想,如此一来就好像OpenStack环境中所有的虚拟机实例都连接到了一个巨型的虚拟机交换机上。遗憾的是这个虚拟机交换机的功能有限,不能设定iptables规则实现安全组服务,因此通过qvo,qvb去连接qbr借助linux网桥完成这个工作。所以在计算节点ovs-vsctlshow中的br-int网桥看到tap设备和qvo设备共存也就不足为奇了。
网络节点:
br-int是OpenvSwitch创建的虚拟网桥,也起到了虚拟交换机作用。上面主要有两类设备:一类是tap设备;另一类是qr设备。linux网络命名空间namespace
六
VXLAN介绍:http://blog.sina.com.cn/s/blog_6de3aa8a0101oisp.html
通过上面介绍OVS在neutron中的使用及各个网桥的功能,那么也就能很容易的理解OVS-GRE和OVS-VXLAN的区别了:关键在于各个节点br-tun网桥构成的通道层的连通方式。若br-tun之间两两点对点的连接,通信封包为GRE格式,那么这样的网络环境就是OpenStack-Neutron-OVS-GRE网络模式。同理,若br-tun之间跑三层网络协议,封包方式为VXLAN格式,这样的网络环境就是OpenStack-Neutron-OVS-VXLAN网络模式。对于GRE和VXLAN网络模式而言,可以抽象地将每个br-tun看成隧道端点,有状态的隧道点对点连接即为GRE;无状态的隧道使用UDP协议连接则为VXLAN。这样说的依据是RDO的官方文档(http://openstack.redhat.com/Using_VXLAN_Tenant_Networks)部署VXLAM_Tenant_Networs的过程就可以看出。
VXLAN:http://tools.ietf.org/html/draft-mahalingam-dutt-dcops-vxlan-09
GRE:http://tools.ietf.org/html/rfc2784.html
七其它
以上是个人的理解和观点,仅供参考,欢迎雅正!!!