Image 2 Image 3 Image 3 Image 3

openstack neutron基础(三)-server

频道:行业资讯 日期: 浏览:807

neutron server对外提供api,操作数据库,给agent分发消息和回应agent的rpc消息。一般环境中server是多进程的,分析api-server和rpc-server。

api-server

入口在server.boot_server(wsgi_eventlet.eventlet_wsgi_server),然后调用到service.serve_wsgi(service.NeutronApiService),serve_wsgi就是create然后start NeutronApiService,NeutronApiService继承了WsgiService,它的start调用到了WsgiService的start就是_run_wsgi,_run_wsgi调用了load_paste_app和run_wsgi_app,而run_wsgi_app生成了wsgi.Server然后wsgi.Server.start(),wsgi.Server.start()又调用到了wsgi.Server._launch,在它中ProcessLauncher生成了几个api进程,然后对进程launch_service,注意launch_service中一个参数service,通过这个我们回到了wsgi.Server._run(application),这个application就是api-paste.ini中的neutron.api.v2.router:APIRouter.factory,这些都是框架性代码,可以忽略不计。

openstack neutron基础(三)-server

factory带我们来到了neutron/pecan_wsgi/controllers/root.py:V2Controller和neutron/pecan_wsgi/startup.py:initialize_all()。

V2Controller就是建立resource以及action和处理这个请求的函数的对应关系,resource有_CORE_RESOURCES,action就是ACTION_MAP中的POST等转换成create,组合起来url中有port,action是POST,那么最后就调用到port_create函数。

api重要的代码就是这个initialize_all,它执行的第一行代码就是生成NeutronManager,它init时加载core plugin和service plugin,然后剩下的就是加载resouce的extension,建立和plugin的对应关系,plugin继承DB,api请求交给对应的plugin处理,plugin操作数据库,如果需要还得notify agent。

Ml2Plugin继承了NeutronPluginBaseV2,创建3个很重要的成员TypeManager,ExtensionManager和MechanismManager,并且对它们initialize()。ml2还用_start_rpc_notifiers生成各种各样的notifier,notify dhcp, securitygroup, dvr,tunnel和其它server。TypeManager加载ml2_conf.ini文件中的type_drivers,初始化network type,并对tenant的network segment做检查,分配id等。ExtensionManager加载ml2_conf.ini文件中的extension_drivers所有extension并初始化,当ml2处理resouce时,调用每个extension的对这个resouce对应的处理函数,如ml2 create_port时调用qos extension的函数process_create_port。MechanismManager加载ml2_conf.ini文件中的mechanism_drivers,当ml2处理resource并且写DB时,分别调用mechanism的pre和post函数,如ml2 create_port时调用OpenvswitchMechanismDriver的create_port_precommit和create_port_postcommit函数。MechanismManager有个玩意是bind_port(),nova-compute创建虚拟机时调用neutron生成一个port,nova把虚拟机调度到了一个物理节点上,然后neutron把虚拟的port和物理机以及物理机上的agent绑定,这样这个port就落地了,在哪个物理机上,这个物理上运行什么agent,支持不支持这个port的网络类型,支持不支持这个port type,如果都支持就bind成功了,不再尝试其它mechanism drivers。agent发现了这个port,创建流表,生成转发表项,然后通知server port up,server再notify关心这个port up的其它agent或者plugin。

ServicePlugin是接口,有不同类型的service provider也可以理解成driver实现具体的功能。L3RouterPlugin是router和floating ip的service plugin,逻辑处理代码大部分在DB目录里,然后notify l3 agent。

neutron-server这部分只讲了整体框架,没讲具体resource的内部处理以及resource之间的关系等,懂了框架很容易定位到这些代码,再懂点业务,很容易就掌握了。

rpc-worker

workers = _get_rpc_workers() + _get_plugins_workers(),_get_rpc_workers根据plugin是否有start_rpc_listeners和start_rpc_state_reports_listener来决定是否创建RpcWorker和RpcReportsWorker,launcher = _start_workers(workers)->ProcessLauncher创建进程,launch_service就执行到getattr(plugin, self.start_listeners_method)()其实就是start_rpc_listeners或者start_rpc_state_reports_listener

Ml2Plugin

start_rpc_state_reports_listener用agents_db.AgentExtRpcCallback()做处理

start_rpc_listeners根据topic不同用不同的callback做处理

resources_rpc.ResourcesPushToServerRpcCallback()

agents_db.AgentExtRpcCallback()

rpc.RpcCallbacks(self.notifier, self.type_manager),

securitygroups_rpc.SecurityGroupServerRpcCallback(),

