OpenStack源码系列:nova-compute

nova-compute运行的节点为计算节点,虚拟机运行于计算节点上。例如对于创建虚拟机请求,nova-api接收到客户端请求后,经过nova-scheduler调度器调度,再将请求发送给某个选定的nova-compute节点,nova-compute模块经过一系列的动作之后将命令下发到真正的hypervisor进行虚拟机的创建。这篇文章,我们将分析nova-compute关键的代码流程及类关系。我们看一下nova-compute的main函数:


在main函数中,调用service.Service.create创建一个服务,server为nova.service.Service对象,表示一个服务,然后调用service.serve(server)启动该服务,代码如下:


记住了,server变量是nova.service.Service类型的对象。我们看下这个nova.service.Service类的构造函数__init__(),如下图:

目前我们主要关注其中一个成员变量self.manager,它是nova.compute.manager.ComputeManager对象实例。经过和nova-api类似的调用流程后,nova.service.Service.start函数被调用,代码如下图:

在start函数中,调用self.rpcserver.start()启动了一个rpc服务,从打印的变量值中可以看到,和这个rpc服务关联之target的topic为compute,server值也为compute,endpoints中有一个nova.compute.manager.ComputeManager,虚拟机相关的操作之后都由这个对象来处理。如果我们继续跟踪这个rpcserver的启动代码,则可看到如下信息:

它最后是调用oslo.messaging._drivers.amqpdriver.py的listen()来监听。

我们看下nova.compute.manager.ComputeManager类的构造函数__init__(),如下图:

构造函数里通过driver.load_compute_driver函数初始化了一个成员变量self.driver,再看下load_compute_driver函数,如下图:

根据我当前环境的配置,我们看到加载后driver是一个nova.virt.libvirt.driver.LibvirtDriver对象实例,它对libvirt进行了封装,与底层的hypervisor通信。

nova-compute主要类关系图如下:

以上是个人的粗浅理解,由于细节过多这里只解析关键部分,欢迎各位同仁指正!

欢迎微信扫码,进入【技术人成长】社群逛逛。