背景:本文以neutron的12.0.0版本为例进行源码分析。
neutron-server作为Neutron的控制中心,主要对Neutron四大类资源进行管理。从实现架构上可以粗略分为两大模块:neutron-api和RPC。这么分类的依据来自于neutron-server的启动方法,其资源的初始化基本都是在start_api_and_rpc_workers这个方法中完成的。
该方法的源码如下所示:
def start_api_and_rpc_workers(neutron_api): try: worker_launcher = service.start_all_workers() pool = eventlet.GreenPool() api_thread = pool.spawn(neutron_api.wait) plugin_workers_thread = pool.spawn(worker_launcher.wait) api_thread.link(lambda gt: plugin_workers_thread.kill()) plugin_workers_thread.link(lambda gt: api_thread.kill()) pool.waitall() except NotImplementedError: neutron_api.wait()
为了简洁,删除了日志等内容。在这个方法中生成了两个线程,分别是api_thread和plugin_workers_thread。api_thread与neutron-api线程(在调用方法中已创建)相关联,即neutron-server的wsgi部分。这部分内容也是接下来需要讲解的重点;而plugin_workers_thread通过名称即可猜测出它必定与plugin插件相关,事实上它主要用于RPC服务。如果这两部分内容放在一篇博文进行讲解,不仅不利于阅读,也不利于理解整个Neutron(因为包含的信息太多),所以关于RPC的内容将会放到下一章节进行讲解。
一 、neutron-server是什么
弄清楚这个问题,我们才能明白neutron-server为什么要如此设计。
Neutron是OpenStack项目中负责提供网络服务的组件,它基于软件定义网络的思想,实现了网络虚拟化下的资源管理。Neutron 的设计目标是实现“网络即服务(Networking as a Service)”,在设计上遵循了基于 SDN 实现网络虚拟化的原则,在实现上充分利用了 Linux 系统上的各种网络相关的技术。
-
Neutron功能
-
-
二层交换:支持多种虚拟交换机,一般使用Linux Bridge和Open vSwitch实现。
-
三层路由:利用Linux协议栈实现
-
负载均衡:通过HAProxy实现
-
防火墙:使用iptables实现
-
VPN 等等
-
-
网络类型
-
-
Local:本地网络,主要用于测试
-
Flat: Falt网络,只有一个广播域
-
VLAN:可以跨节点,私有云使用较多
-
VXLAN: 大二层网络,能够克服vlan和物理网络基础设施的限制,公有云使用较多。
-
GRE: 与VXLAN类似
-