2021SC@SDUSC
Nova 源码分析
一. Nova是什么
Nova是openstack提供计算实例的一种方式(又名虚拟服务器)。Nova支持创建虚拟机,并对系统容器有有限的支持。尽管Linux拥有守护进程,Nova依旧提供了作为守护进程的服务。
Nova与以下openstack服务共同组成基本服务:
- Keystone:为所有openstack服务提供身份验证服务。
- Glance:提供计算实例镜像库。所有计算实例通过glance镜像创建。
- Neutron:为连接到根节点的计算实例提供虚拟和物理网络。
- Placement:记录云的可用资源库存并在创建一个虚拟机选择如何使用资源。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MXpuTnaF-1633804453865)(https://docs.openstack.org/nova/xena/_images/architecture.svg)]
- DB: sql database for data storage.
- API: component that receives HTTP requests, converts commands and communicates with other components via the oslo.messaging queue or HTTP.
- Scheduler: decides which host gets each instance.
- Compute: manages communication with hypervisor and virtual machines.
- Conductor: handles requests that need coordination (build/resize), acts as a database proxy, or handles object conversions.
- Placement: tracks resource provider inventories and usages.
对于端使用者来说,可以直接通过Horizon,Openstack Client或者Nova Client等方式直接使用API创建和管理服务器。
Nova可以设置成通过RPC发出通告
对于开发者来说,oepnstack提供了相当丰富的guide和reference可以学习。
当用户发起一个新的请求时,该请求会先在 nova-api 中处理。nova-api 会对请求进行一系列检查,包括请求是否合法,配额是否足够等;当检查用过后,nova-api 就会为该请求分配一个唯一的虚拟机 ID ,并在数据库中新建对应的项来记录虚拟机的状态;然后,nova-api 会将请求发送给 nova-conductor 处理。
nova-conductor 主要管理服务之间的通信并进行任务处理。它在接收到请求之后,会为 nova-scheduler 创建一个 RequestSpec 对象用来包装与调度相关的所有请求信息,然后调用 nova-scheduler 服务的 select_destination 接口。
nova-scheduler 通过接收到的 RequestSpec 对象,首先将 RequestSpec 对象转换成 ResourceRequest 对象,并将该对象发送给 Placement 进行一次预筛选,然后会根据数据库中最新的系统状态做出调度决定,并告诉 nova-conductor 把该请求调度到合适的计算节点上。
nova-conductor 在得知调度决定后,会把请求发送给对应的 nova-compute 服务。
每个 nova-compute 服务都有独立的资源监视器(Resource Tracker)用来监视本地主机的资源使用情况。当计算节点接收到请求时,资源监视器能够检查主机是否有足够的资源。
-
若资源充足则启动指定虚拟机,并在数据库中更新虚拟机状态同时将最新的主机资源情况更新到数据库。
-
若当前主机不符合请求的资源要求,nova-compute拒绝要求并将请求重发给noca-conduct,重试整个调度过程。
二. Components
folders:
1.api:接受调用服务
-
cmd:Nova的各种服务入口
-
compute:创建和终止虚拟机的守护进程,管理虚拟机管理程序和虚拟机的通信。
-
conf:配置选项
-
conduct:处理需要协调的请求,是api,scheduler和compute的中介。
-
console:console服务
-
db:封装数据库服务
-
hacking:编码规范检查
-
image:封装镜像操作
-
keymgr:密钥管理器
-
locale:国际化相关
-
network:网络服务
-
notification:通知
-
object:避免直接操作数据库,封装操作
-
pci:PCI/SR-IOV支持
-
scheduler:scheduler服务
-
servicegroup:成员服务,服务组
-
storgage:CEPH存储
-
tests:单元测试
-
virt:支持的 hypervisor 驱动
-
volume:封装卷服务,Cinder接口抽象
-
Novncproxy:协调compute服务和数据库之间的交互,是compute和数据库交互的代
files:
__init__.py
availability_zones.py # 区域设置的工具函数
baserpc.py # 基础 RPC 客户端/服务端实现
block_device.py # 块设备映射
cache_utils.py # oslo_cache 封装
config.py # 解析命令行参数
context.py # 贯穿 Nova 的所有请求的上下文
crypto.py # 包装标准加密数据元素
debugger.py # pydev 调试
exception.py # 基础异常类
exception_wrapper.py # 封装异常类
filters.py # 基础过滤器
i18n.py # 集成 oslo_i18n
loadables.py # 可加载类
manager.py # 基础 Manager 类
middleware.py # 更新 oslo_middleware 的默认配置选项
monkey_patch.py # eventlet 猴子补丁
policy.py # 策略引擎
profiler.py # 调用 OSProfiler
quota.py # 每个项目的资源配额
rpc.py # RPC 操作相关的工具函数
safe_utils.py # 不会导致循环导入的工具函数
service.py # 通用节点基类,用于在主机上运行的所有工作者
service_auth.py # 身份认证插件
test.py # 单元测试基础类
utils.py # 工具函数
version.py # 版本号管理
weights.py # 权重插件
wsgi.py # 管理 WSGI 应用的服务器类
三. 相关服务构造简介
-
conduct
api.py对RPC接口封装
rpcapi.py提供RPC接口
manager.py处理RPC API调用
compute访问数据库的操作全部要通过conduct代理完成,conduct操作object,一个object对应一个表
-
scheduler
filter提供过滤器实现,过滤不符合条件的主机
weights提供权重实现,用于计算权重并排序
四.Nova创建虚拟机试分析
首先,调用compute中service.py的create方法,通过它调用compute_api的__create_instance方法。
def create(*self*, *context*, *instance_type*,
*image_href*, *kernel_id*=None, *ramdisk_id*=None,
*min_count*=None, *max_count*=None,
*display_name*=None, *display_description*=None,
*key_name*=None