Open sfPPP opened 6 years ago
大体的流程是: nova-api---->nova-conductor---->nova-schedule---->nova-compute---->libvirt-driver nova服务接收到请求后先由上述的server.py处理,创建server:
nova/api/openstack/compute/servers.py
def create(self, req, body): (instances, resv_id) = self.compute_api.create(context,
body参数就是http请求发来的参数,这一部分主要是先做权限检查,project_id,user_id,可用域等,然后对body进行解析,flavor,image,network,包括volume等参数提取,主要动作是调用compute对虚机资源进行计算(此处调用compute只是计算资源,并没有创建)。 下面到nova/compute/api.py
def create(self, context, instance_type, return self._create_instance(
该方法对network和可用域做判断,然后继续调用api中的方法,我们来看_create_instance:
def _create_instance(self, context, instance_type, self.compute_task_api.schedule_and_build_instances(
主要对虚机资源进行计算,网络,存储,镜像等,最后将计算出的虚机信息参数提交给conductor,由conductor来统一控制调度,创建等流程。
下面两步是调用流程,不做详细介绍,看下调用方法即可。 nova/conductor/api.py
def schedule_and_build_instances(self, context, nova/conductor/rpcapi.py def schedule_and_build_instances(self, context, nova/conductor/manager.py def schedule_and_build_instances(self, context, hosts = self._schedule_instances(context, legacy_spec, self.compute_rpcapi.build_and_run_instance
在这一方法中,先调用schedule进行调度来选择主机,调度过程也不做详细介绍,主要是根据nova.conf中配置的策略选择符合条件的主机列表,计算权重,得出最优主机来创建instance; 关于select_destinations的说明:它是根据nova.conf里filter的配置调用filter的select_destinations函数 参考链接 例:_filter_scheduler.py的-->def selectdestinations 然后创建的任务就要需要调用nova compute来完成。
openstack中的rpc调用,都是先通过apcapi.py来接收,再由manager.py里面的具体方法来实现,下面直接看: nova/compute/manager.py
def build_and_run_instance(self, context, instance, utils.spawn_n(_locked_do_build_and_run_instance,
下面两步调用,不做详解:
def _locked_do_build_and_run_instance(*args, **kwargs): def _do_build_and_run_instance(self, context, instance, LOG.debug('Starting instance...', instance=instance) with timeutils.StopWatch() as timer: self._build_and_run_instance(context, instance,
此处开始创建虚机,debug打印启动虚机,设置定时器,然后调用创建方法:
def _build_and_run_instance(self, context, instance, self._build_resources(context, instance, self.driver.spawn(context, instance, image_meta,
此时虚机状态为build,创建资源:资源主要是网络,镜像和卷;然后调用driver创建虚机:openstack中使用的虚拟化driver通常为libvirt,这个在nova.conf中配置,所以下面到virt中看代码如下:
nova/virt/libvirt/driver.py
def spawn(self, context, instance, image_meta, self._create_domain_and_network(
主要工作为创建本地镜像,获取虚机xml文件,最后创建domain 这部分成功返回后,说明虚机已经创建成功处于running状态,
def _create_domain(self, xml=None, domain=None, guest = libvirt_guest.Guest.create(xml, self._host)
继续调用: nova/virt/libvirt/guest.py
def create(cls, xml, host): """Create a new Guest""" guest = host.write_instance_config(xml)
所以资源都已创建好,映射好,现在只需根据xml配置文件创建guest:
def write_instance_config(self, xml): domain = self.get_connection().defineXML(xml)
这里面主要调用的是libvirt提供的接口函数来创建虚拟机,这也是openstack层面的最后一步调用,defineXML(xml)函数是由libvirt中的c语言实现,做的工作也是对xml中的虚机配置进行检查,包括创建使用ovs命令创建真实port等做操,最后将xml中的配置参数转换为qemu命令行参数,由qemu实现真正的创建虚机进程。 claim机制,和资源使用情况有关resource_tracker.py
大体的流程是: nova-api---->nova-conductor---->nova-schedule---->nova-compute---->libvirt-driver nova服务接收到请求后先由上述的server.py处理,创建server:
nova/api/openstack/compute/servers.py
body参数就是http请求发来的参数,这一部分主要是先做权限检查,project_id,user_id,可用域等,然后对body进行解析,flavor,image,network,包括volume等参数提取,主要动作是调用compute对虚机资源进行计算(此处调用compute只是计算资源,并没有创建)。 下面到nova/compute/api.py
该方法对network和可用域做判断,然后继续调用api中的方法,我们来看_create_instance:
主要对虚机资源进行计算,网络,存储,镜像等,最后将计算出的虚机信息参数提交给conductor,由conductor来统一控制调度,创建等流程。
下面两步是调用流程,不做详细介绍,看下调用方法即可。 nova/conductor/api.py
在这一方法中,先调用schedule进行调度来选择主机,调度过程也不做详细介绍,主要是根据nova.conf中配置的策略选择符合条件的主机列表,计算权重,得出最优主机来创建instance; 关于select_destinations的说明:它是根据nova.conf里filter的配置调用filter的select_destinations函数 参考链接 例:_filter_scheduler.py的-->def selectdestinations 然后创建的任务就要需要调用nova compute来完成。
openstack中的rpc调用,都是先通过apcapi.py来接收,再由manager.py里面的具体方法来实现,下面直接看: nova/compute/manager.py
下面两步调用,不做详解:
此处开始创建虚机,debug打印启动虚机,设置定时器,然后调用创建方法:
此时虚机状态为build,创建资源:资源主要是网络,镜像和卷;然后调用driver创建虚机:openstack中使用的虚拟化driver通常为libvirt,这个在nova.conf中配置,所以下面到virt中看代码如下:
nova/virt/libvirt/driver.py
主要工作为创建本地镜像,获取虚机xml文件,最后创建domain 这部分成功返回后,说明虚机已经创建成功处于running状态,
继续调用: nova/virt/libvirt/guest.py
所以资源都已创建好,映射好,现在只需根据xml配置文件创建guest:
这里面主要调用的是libvirt提供的接口函数来创建虚拟机,这也是openstack层面的最后一步调用,defineXML(xml)函数是由libvirt中的c语言实现,做的工作也是对xml中的虚机配置进行检查,包括创建使用ovs命令创建真实port等做操,最后将xml中的配置参数转换为qemu命令行参数,由qemu实现真正的创建虚机进程。 claim机制,和资源使用情况有关resource_tracker.py