您的当前位置:首页正文

openstack学习之neutron_运行分析

2024-11-11 来源:个人技术集锦

neutron server启动
启动命令入口:neutron.server.main

#启动rest api server
neutron_api = service.serve_wsgi(service.NeutronApiService)

NeutronApiService
app = config.load_paste_app(app_name)
通过api-paste.ini配置加载并启动rest server

api-paste.ini
[composite:neutron]
use = egg:Paste#urlmap
/: neutronversions
/v2.0: neutronapi_v2_0

# 根据url定义了2个入口,
/请求最转给neutronversions
/v2.0转给 neutronapi_v2_0

[app:neutronversions]
paste.app_factory = neutron.api.versions:Versions.factory
#处理version API 

[app:neutronapiapp_v2_0]
paste.app_factory = neutron.api.v2.router:APIRouter.factory
#处理其余的API,包括标准和扩展部分

代码入口点在APIRouter.factory,大家可以阅读代码了解。
    def __init__(self, **local_config):
        mapper = routes_mapper.Mapper()
        plugin = manager.NeutronManager.get_plugin()
        ext_mgr = extensions.PluginAwareExtensionManager.get_instance()
        ext_mgr.extend_resources("2.0", attributes.RESOURCE_ATTRIBUTE_MAP)

rest server的前端框架部分最终会将rest的请求转换为对plugin或service plugin的方法调用,方法名字为action_resrouce(比如create_network)。

NeutronManager
根据配置文件加载core plugin和service plugin。

配置实例:
service_plugins = neutron.services.l3_router.l3_router_plugin.L3RouterPlugin,neu
tron.services.metering.metering_plugin.MeteringPlugin
core_plugin = neutron.plugins.ml2.plugin.Ml2Plugin

每种extension(NeutronManager叫service type),只能在一个plugin中实现,如果多个plugin都注册实现了同一个extension,会导致加载失败。

每个plugin支持的extension,可以查看这个plugin的 _supported_extension_aliases

启动rpc server
neutron_rpc = service.serve_rpc()
# 启动rpc server。agent通过rpc api来调用plugin的功能。
这种方式是通过service统一启动core plugin中的rpc server。core plugin中需要实现start_rpc_listener。
目前只有ml2 core plugin实现了这种方式。其他的core plugin是在自己的初始化中(__init__)创建rpc server。
如linux bridge中的 def _setup_rpc(self):
如ovs中的 def setup_rpc(self):

agent启动
每个agent都有自己的启动命令。如
neutron-linuxbridge-agent = neutron.plugins.linuxbridge.agent.linuxbridge_neutron_agent:main
neutron-dhcp-agent = neutron.agent.dhcp_agent:main
neutron-l3-agent = neutron.agent.l3_agent:main
neutron-openvswitch-agent = neutron.plugins.openvswitch.agent.ovs_neutron_agent:main

每个agent都会创建自己的RPC server
如linux bridge中LinuxBridgeNeutronAgentRPC:
def setup_rpc(self, physical_interfaces):

core plugin 和 service plugin通过RPC api调用agent的功能。agent代码一般会有一个主循环,会监听系统的状态,当产生某些特定事件时,会通过rpc api调用(通知)plugin。 plugin和agent是双向通信,互相通过rest api调用对方。

rest处理流程
rest api的处理流程:
rest前端框架->plugin相应代码->agent相应代码。

RPC处理流程
参考另一篇博文《openstack学习之RPC服务实现分析》


显示全文