OpenStack源码阅读-创建虚拟机(三)

本文深入探讨了OpenStack创建虚拟机的源码流程,从nova API接收到请求开始,详细解析了参数检查、调度、实例创建及启动过程,涉及compute_api、schedule_and_build_instances、rpc通信等关键步骤,最终在libvirt驱动中调用spawn方法启动虚拟机。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文为扶艾原创文章,版权所有,禁止转载!

请大家静下心来看源码分析的文章,看完后相信你会有收获的!

本文来自于微信公众号“扶艾”,欢迎大家关注获取更多精彩内容!

上一篇文章我们分析了nova api是如何接收请求的,这篇文章我们将分析接收到请求之后创建虚拟机的流程。

nova api请求接收到请求之后,是执行的路径1的create方法。这个整合了创建虚拟机的用到的参数,并作了简单的合法性检测。之后调用了self.compute_api.create()方法。这里省略了很多异常处理,也就是说在后面调用中也会有很多的合法性检测,包括镜像不可用、虚拟机模版未找到、模版配置与镜像不符合等等这些都会抛出异常。

路径1. /usr/lib/python2.7/site-packages/nova/api/openstack/compute/servers.py

部分源码:

from nova import compute

class ServerController():

    def __init__(self):
        self.compute_api = comptute.API()

    def create(self, req, body):
        ...
        #获取创建虚拟机的参数
        server_dict = body['server']
        #获取参数中的虚拟机管理员密码,如果没有则生成一个随机密码
        password = self._get_server_admin_password(server_dict)
        #获取参数中的虚拟机名称,去除名称中的前后空格
        name = common.normalize_name(server_dict['name'])
        ...
        #初始化一个字典用于存放创建虚拟机需要到参数
        create_kwargs = {}
        #将server_dict中的部分参数做合法性检测后赋值给create_kwargs
        self._create_by_func_list(server_dict, create_kwargs, body)
        ...
        try:
            (instances, resv_id) = self.compute_api.create(context,
                            inst_type,
                            image_uuid,
                            display_name=name,
                            display_description=description,
                            availability_zone=availability_zone,
                            forced_host=host, forced_node=node,
                            metadata=server_dict.get('metadata', {}),
                            admin_password=password,
                            requested_networks=requested_networks,
                            check_server_group_quota=True,
                            supports_multiattach=supports_multiattach,
                            **create_kwargs)
        except ...

            raise
        ...省略各种except

路径1中最后调用的是self.compute_api.create()方法,self.compute_api是在ServerController的init方法中赋值的compute.API()。根据下面路径2的源码可以发现,这里的compute.API()为nova.compute.api.API类,所以self.comput_api.create()方法即是nova.compute.api.API.create()

路径2. /usr/lib/python2.7/site-packages/nova/compute/__init__.py

部分源码:
def API():
    #这里根据配置文件的设置来确定是否导入cell_api,默认导入nova.compute.api.API
    class_name = _get_compute_api_class_name()
    return importutils.import_object(class_name, *args, **kwargs) 

在路径3的create方法中检测可用域是否可用,构建了一个筛选计算节点需要满足的基本条件组成的字典,然后调用了self._create_instance()方法

路径3. /usr/lib/python2.7/site-packages/nova/compute/api.py

部分源码
from nova import conductor
class API():

    def __init__():
        self.compute_task_api = conductor.ComputeTaskAPI()

    def create(self, context, instance_type,
               image_href, kernel_id=
OpenStack是一个开源的云计算平台,可以用于构建和管理公共云和私有云环境。在OpenStack创建虚拟机源码解析主要涉及以下几个方面: 1. Nova组件:Nova是OpenStack的计算模块,负责管理和调度虚拟机实例。在创建虚拟机时,首先通过Nova API接口向Nova服务发送创建虚拟机的请求。源码中涉及了虚拟机规格、镜像选项、网络配置等参数的解析和处理。 2. Glance组件:Glance是OpenStack的映像服务,用于提供虚拟机镜像。在创建虚拟机时,需要从Glance中选择合适的镜像作为虚拟机的基础环境。源码中通过Glance API接口获取镜像的元数据信息,包括名称、版本、大小、格式等,然后根据需要将镜像下载或者复制到计算节点上。 3. Neutron组件:Neutron是OpenStack的网络服务,负责虚拟机的网络连接和管理。在创建虚拟机时,需要为虚拟机分配IP地址、配置路由和安全组等网络设置。源码中通过Neutron API接口获取网络的信息,并将虚拟机的网络配置与物理网络进行关联。 4. Cinder组件:Cinder是OpenStack的块存储服务,可以为虚拟机提供持久性存储。在创建虚拟机时,可以选择并挂载Cinder卷作为虚拟机的硬盘。源码中通过Cinder API接口获取存储的信息,并将卷与虚拟机进行关联和挂载。 通过以上的源码解析,可以了解到OpenStack创建虚拟机时,涉及了多个组件的协同工作,包括计算、映像、网络和存储等方面。在实际使用中,可以根据需求和实际情况进行定制和扩展,以满足个性化的虚拟机创建需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值