博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
nova创建虚机流程源码分析 openstack
阅读量:4195 次
发布时间:2019-05-26

本文共 3227 字,大约阅读时间需要 10 分钟。

    今天跟大家分享openstack中利用nova创建虚机时的源码流程,以便更好的理解openstack云平台实现,也有助于故障定位。

    创建虚机方式有两种,一种是通过dashboard云管理平台创建,一种是nova命令行方式创建。现在各云计算公司都有自己的云平台界面,而openstack原生云管理平台是Horizon实现的Dashboard。

    Dashboard直接调用nova提供的API接口来创建虚机,nova命令行方式也是通过novaclient将命令行参数转化为标准的http请求到nova API,所以分析创建虚机的流程首先从nova API接收请求开始。
    nova服务接收到请求后先由上述的server.py处理,创建server:
nova/api/openstack/compute/servers.py

def create(self, req, body):    """Creates a new server for a given user."""    (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;然后创建的任务就要需要调用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实现真正的创建虚机进程。

    根据本文的流程分析,由云管理平台发起,到最后虚拟化的完成,可以清楚的梳理在整个openstack云环境下各个层面的角色和作用,可以加深对云计算的理解。


小笨驴在吃草的时候创建了微信公众号,为方便更多觅食的“小笨驴”,为大家准备了大量的免费基础教学资料以及技术解决方案,还会定时发布一些好的技术文章,当然也会扯扯蛋、谈谈人生、呵呵,希望我们这群乐于分享技术的“小笨驴”团队越来越大!(技术干货分享群qq:128015753)

这里写图片描述

你可能感兴趣的文章
pyqt实现界面化编程
查看>>
qt写DLL文件并调用和出现的问题分析
查看>>
工厂模式(Factory)-设计模式(一)
查看>>
建造者模式(Builder)-设计模式(三)
查看>>
初学Java必备基础知识,编程领域你需要掌握的关键点!
查看>>
阿里五年Java程序员的总结,献给还在迷茫中的你!
查看>>
程序员身上有异味,同事为什么都不会直接告诉他?
查看>>
Java、C、C+ +、PHP、Python分别用来开发什么?一篇文章告诉你!
查看>>
Linux-SHELL常用命令
查看>>
Linux-网络运维基础
查看>>
Verilog编程网站学习——门电路、组合电路、时序电路
查看>>
android——学生信息显示和添加
查看>>
Android——ImageSwitcher轮流显示动画
查看>>
Android——利用手机端的文件存储和SQLite实现一个拍照图片管理系统
查看>>
图像调优1:清晰度相关参数MTF,SFR,MTF50,MTF50P 以及TVL的概念以及换算说明
查看>>
图像调优3: CCM参数的标定
查看>>
最长回文子串(Go,LeetCode)
查看>>
奏响春的序曲,「武汉的春天」让人泪目
查看>>
“抢菜大战”背后:生鲜电商的突击大考
查看>>
骁龙865+65W闪充!realme 真我X50 Pro 5G正式全球发布
查看>>