zoukankan      html  css  js  c++  java
  • Openstack计算Nova组件

    欢迎来到虚拟机的世界,如果我们将Openstack环境里运行在各个无力节点上的各种服务看座生命体,而不是死的指令集合,那么就是一个虚拟机的世界。

    Openstack的计算组件,也就是Nova项目实现了虚拟机世界的抽象,控制者一个个虚拟机的状态变迁与生老病死,管理者它们的资源分配。

    Nova的体系结构

    Nova主要由API、Compute、Conductor、Scheduler四个核心服务组成,它们之前通过AMQP消息队列进行通信

    API上进去Nova的HTTP借口,Compute和VMM(虚拟机管理器)交互来进行虚拟机并管理虚拟机的生命周期,Scheduler从可用池中选择最合适的计算节点来创建新的虚拟机实例,Conductor为数据库的访问提供一层安全保障,Scheduler只是读取数据库的内容,API则由Policy保护,因此它们都可以直接操作数据库,但是社区还是希望涉及数据库的操作都通过Conductor

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

    并不是所有的业务流程都像虚拟机那样需要所有的服务,比如删除虚拟机时,不需要Scheduler服务,API通过消息队列告诉Compute删除指定虚拟机,Computed通过Conductor更新数据库即完成业务的流程

    1.Nova源码目录结构

      

    看到这里的想法是Openstack从入门到劝退

    在一个城市里面寻找一个地方 最快的方法是打开地图,所以对新人来说,这里面最重要的文件是setup.cfg,作为Openstack的源码地图,setup.cfg文件就是浏览代码时候最为依仗的文件,它引导我们去认识一个新的项目,并了解它的代码结构

     1 [entry_points]
     2 console_scripts =
     3     nova-api = nova.cmd.api:main
     4     nova-api-metadata = nova.cmd.api_metadata:main
     5     nova-api-os-compute = nova.cmd.api_os_compute:main
     6     nova-compute = nova.cmd.compute:main
     7     nova-conductor = nova.cmd.conductor:main
     8     nova-manage = nova.cmd.manage:main
     9     nova-novncproxy = nova.cmd.novncproxy:main
    10     nova-policy = nova.cmd.policy:main
    11     nova-rootwrap = oslo_rootwrap.cmd:main
    12     nova-rootwrap-daemon = oslo_rootwrap.cmd:daemon
    13     nova-scheduler = nova.cmd.scheduler:main
    14     nova-serialproxy = nova.cmd.serialproxy:main
    15     nova-spicehtml5proxy = nova.cmd.spicehtml5proxy:main
    16     nova-status = nova.cmd.status:main

     每个setup.cfg文件的"entry_points"中都有会个比较特殊的组,或者说namespace。

     console.scripts中的文件在部署的时候会生产执行文件,它也是入口文件

     1 # nova/compute/rpcapi.py
     2 @profiler.trace_cls("rpc")
     3 class ComputeAPI(object):
     4     def live_migration(self, ctxt, instance, dest, block_migration, host,
     5                        migration, migrate_data=None):
     6         version = '5.0'
     7         client = self.router.client(ctxt)
     8         # 获取目标机的RPC Client
     9         cctxt = client.prepare(server=host, version=version)
    10         # RPC cast主要用于异步任务,比如创建虚拟机,在创建过程可能需要很长时间
    11         # 如果使用RPC call会等待 显然对性能有很大影响,csta()第二个参数是
    12         # RPC调用对函数名,后面的参数将作为参数被传入该函数
    13         cctxt.cast(ctxt, 'live_migration', instance=instance,
    14                    dest=dest, block_migration=block_migration,
    15                    migrate_data=migrate_data, migration=migration)

    类ComputedAPI中的函数即为Compute服务提供给RPC调用的接口,其他服务调用前需要使用这个模块,比如

     1 # nova/conductor/tasks/live_migrate.py
     2 class LiveMigrationTask(base.TaskBase):
     3     def __init__(self, context, instance, destination,
     4                  block_migration, disk_over_commit, migration, compute_rpcapi,
     5                  servicegroup_api, query_client, report_client,
     6                  request_spec=None):
     7         super(LiveMigrationTask, self).__init__(context, instance)
     8         ...
     9         self.compute_rpcapi = compute_rpcapi
    10     def _execute(self):
    11         ....
    12         return self.compute_rpcapi.live_migration(self.context,
    13                 host=self.source,
    14                 instance=self.instance,
    15                 dest=self.destination,
    16                 block_migration=self.block_migration,
    17                 migration=self.migration,
    18                 migrate_data=self.migrate_data)

    类ComputeAPI只是暴露给其他服务的RPC调用接口,Compute服务的RPC Server接受RPC请求后,真正完成任务的是nova.compute.manager

    # nova/compute/manager.py
    class ComputeManager(manager.Manager):
        """Manages the running instances from creation to destruction."""
    
        target = messaging.Target(version='5.10')
        def _do_live_migration(self, context, dest, instance, block_migration,
                               migration, migrate_data):
            ...

    从ComputeAPI到ComputeManager的过程即是RPC调用过程

  • 相关阅读:
    Java中数组遍历
    数组常见异常
    数组的访问
    Java中数组的定义方式
    Java中数组的概念与特点
    node爬虫技术初探
    node相关内容
    vs code快捷键
    vue 入门开发
    es6 常见用法
  • 原文地址:https://www.cnblogs.com/Mikusa/p/12539968.html
Copyright © 2011-2022 走看看