Nova基本介绍

Nova由多个提供不同功能的独立组件构成,对外通过REST API通信,对内使用RPC通信,使用一个中心数据库存储数据。其中,每个组件都可以部署一个或多个来实现横向扩展。

Nova体系架构

有上图可以看出,目前Nova主要由API、Compute、Conductor、Scheduler4个核心组件组成,他们之间通过RPC进行通信。

API是进入Nova的HTTP接口,可以通过部署多个API服务来实现横向扩展。API根据请求是长时任务或短时任务,将请求发送给Conductor或Compute。

长时任务请求被发送到Conductor,Conductor负责对其全程跟踪和调度。对于新建虚拟机或迁移虚拟机这类需要调度的请求,Conductor会向Scheduler请求一台符合要求的计算节点,然后,Conductor会把请求发送到最终的计算节点上。

Conductor除了长时任务还负责代理其他节点的数据库访问。这主要是为了安全问题和实现在线升级的功能。最终对于虚拟机操作的请求都会发送到Compute组件,Compute负责与Hypervisor进行通信,实现虚拟机的生命周期管理。对各个Hypervisor的支持通过Virt Driver框架来实现。

为了简化用户对RESTful API的使用,Nova提供了官方的API封装python-novaclient作为Client,它提供了命令行供用户直接访问Nova,也提供了SDK供用户编写客户端应用程序。由于社区系统Openstack对用户有统一的一致的用户体验,python-novaclient会在将来被遗弃,被Openstack各项目统一的Client所取代。

以创建虚拟机为例,首先用户执行novaclient提供的用于创建虚拟机的命令,API服务监听到novaclient发送的HTTP请求,并且API将它转换为AMQP消息,通过消息队列调用Conductor服务,Conductor服务通过消息队列接收到任务之后,做一些准备工作(例如,汇总虚拟机参数等),再通过消息队列告诉Scheduler选择一个满足该虚拟机创建的主机,Conductor拿到Scheduler提供的目标主机之后,就会下发请求给Compute服务,执行创建虚拟机的任务。

当然,并不是所有的业务流程都像上述创建虚拟机那样需要所有的服务,对于一些短时任务,比如,删除虚拟机等,不需要Scheduler服务,API通过消息队列告诉Compute删除指定虚拟机,Compute通过Conductor更新数据库即可。

Nova源码目录结构

-- etc
    -- nova      - nova配置文件
-- nova
    --CA/
    --api/        - Nova API服务
    --cells/    - nova-cells服务
    --cmd/        - 各个Nova服务的入口程序
    --common/    
    --compute/        - Nova Compute服务
    --conductor/    - Nova Comductor服务
    --conf/            - 所有的配置选项
    --console/        - nova-console服务
    --consoleauth/    - nova-consoleauth服务
    --db/            - 数据库操作
    --hacking/        - 编码规范检查
    --image/        - Glance接口抽象
    --ipv6/            - ipv6工具函数
    --keymgr/        
    --locale/        - 国际化相关文件
    --network/        - nova-network服务
    --notifications/    
    --objects/        - Objects Module
    --pci/            - PCI/SR-IOV支持
    --policies/        - 所有policy的默认规则
    --privsep/        
    --scheduler/    - Nova Scheduler服务
    --servicegroup/
    --tests/        - 单元测试
    --virt/            - Hypervisor driver
    --vnc/
    --volume/        - Cinder抽象接口
-- plugins
-- run_teshs.sh
-- setup.cfg
-- setup.py
-- tools
-- tox.ini

对于初学Openstack的人来说,我们应重点关注setup.cfg文件。作为Openstack的源码地图,setup.cfg是我们阅读源码最为依赖的文件,它指导我们去了解Nova的代码结构。

entry_points作为setup.cfg文件中最重要的section,通过对它的分析,我们即可找到所要研究nova源码的突破点。

每个setup.cfg文件的entry_points中都会有个相对比较特殊的组,或者说命名空间console_scripts,其中的每一项都表示一个可执行的脚本,这些脚本在部署时会被安装,这就是Nova各个组件的入口。

console_scripts =
    nova-api = nova.cmd.api:main
    nova-api-metadata = nova.cmd.api_metadata:main
    nova-api-os-compute = nova.cmd.api_os_compute:main
    nova-cells = nova.cmd.cells:main
    nova-compute = nova.cmd.compute:main
    nova-conductor = nova.cmd.conductor:main
    nova-console = nova.cmd.console:main
    nova-consoleauth = nova.cmd.consoleauth:main
    nova-dhcpbridge = nova.cmd.dhcpbridge:main
    nova-manage = nova.cmd.manage:main
    nova-network = nova.cmd.network:main
    nova-novncproxy = nova.cmd.novncproxy:main
    nova-policy = nova.cmd.policy:main
    nova-rootwrap = oslo_rootwrap.cmd:main
    nova-rootwrap-daemon = oslo_rootwrap.cmd:daemon
    nova-scheduler = nova.cmd.scheduler:main
    nova-serialproxy = nova.cmd.serialproxy:main
    nova-spicehtml5proxy = nova.cmd.spicehtml5proxy:main
    nova-status = nova.cmd.status:main
    nova-xvpvncproxy = nova.cmd.xvpvncproxy:main

Nova服务介绍

对于Nova来说,除了上述我们提到的几个主要服务API、Conductor、Scheduler、Compute,它还提供了很多其他的服务。

  • nova-all: 用于启动所有Nova服务的辅助脚本,其中API作为WSGI服务器启动。
  • nova-api:Nova对外提供的RESTful API服务,目前Nova提供两种API服务,即nova-api-metadata和nova-api-os-compute。nova-api根据配置文件/etc/nova/nova.conf的enable_apis选项设置启动这两种服务。
  • nova-api-metadata:接受虚拟机实例metadata(元数据)相关的请求。
  • nova-api-os-compute:Openstack API服务。
  • nova-cells:Cell模块允许用户在不影响现有Openstack云环境的前提下,增强横向扩展、大规模部署的能力。
  • nova-cert:管理X509证书。
  • nova-compute:Compute服务。
  • nova-conductor:Conductor服务。
  • nova-console:允许用户通过代理访问虚拟机实例的控制台。已经在G版本中被nova-xvpnvncproxy取代。
  • nova-novncproxy:Nova提供了novncproxy代理支持用户通过vnc访问虚拟机。提供完整的vnc访问。
  • nova-dhcpbridge:管理nova-network的DHCP bridge。
  • nova-manage:提供很多与Nova的维护和管理相关的功能,比如用户创建、vpn管理等。
  • nova-scheduler:Scheduler服务。

其中nova-api会读取api-paste.ini,从中加载整个WSGI stack。最终API的入口点都位于nova.api.openstack.compute路径中。我们如果希望研究某个API的细节,可以将这些入口点钟指定的代码路径作为突破口切入进去,从而更为有效的理清nova的脉络。

Nova中各个服务直接的通信使用了基于AMQP实现的RPC机制,其中nova-compute、nova-conductor和nova-scheduler在启动时都会注册一个RPC Server,而nova-api因为Nova内部并没有服务会调用它提供的接口,所以无需注册。

标签: 云计算, Openstack, Nova

添加新评论