dvr_rpc.DVRServerRpcCallback(),

dhcp_rpc.DhcpRpcCallback(),

agents_db.AgentExtRpcCallback(),

metadata_rpc.MetadataRpcCallback(),

resources_rpc.ResourcesPullRpcCallback()

L3RouterPlugin

start_rpc_listeners用l3_rpc.L3RpcCallback()做处理

再看一下PeriodicWorker,plugin创建一个worker调用add_worker,_get_plugins_workers调用get_worker取出来,和_get_rpc_workers()取出来的worker一起创建出worker。PeriodicWorker参数是一个函数,它的功能是周期性执行这个函数。

案例分析

/etc/neutron/neutron.conf [DEFAULT] api_paste_config = /usr/share/neutron/api-paste.ini api_workers = 5 rpc_workers = 3 rpc_state_report_workers = 3 core_plugin = ml2 service_plugins = firewall_v2,flow_classifier,lbaasv2-proxy,metering,qos,router,segments,sfc,vpnaas,port_forwarding,networking_l2gw.services.l2gateway.plugin.L2GatewayPlugin dhcp_agents_per_network = 3 /usr/share/neutron/api-paste.ini [app:neutronapiapp_v2_0] paste.app_factory = neutron.api.v2.router:APIRouter.factory neutron 6 1 0 Sep10 ? 02:47:01 /var/lib/kolla/venv/bin/python /var/lib/kolla/venv/bin/neutron-server --config-file /etc/neutron/neutron.conf --config-file /etc/neutron/l2gateway_agent.ini --config-file /etc/neutron/l2gw_plugin.ini --config-file /etc/neutron/plugins/ml2/ml2_conf.ini --config-file /etc/neutron/neutron_lbaas.conf --config-file /etc/neutron/neutron_vpnaas.conf --config-file /etc/neutron/fwaas_driver.ini neutron 24 6 14 Sep10 ? 1-19:53:32 /var/lib/kolla/venv/bin/python /var/lib/kolla/venv/bin/neutron-server --config-file /etc/neutron/neutron.conf --config-file /etc/neutron/l2gateway_agent.ini --config-file /etc/neutron/l2gw_plugin.ini --config-file /etc/neutron/plugins/ml2/ml2_conf.ini --config-file /etc/neutron/neutron_lbaas.conf --config-file /etc/neutron/neutron_vpnaas.conf --config-file /etc/neutron/fwaas_driver.ini neutron 25 6 19 Sep10 ? 2-14:17:06 /var/lib/kolla/venv/bin/python /var/lib/kolla/venv/bin/neutron-server --config-file /etc/neutron/neutron.conf --config-file /etc/neutron/l2gateway_agent.ini --config-file /etc/neutron/l2gw_plugin.ini --config-file /etc/neutron/plugins/ml2/ml2_conf.ini --config-file /etc/neutron/neutron_lbaas.conf --config-file /etc/neutron/neutron_vpnaas.conf --config-file /etc/neutron/fwaas_driver.ini neutron 26 6 13 Sep10 ? 1-16:46:10 /var/lib/kolla/venv/bin/python /var/lib/kolla/venv/bin/neutron-server --config-file /etc/neutron/neutron.conf --config-file /etc/neutron/l2gateway_agent.ini --config-file /etc/neutron/l2gw_plugin.ini --config-file /etc/neutron/plugins/ml2/ml2_conf.ini --config-file /etc/neutron/neutron_lbaas.conf --config-file /etc/neutron/neutron_vpnaas.conf --config-file /etc/neutron/fwaas_driver.ini neutron 27 6 11 Sep10 ? 1-11:35:06 /var/lib/kolla/venv/bin/python /var/lib/kolla/venv/bin/neutron-server --config-file /etc/neutron/neutron.conf --config-file /etc/neutron/l2gateway_agent.ini --config-file /etc/neutron/l2gw_plugin.ini --config-file /etc/neutron/plugins/ml2/ml2_conf.ini --config-file /etc/neutron/neutron_lbaas.conf --config-file /etc/neutron/neutron_vpnaas.conf --config-file /etc/neutron/fwaas_driver.ini neutron 28 6 11 Sep10 ? 1-10:52:11 /var/lib/kolla/venv/bin/python /var/lib/kolla/venv/bin/neutron-server --config-file /etc/neutron/neutron.conf --config-file /etc/neutron/l2gateway_agent.ini --config-file /etc/neutron/l2gw_plugin.ini --config-file /etc/neutron/plugins/ml2/ml2_conf.ini --config-file /etc/neutron/neutron_lbaas.conf --config-file /etc/neutron/neutron_vpnaas.conf --config-file /etc/neutron/fwaas_driver.ini neutron 29 6 2 Sep10 ? 08:49:38 neutron-server: rpc worker (/var/lib/kolla/venv/bin/python /var/lib/kolla/venv/bin/neutron-server --config-file /etc/neutron/neutron.conf --config-file /etc/neutron/l2gateway_agent.ini --config-file /etc/neutron/l2gw_plugin.ini --config-file /etc/neutron/plugins/ml2/ml2_conf.ini --config-file /etc/neutron/neutron_lbaas.conf --config-file /etc/neutron/neutron_vpnaas.conf --config-file /etc/neutron/fwaas_driver.ini) neutron 30 6 2 Sep10 ? 08:40:43 neutron-server: rpc worker (/var/lib/kolla/venv/bin/python /var/lib/kolla/venv/bin/neutron-server --config-file /etc/neutron/neutron.conf --config-file /etc/neutron/l2gateway_agent.ini --config-file /etc/neutron/l2gw_plugin.ini --config-file /etc/neutron/plugins/ml2/ml2_conf.ini --config-file /etc/neutron/neutron_lbaas.conf --config-file /etc/neutron/neutron_vpnaas.conf --config-file /etc/neutron/fwaas_driver.ini) neutron 31 6 2 Sep10 ? 08:32:50 neutron-server: rpc worker (/var/lib/kolla/venv/bin/python /var/lib/kolla/venv/bin/neutron-server --config-file /etc/neutron/neutron.conf --config-file /etc/neutron/l2gateway_agent.ini --config-file /etc/neutron/l2gw_plugin.ini --config-file /etc/neutron/plugins/ml2/ml2_conf.ini --config-file /etc/neutron/neutron_lbaas.conf --config-file /etc/neutron/neutron_vpnaas.conf --config-file /etc/neutron/fwaas_driver.ini) neutron 32 6 0 Sep10 ? 00:22:54 neutron-server: rpc worker (/var/lib/kolla/venv/bin/python /var/lib/kolla/venv/bin/neutron-server --config-file /etc/neutron/neutron.conf --config-file /etc/neutron/l2gateway_agent.ini --config-file /etc/neutron/l2gw_plugin.ini --config-file /etc/neutron/plugins/ml2/ml2_conf.ini --config-file /etc/neutron/neutron_lbaas.conf --config-file /etc/neutron/neutron_vpnaas.conf --config-file /etc/neutron/fwaas_driver.ini) neutron 33 6 0 Sep10 ? 00:22:51 neutron-server: rpc worker (/var/lib/kolla/venv/bin/python /var/lib/kolla/venv/bin/neutron-server --config-file /etc/neutron/neutron.conf --config-file /etc/neutron/l2gateway_agent.ini --config-file /etc/neutron/l2gw_plugin.ini --config-file /etc/neutron/plugins/ml2/ml2_conf.ini --config-file /etc/neutron/neutron_lbaas.conf --config-file /etc/neutron/neutron_vpnaas.conf --config-file /etc/neutron/fwaas_driver.ini) neutron 34 6 0 Sep10 ? 00:22:56 neutron-server: rpc worker (/var/lib/kolla/venv/bin/python /var/lib/kolla/venv/bin/neutron-server --config-file /etc/neutron/neutron.conf --config-file /etc/neutron/l2gateway_agent.ini --config-file /etc/neutron/l2gw_plugin.ini --config-file /etc/neutron/plugins/ml2/ml2_conf.ini --config-file /etc/neutron/neutron_lbaas.conf --config-file /etc/neutron/neutron_vpnaas.conf --config-file /etc/neutron/fwaas_driver.ini) neutron 35 6 1 Sep10 ? 05:28:54 neutron-server: periodic worker (/var/lib/kolla/venv/bin/python /var/lib/kolla/venv/bin/neutron-server --config-file /etc/neutron/neutron.conf --config-file /etc/neutron/l2gateway_agent.ini --config-file /etc/neutron/l2gw_plugin.ini --config-file /etc/neutron/plugins/ml2/ml2_conf.ini --config-file /etc/neutron/neutron_lbaas.conf --config-file /etc/neutron/neutron_vpnaas.conf --config-file /etc/neutron/fwaas_driver.ini)

5个api-server, 3个RpcWorker,3个RpcReportsWorker,ml2创建的1个PeriodicWorker,主进程进程号是6,是其它进程的父进程。最后主进程spawn几个协程,一直wait api-server和worker的结束。

总结

没图没表,讲的不细,重在理解neutron-server框架,细节还得看代码,代码是Stein版本。

0 留言

评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。
验证码