怎样写 OpenStack neutron plugin加载的 Plugin

程序开发异常网
现在位置:
声明:
本博客欢迎转载,但请保留原作者信息,并请注明出处!
作者:林凯
团队:华为杭州OpenStack团队
在OpenStackGrizzly版本中,Neutron(当时叫Quantum)组件引入了一个新的网络服务:LoadBalance(LBaaS),关于LoadBalance的框架和基础知识方面网上已经有了一些好文章,在此不再赘述。本文将对LoadBalancer的代码流程及实现进行初步解析,肯定会有错误和不严谨的地方,需要大家给予指正。
推荐一些基础知识的文章给大家,大家看完之后再看源码会更加简单一些。
Neutron LoadBalancer的基本使用步骤是:
租户创建一个pool,初始时的member个数为0;
租户在该pool内创建一个或多个 member
租户创建一个或多个 health monitor
租户将health monitors与pool关联
租户使用pool创建vip
首先我们来看下我们在创建pool、member、healthmonitor和vip的时候,代码都做了哪些事情。
LoadBalance整体流程框架
从上图可以看到租户创建pool等的请求首先发送到LBaaSPlugin进行处理,所以我们对代码的解析同样从这开始。在plugin.py中我们可以看到对应的create_pool等方法:
# pool作为LB v1的根对象,是工作流的起点
def create_pool(self, context, pool):
provider_name =self._get_provider_name(context, pool['pool'])
# DB中创建pool对象
p = super(LoadBalancerPlugin,self).create_pool(context, pool)
self.service_type_manager.add_resource_association(
constants.LOADBALANCER,
provider_name, p['id'])
#need to add provider name to pooldict,
#because provider was not known to dbplugin at pool creation
p['provider'] = provider_name
driver = self.drivers[provider_name]
# 调用默认provider中的驱动创建pool
driver.create_pool(context, p)
except loadbalancer.NoEligibleBackend:
# that should catch cases whenbackend of any kind
# is not available (agent,appliance, etc)
self.update_status(context,ldb.Pool,
p['id'], constants.ERROR,
"Noeligible backend")
raiseloadbalancer.NoEligibleBackend(pool_id=p['id'])
return p
其中driver.create_pool(context,p)是关键方法
driver =self.drivers[provider_name],可知:根据配置文件中的provider设置,调用相应的driver。
在neutron.conf中可以看到默认的设置为:service_provider=LOADBALANCER:Haproxy:neutron.services.loadbalancer.drivers.haproxy.plugin_driver.HaproxyOnHostPluginDriver:default
所以跳转至/neutron/services/loadbalancer/haproxy/plugin_driver.py中:
class HaproxyOnHostPluginDriver(agent_driver_base.AgentDriverBase):
device_driver =namespace_driver.DRIVER_NAME
这个类中并无create_pool的方法,所以去他的父类AgentDriverBase中查看:
def create_pool(self, context, pool):
# 首先通过agent scheduler分配agent
agent =self.pool_scheduler.schedule(self.plugin, context, pool,
self.device_driver)
if not agent:
raiselbaas_agentscheduler.NoEligibleLbaasAgent(pool_id=pool['id'])
self.agent_rpc.create_pool(context,pool, agent['host'],
self.device_driver)
在这里首先通过agent scheduler分配agent,看下具体的实现方式:
def schedule(self, plugin, context, pool, device_driver):
# 为pool分配一个active的loadbalanceragent,如果其上没有已经使能的agent
with context.session.begin(subtransactions=True):
lbaas_agent =plugin.get_lbaas_agent_hosting_pool(
context, pool['id'])
if lbaas_agent:
LOG.debug(_('Pool %(pool_id)shas already been hosted'
' by lbaas agent%(agent_id)s'),
{'pool_id':pool['id'],
'agent_id':lbaas_agent['id']})
# 获取active的agent
active_agents =plugin.get_lbaas_agents(context, active=True)
if not active_agents:
LOG.warn(_('No active lbaasagents for pool %s'), pool['id'])
# 根据device_driver筛选候选的agent
candidates =plugin.get_lbaas_agent_candidates(device_driver,
active_agents)
if not candidates:
LOG.warn(_('No lbaas agentsupporting device driver %s'),
device_driver)
# 随机选取一个合适的候选agent
chosen_agent =random.choice(candidates)
# 与pool进行绑定
binding =PoolLoadbalancerAgentBinding()
binding.agent = chosen_agent
binding.pool_id = pool['id']
context.session.add(binding)
LOG.debug(_('Pool %(pool_id)s isscheduled to '
'lbaas agent%(agent_id)s'),
{'pool_id': pool['id'],
'agent_id':chosen_agent['id']})
return chosen_agent
我们刚才在Haproxy的plugindriver中,可知:
device_driver = namespace_driver.DRIVER_NAME
所以根据device_driver选择的agent是Haproxy的namespace_driver,通过agent将创建pool的请求转发给device_driver(HaproxyNSDriver)这个过程并不是直接就一步到位的,其中agent发送RPC异步请求,此时agent_manager接收到请求
def create_pool(self, context, pool, driver_name):
if driver_name not inself.device_drivers:
LOG.error(_('No device driver onagent: %s.'), driver_name)
self.plugin_rpc.update_status('pool', pool['id'], constants.ERROR)
# 获取相应的driver(根据设置默认为HaproxyNSDriver)
driver =self.device_drivers[driver_name]
driver.create_pool(pool)
except Exception:
self._handle_failed_driver_call('create', 'pool', pool['id'],
driver.get_name())
self.instance_mapping[pool['id']] =driver_name
# 之后更新数据库中的状态
self.plugin_rpc.update_status('pool', pool['id'], constants.ACTIVE)
可知这里调用HaproxyNSDriver中的create_pool函数,在Haproxy的namespace_driver.py中找到对应的方法:
def create_pool(self, pool):
# nothing to do here because a poolneeds a vip to be useful
# 当没有vip的情况下,不做操作。
而member,healthmonitor和vip的创建流程与之类似,可以参照这个流程进行解析。
至此,Neutron LoadBalance的源码解析第一部分内容就结束了,下一部分内容敬请期待。
原 关键帧动画CAKeyframeAnimation当前访客身份:游客 [
主要研究方向:RedHat Linux 6系统运维 Openstack云计算 Linux下C开发 python开发
:突然又可以了
:引用来自“xiaobin_guo”的评论我安装前系统是w...
:我安装前系统是win8,安装Linux后,想在开机时切...
今日访问:12
昨日访问:21
本周访问:51
本月访问:33
所有访问:4218
Openstack计算-存储-控制分离与计算节点的在线添加
发表于1年前( 18:53)&&
阅读(879)&|&评论()
0人收藏此文章,
主要是为了应对生产环境而进行的测试。这个架构放在大的生产环境下还需要适当的调整。
Openstack计算-存储-控制分离与计算节点的在线添加
实验环境:red hat linux 6.5
Host: 192.168.122.19
Compute node 1:192.168.122.3
Compute node 2 : 192.168.122.4
Storage node : 192.168.122.5
要求:iptable -F
架构解释:
计算节点:即虚拟机最终跑的节点,主要进程:openstcak-nova-compute
这个节点资源消耗主要是cpu和内存。所以可以在实际部署的时候调大点
存储节点:这里我单指块存储方案(cinder),主要进程:openstack-cinder-volume
& & & &这里是将来云主机启动后,云主机所添加的额外的磁盘的资源池(就是虚 & & & 拟机添加多大的磁盘消耗的都是这个)。openstack采用了lvm的磁盘管理 & & & 方式。云主机只认名为cinder-volumes的vg卷【即只在这个名字的卷下划分 & & & 存储空间给云主机】,如果你Host安装的时候没有分这个卷,它默认会从 & & & 根磁盘上削减一部分出来,然后创建这个卷。
控制节点:有很多控制进程都在这里个节点上。这里主要想强调,网络即neutron部分。
&计算节点上的云主机的数据包都会被转发到neutron-server所启动的节点上。
&Neutron-sevrer一般会启动在网络控制节点。所以网络控制节点必须使用be- ex的桥接接口,所采用的网络结构必须是vlan。【local网络只在你玩all in &one的时候生效】火墙策略在建立后会自动帮你重写。
1.配置好两台机子的yum源[目录地址由你自己实际放的位置设定]:【All】
#vim /etc/yum.repo.d/openstack.repo
[openstack]
name=openstack
baseurl=ftp://192.168.122.1/pub/openstack/openstack
gpgcheck=0
2.更新机子的iproute:【All】
#yum update -y
注:如果缺少这一步,可能你机子上有关路由的进程起不来。如:neutron-l3-agent这个nuetron的网络进程。neutron-l3-agent是主要建立在三层网络上的,主要完成对数据包的转发【DNAT和SNAT】。所以它对路由软件有要求。
让内核重新加载
3.安装pakcstack【Host】
#yum install openstack-packstack -y
4.虚拟机添加网卡并设定网络 【All】
#cp /etc/sysconfig/network-scripts/ifcfg-eth0 /etc/sysconfig/network-scripts/ifcfg-eth1
#vim /etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE=eth1
ONBOOT=yes
#service network restart
5..生成定制文件和修改定制文件 【Host】
#packstack –gen-answer-file=/root/answer.txt
#vim &/root/answer.txt
#确认安装swift对象存储
CONFIG_SWIFT_INSTALL=y
#设置ntp时间同步【这一步很重要,如果时间不同步两边的信息肯定不对称】
CONFIG_NTP_SERVERS=192.168.122.1
#指定计算节点
CONFIG_NOVA_COMPUTE_HOSTS=192.168.122.3
#因为控制节点与外端有连接,数据库放上面不安全,所以我放到了存储节点
CONFIG_MYSQL_HOST=192.168.122.5
#设定mysql用户密码
CONFIG_MYSQL_PW=redhat
#确定admin用户的密码
CONFIG_KEYSTONE_ADMIN_PW=redhat
CONFIG_NEUTRON_OVS_TENANT_NETWORK_TYPE=vlan
CONFIG_NEUTRON_OVS_VLAN_RANGES=physnet1:1:4094
CONFIG_NEUTRON_OVS_BRIDGE_MAPPINGS=physnet1:br-eth1
CONFIG_NEUTRON_OVS_BRIDGE_IFACES=br-eth1:eth1
6.计算节点设定时间同步:【Compute node 1 , Compute node 2 and Storage Node】
#yum install -y ntp
#vim /etc/ntp.conf
restrict 192.168.122.1
server 192.168.122.1 iburst
#/etc/init.d/ntpd start
7.存储节点配置iscsi磁盘共享:【Storage Node】
#yum install &-y scsi-target-utils-1.0.24-10.el6.x86_64
添加一块磁盘
#fdisk -cu /dev/vda &#分处一块vda1
#pvcreate /dev/vda1
#vgcreate vg1 /dev/vda1
#lvcreate -L 20G /dev/vg1 -n lv1
#mkfs.ext4 /dev/vg1/lv1
之后写策略文件:
#vim /etc/tgt/targets.conf
&target iqn..example:server.target1&
#the disk you want to share
backing-store /dev/vg1/lv1
#the ip who allow to connet with you
initiator-address 192.168.122.19
#tgt-adm -s#查看共享信息
8.Host注册和使用iscsi磁盘 【Host】
安装iscsi工具
#yum install -y iscsi-initiator-utils-6.2.0.873-10.el6.x86_64
#iscsiadm -m discovery -s st -p 192.168.122.5
#iscsiadm -m node -l -p 192.168.122.5
#fdisk -l#查看是否成功获取磁盘【看大小,我的是vda】
#fdisk -cu /dev/vda #建立一个vda1
#pvcreate /dev/vda1
#vgcreate cinder-volumes /dev/vda1 #vg名字不能变
9.安装openstack :【Host】
#packstack &--answer-file=/root/answer.txt
【输入密码后就正确安装】
10.安装完成后现象:
#nova-manage service list 2& /dev/null
Binary & & & & & Host & & & & & & & & & & & & & & & & Zone & & & & & &Status & & State Updated_At
nova-consoleauth
& & & & & & & & internal & & & &enabled & &:-) &
nova-scheduler &
& & & & & & & & internal & & & &enabled & &:-) &
nova-conductor &
& & & & & & & & internal & & & &enabled & &:-) &
nova-cert & & & & & & & & & & & & internal & & & &enabled & &:-) &
nova-compute & &
& & & & & & & & &nova & & & & & &enabled & &:-) &
【Compute Node】
#nova-manage service list 2& /dev/null
Binary & & & & & Host & & & & & & & & & & & & & & & & Zone & & & & & &Status & & State Updated_At
nova-consoleauth
& & & & & & & & internal & & & &enabled & &:-) &
nova-scheduler &
& & & & & & & & internal & & & &enabled & &:-) &
nova-conductor &
& & & & & & & & internal & & & &enabled & &:-) &
nova-cert & & & & & & & & & & & & internal & & & &enabled & &:-) &
nova-compute & &
& & & & & & & & &nova & & & & & &enabled & &:-) &
11.尝试用Firefox登录web管理界面:
成功启动云主机并可以远程登录--成功
12.在线添加Compute Node 2: 【Compute Node 2】
#yum install -y openstcak-nova-compute
#cp /etc/nova/nova.conf /etc/nova/nova.conf.orig
#scp 192.168.122.3:/etc/nova/nova.conf /etc/nova/
#vim /etc/nova/nova.conf
vncserver_listen=192.168.122.4
vncserver_proxyclient_address=192.168.122.4
sql_connection=mysql://nova:redhat@192.168.122.5/nova
#/etc/init.d/openstack-nova-compute start
#nova-manage service list 2& /dev/null
Binary & & & & & Host & & & & & & & & & & & & & & & & Zone & & & & & &Status & & State Updated_At
nova-consoleauth
& & & & & & & & internal & & & &enabled & &:-) &
nova-scheduler &
& & & & & & & & internal & & & &enabled & &:-) &
nova-conductor &
& & & & & & & & internal & & & &enabled & &:-) &
nova-cert & & & & & & & & & & & & internal & & & &enabled & &:-) &
nova-compute & &
& & & & & & & & &nova & & & & & &enabled & &:-) &
nova-compute & &
& & & & & & & & &nova & & & & & &enabled & &:-) &
13.配置Compute Node2 的网络结构:【Compute Node2】
确保你的机子已经有eth1的网络接口
安装neutron-openvswitch
#yum install -y openstack-neutron-openvswitch
#cp /etc/neutron/neutron.conf & /etc/neutron/neutron.conf.orig
#cp /etc/neutron/plugins/openvswitch/ovs_neutron_plugin.ini /etc/neutron/plugins/openvswitch/ovs_neutron_plugin.ini.orig
直接拷贝过来
#scp 192.168.122.3:/etc/neutron/neutron.conf /etc/neutron/neutron.conf
#scp 192.168.122.3:/etc/neutron/plugins/openvswitch/ovs_neutron_plugin.ini /etc/neutron/plugins/openvswitch/ovs_neutron_plugin.ini &
#/etc/init.d/openvswitch start
#chkconfig openvswitch on
添加网络接口
#ovs-vsctl add-br br-int
#ovs-vsctl add-br br-eth1
#ovs-vsctl add-port br-eth1 eth1
#service neutron-openvswitch-agent start
#chkconfig &neutron-openvswitch-agent on
#chkconfig neutron-ovs-cleanup on
14.测试Compute Node2
首先关闭原来的Compute Node1
#nova-mange service disable --host
--service nova-manage
之后web启动另一个云主机,正常启动后
#virsh list
应该可以看见一台虚拟机正在运行,如果能远程登录--成功
更多开发者职位上
1)">1)">1" ng-class="{current:{{currentPage==page}}}" ng-repeat="page in pages"><li class='page' ng-if="(endIndex<li class='page next' ng-if="(currentPage
相关文章阅读用最精炼语言介绍OpenStack网络代码演进的前世今生 -
- ITeye技术网站
博客分类:
在OpenStack世界中,网络组件最初叫nova-network,它混迹于计算节点nova的代码库中。nova-network可以单独部 署在一台机器上,为了高性能HA也可以和nova-compute一样部署在计算节点上(这也就是所谓的multi-host功能)。
nova- network实现简单,bug少,但性能可不弱哦,直接采用基于Linux内核的Linux网桥少了很多层抽象应该算强大的。不足之处是支持的插件少 (只支持Linux网桥),支持的网络拓扑少(只支持flat, vlan)。
为了支持更多的插件,支持更多的网络拓扑,更灵活的与nova交互,于是有了quantum工程。quantum插件不仅支持Linux网桥,也支 持OpenvSwitch,一些SDN的插件以及其他商业公司的插件。在网络拓扑上,除了支持flat,vlan外,还支持gre, vxlan。但quantum不支持关键的multi-host特性。
quantum因为和一家公司的名称冲突,于是,改名为neutron。
neutron继续演进,quantum之前的实现存在这么一个问题。我们说道说道。在quantum中,实现一种类型的插件一般包括两个部分,一 部分与数据库db打交道称之为plugin,一部分是调用具体的网络设备真正干活的称之为agent。
像plugin就有linux bridge plugin, opevswitch plugin, hyper-v plugin等,这些plugin因为都是与db打交道,变化的字段并不多,所以代码绝大部分是重复的。这样也就出来了一个公共的plugin叫ml2 plugin(具体的代码实现就是TypeDriver)。
但这只是一个表象,ml2还有更大的作用,那就是它里面的MechanismDriver。
我举个例子讲,之前没有ml2的时候,plugin只能 支持一种,用了linux bridge,就不能用openvswitch了,想要都用那怎么办,那就需要MechanismDriver上场,MechanismDriver的作 用是将agent的类型agent_type和vif_type关联,这样vif_type就可以直接通过扩展api灵活设置了,所以这时候你想用 linux bridge你在vif_type里直接将port绑定成linux bridge就行了,同理,想用openvswitch就将vif_type将port绑定成openvswitch就行。
除了让openvswitch, linux bridge这些不同的插件共存之外,ml2还能让不同的拓扑如flat, vlan, gre, vxlan其乐融融和谐共存,直接在ml2_conf.ini这个配置文件里都配上即可。这样也就解决了一个问题,以前前端horizon中无法配置是用 flat还是vlan,因为你配了也没有用,那时候后端还不支持flat和vlan同时存在了,现在皆大欢喜了。
上面的ml2解决的只是网络中L2层的问题,对于L3层的路由功能neturon又单独整出个l3-agent,对于dhcp功能又单独整出个 dhcp-agent,不过它们归根结底仍属于实际真正干功能活的,对于和数据库db打交道的那部分则是通过提供扩展api来实现的。
那么现在我们想加更 多的网络服务该怎么办呢,如L4-L7层的FwaaS, VPNaaS, DNATaaS, DNSaaS,所以现在neutron又出来一个新的服务框架用于将所有这些除L2层以外的网络服务类似于上述ml2的思想在数据库这块一网打尽。并且这 些网络服务可能是有序的,例如可能需要先过FwaaS防火墙服务再过DNATaaS服务来提供浮动IP,所以也就有了service chain的概念。目前这块代码只进去了firewall, loadbalance, metering, vpn几块,但万变不离其宗,未来neutron就是朝这个思想继续往下做。想用哪些服务可以通过neutron.conf这个配置文件中的 service_provider项指定。
最后,需要一提的是,从性能角度讲,我认为目前neutron仍然不能用于大规模的生产环境,理由如下: 1)虽然增加了更多的插件,更多的网络服务,更多的网络拓扑,但它仍然不支持multi-host功能,对性能是极大影响 2)neutron-server不支持workers通过fork实现的利用cpu多核的多进程机制,仍然是单线程实现的,阻塞的话(python解释器是单进程的,使用greenlet保证每个线程在单进程下也是线性的),会延缓接受其他请求对性能产生影响。 3)neutron-server是无状态的服务,理论上讲是可以在多台机器上运行前端再加haproxy实现HA的,但实际代码中存在众多竞争条件的bug。当然这个问题不仅在neturon有,其他组件我看一样存在。 4)在遂道性能方面存在优化的可能,遂道如GRE,VXLAN等将虚拟L2层打通反而扩大了广播风暴的可能,实际上虚拟网桥或者hypervisor都是知道虚机的IP和MAC地址的映射的关系的,根本不需要仍使用传统的ARP广播方式来获得这种映射关系。 5)其他…
成熟的路上漫漫其修远兮,这也正好给各位爱好openstack的童鞋们提供了大显身手的好机会:)
浏览: 151739 次
来自: 北京
这篇文章举例和结论都没错,但是博主理解有误!实现Runable ...
在世界的中心呼喚愛 写道这个文章有错。。MyThread1 m ...
这个文章有错。。MyThread1 mt = new MyTh ...
我想说这个 没解决接口和继承的问题
楼主 你看着改了吧!! ...
当extends Thread时,MyThread mt1=安装OpenStack neutron时出现的问题,已经折磨我很久了,望大家帮忙
[问题点数:40分]
安装OpenStack neutron时出现的问题,已经折磨我很久了,望大家帮忙
[问题点数:40分]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
相关推荐:
匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。}

我要回帖

更多关于 neutron core plugin 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信