from nova to ironic(5)

OpenStack Ironic实现裸机部署 实习将近一个月了,期间不断努力,终于算是把OpenStack Ironic项目实现裸机部署的过程理解了一遍,并在小规模集群上成功实践。整理一些这段时间工作的内容,就算是一个阶段性的小项目总结了。 Ironic Ironic是OpenStack的一个子项目,用于实现在云里像管理虚拟机一样管理裸机。 Ironic在OpenStack中的概念架构图如下 其中Bare Metal就是我们要控制... 阅读详情

前面说到rest进来如何route,创建server的rest: /v2/{tenant_id}/server, POST 方法, 来看看对应在nova.api.openstack.compute.servers.py中的create方法:


1. parse传进来的数据,数据是否合法,是否包含name,server_admin的password是否传入,没有就生成一个, 查看是否有imageRef设置,如果没有,看看是否有

block_device mapping的设置(即boot from volume), check config_drive,extension manager是否load了“os-config-drive”, parse文件注入的内容,parse security_group,parse networks and ipv4, ipv6, 得到flavor id, user_data和availability_zone, 是否check quota等等。。。总之check了pass in的数据;

2. 调用self.compute_api.create(http://blog.youkuaiyun.com/qiuhan0314/article/details/42919143,这个系列还比较通俗)

CELL_TYPE_TO_CLS_NAME = {'api': 'nova.compute.cells_api.ComputeCellsAPI',
                         'compute': 'nova.compute.api.API',
                         None: 'nova.compute.api.API',
                        }
def _get_compute_api_class_name():
    """Returns the name of compute API class."""
    cell_type = nova.cells.opts.get_cell_type()
    return CELL_TYPE_TO_CLS_NAME[cell_type]



def API(*args, **kwargs):#nova.compute.API()
    class_name = _get_compute_api_class_name()
    return importutils.import_object(class_name, *args, **kwargs)

默认情况下,cells是不开启的,因此get_cell_type()返回None,也就是执行nova.comput.api.API,若开启cells,则根据cell type的不同,调用不同的API

 cfg.BoolOpt('enable',
                default=False,
                help='Enable cell functionality'),

3.在创建Server的Controller时有:   _view_builder_class = views_servers.ViewBuilder

对应的用在step 2之后“server = self._view_builder.create(req, instances[0])”

调用_add_location(robj)  , 添加访问当前创建的server的url

4.执行nova.compute.api.API(),有decorator:@hooks.add_hook("create_instance"),不过查看setup.cfg和pkg_resources,没有看到create_instance 的entry_point,

难道还没加吗,先提个疑问。

5. check policy,检查target总action是否允许,可以查看/etc/nova/policy.json就会明白,再检查是否多个instance用同一个fixip或者port,
调用self._create_instance,再次对输入参数进行处理,设置默认值或者parse:

_handle_availability_zone

_validate_and_build_base_options#各种check

_provision_instances#做了三件事_check_num_instances_quota, create_db_entry_for_new_instance,send_update_with_states,通过名字即很容易看出用途

将数据库中状态标为create之后

self.compute_task_api.build_instances#即conductor.ComputeTaskAPI()的build_instance方法,到这里终于从compute-> conductor


6.到了conductor.ComputeTaskAPI后,由于use_local默认是False,因此调用nova.conductor.api.ComputTaskAPI

def ComputeTaskAPI(*args, **kwargs):
    use_local = kwargs.pop('use_local', False)
    if oslo.config.cfg.CONF.conductor.use_local or use_local:
        api = conductor_api.LocalComputeTaskAPI
    else:
        api = conductor_api.ComputeTaskAPI
    return api(*args, **kwargs)

7.nova.conductor.api.ComputeTaskAPI仅仅做了一个forward调用nova.conductor.rpcapi.ComputeTaskAPI,然后将参数和方法rpc.cast出去:

cctxt = self.client.prepare(version=version)
cctxt.cast(context, 'build_instances', **kw)

其中client 连接的target为target = messaging.Target(topic=CONF.conductor.topic, version='2.0'), topic为conductor,namespace为“compute_task”联想到之前讲过compute service启动过程,这里

必然似乎conductor service启动,rpc server端target也是conductor,调用conductor.manager中的nova.conductor.manager.ConductorManager在__init__中:

self.compute_task_mgr = ComputeTaskManager()#trace it
self.cells_rpcapi = cells_rpcapi.CellsAPI()
self.additional_endpoints.append(self.compute_task_mgr)#接收到rpc call也使用addtional_endpoints中的方法处理

8.因此走到nova.conductor.manager.ComputeTaskManager, 在build_instance中:

 hosts = self.scheduler_client.select_destinations(context,request_spec, filter_properties), 我拉的是最新的code,之前看的好像不是这么玩儿的,我们来走一走这个

scheduler_client.select_destinations:

有scheduler_client=nova.scheduler.SchedulerClient, 在SchedulerClient的__initi__中:

 def __init__(self):
        self.queryclient = LazyLoader(importutils.import_class(
            'nova.scheduler.client.query.SchedulerQueryClient'))
        self.reportclient = LazyLoader(importutils.import_class(
            'nova.scheduler.client.report.SchedulerReportClient'))

函数select_destinations调用queryclient.select_destinations, 这个时候就转换到scheduler中了,执行nova.scheduler.rpcapi.SchedulerAPI.select_desitinations()

发送RPC call 被nova.scheduler中的Manager接收处理(涉及到nova-schduler的启动),在SchedulerManager中:

dests = self.driver.select_destinations(context, request_spec,filter_properties),这里的driver就是scheduler的driver, 默认的driver为:

 cfg.StrOpt('scheduler_driver',
               default='nova.scheduler.filter_scheduler.FilterScheduler',
               help='Default driver to use for the scheduler'),

这里可以尝试跟踪一下FilterScheduler的过程,以后会细说这一部分(FileterScheduler中会调用scheduler_host_manager,这个在ironic的配置文件中)


9.scheduler调用结束后给出产生虚机的host dest, 之后调用self.compute_rpcapi.build_and_run_instance, 即:

nova.compute.rpcapi.ComputeAPI.build_and_run_instance,又回到了nova.compute中,这里仅仅做一个RPC调用:

rpcapi_opts = [
    cfg.StrOpt('compute_topic',
               default='compute',
               help='The topic compute nodes listen on'),
]

到nova.compute.manager.ComputeManager.build_and_run_instance,最终要在这里产生虚机:

node = self.driver.get_available_nodes(refresh=True)[0] # 这里的driver就是compute_driver,前面讲ironic配置的时候说过的nova.virt.ironic.IronicDriver,或者默认

时候使用的nova.virt.libvirt.LibVirtDriver,对LibVirtDriver而言就是HyperVisor的HostName(可以trace into):


with self._build_resources(context, instance,
                        requested_networks, security_groups, image,
                        block_device_mapping) as resources:
                    instance.vm_state = vm_states.BUILDING
                    instance.task_state = task_states.SPAWNING
                    instance.save(expected_task_state=
                            task_states.BLOCK_DEVICE_MAPPING)
                    block_device_info = resources['block_device_info']
                    network_info = resources['network_info']
                    instance_type = None
                    if filter_properties is not None:
                        instance_type = filter_properties.get('instance_type')
                    self.driver.spawn(context, instance, image,
                                      injected_files, admin_password,
                                      network_info=network_info,
                                      block_device_info=block_device_info,
                                      instance_type=instance_type)

在LibVirtDriver的spawn中:

_create_image, _get_guest_xml, _create_domain_and_network, 这三个方法均涉及到底层的lib virt调用,都较复杂(以后再说),之后等待虚机启动,

最后在_build_and_run_instance中notify,create结束


不断的conductor,manager,api,scheduler切换,来总结一下梗概顺序:

compute api(controller) -> conductor api -> conductor rpc -> conductor manager -> scheduler rpc -> scheduler manager -> compute rpc -> compute manager


OpenStack实战部署指南:从零搭建云平台,涵盖KVM与Ironic裸机部署 云计算的核心在于通过虚拟化技术将物理资源池化,实现按需分配与自动化管理。其原理是通过软件定义的方式,将计算、存储、网络等基础设施抽象为服务。这一技术价值在于极大提升了资源利用率和运维效率,并帮助用户构建灵活、可扩展的私有云或混合云环境。在众多开源云平台中,OpenStack以其模块化架构和强大的生态成为构建云基础设施的主流选择。对于初学者和运维人员而言,掌握其部署是进入云技术领域的关键一步。本文聚焦于实战,详细解析如何从零开始,利用KVM虚拟化技术完成OpenStack的完整部署,并深入探讨了裸机部署服务I 阅读详情

相关推荐

Security Onion的部署(超详细)

本文介绍了开源入侵检测系统securityonion的部署

qq_72583325的博客 6070

裸金属从卷启动

目录 裸金属从卷启动 裸机信息 Ipxe配置 创建iscsi启动镜像 创建卷 裸金属从卷启动 官网链接:https://docs.openstack.org/ironic/rocky/admin/boot-from-volume.html 裸机信息 设置存储接口 openstack baremetal node set $NODE_UUID --storage-in...

wen328的博客 1148

unity之——解决利用Jenkins在Windows环境下打包unity工程中的场景为apk包,打包打不出来的问题。并且介绍Jenkins从安装到环境配置,调用unity代码的过程(填坑)!!!!!

今天第一次接触Jenkins,比较头疼。网上的Jenkins配置环境相关的资料比较散乱,并且在Windows平台下相关的配置更是少之又少。我在这里讲一下从Jenkins安装到构建工程。打包unity工程的apk包的过程。 1.首先去Jenkins官网下载安装就不说了,安装完成之后在浏览器中输入http://localhost:8080(默认访问地址)进入Jenkins web界面。进行账号的注册...

cgy56191948的博客 2020

OpenStack Ironic裸机项目案例分析:中国移动

OpenStack基金会在2019年4月宣布,Ironic软件正在支持着全世界数百万个计算核心,将裸机变成适合今天虚拟化和容器化混合工作负载的自动化基础设施。超过30个组...

开源云中文社区 375

Revit Dynamo实战:用Excel数据批量生成桥梁模型(附自适应族技巧)

本文详细介绍了如何利用Revit Dynamo结合Excel数据实现桥梁参数化建模,重点讲解了数据驱动建模、自适应族优化及大型项目性能管理三大核心技巧。通过结构化Excel数据、高级自适应族创建和分块处理策略,显著提升桥梁建模效率与设计变更响应能力。

weixin_42520025的博客 387

STM32F103 实例应用(10)——I2C读写24C32

一、应用简介 本文介绍24C32的读写,基于野火的软件I2C程序。 board_i2c.h /**=========================================================================== @file board_i2c.h @brief 本文件是用于I2C驱动 @author 青梅煮久 @version r0.1 @date 2021/01/13 -------------------------.

qq_34118600的博客 3447

ironic pxe

要说ironic可以用来干什么,最简单最接近的一句话,我认为就是装机!当然还有一些其他的功能,从框架上也可以扩展,但目前看起来hardware provision最主要做的事都是 围绕装机做的,给裸机部署操作系统,以后ironic会不会发展成openstack家族里的hardware management不得而知,看HP会怎么发力。 1. rest 入口进来到/node/uuid/provis

dingdingwolf的专栏 2219

TI DSP TMS320F280025 Note1:工程模板Template创建

该方法新建的工程支持寄存器开发,同时也支持库函数开发,新建后移动该工程也不需要重新修改路径,路径使用变量定义,使用方便、移植性能高

weixin_52849254的博客 2302

from nova ironic to horizon(5)

how to make a horizon module of yourself continue...

dingdingwolf的专栏 407

Simulink开发项1000例实战专栏--实例161:基于Simulink实现电动汽车电机驱动系统的建模与仿真

通过上述步骤,我们成功实现了基于Simulink的电动汽车电机驱动系统的建模与仿真。该系统能够全面评估电机驱动系统的性能,验证控制策略的有效性,并通过优化设计提高车辆的动力性和效率。引入智能预测:结合人工智能技术,实现更智能的控制策略。扩展功能:增加对多种电机类型的支持,提升系统通用性。实验验证:将仿真模型应用于实际硬件,进行实验验证,评估其在实际工况下的表现。

xiaoheshang_123的博客 189

R语言单因素被试内ANOVA检验

在R语言中,我们可以使用多种方法进行被试内ANOVA检验,其中包括使用内建函数或使用外部包。我们随机选择了10个被试,并对每个被试使用了三种不同的药物处理。通过上述代码示例,我们可以使用R语言进行单因素被试内ANOVA检验。假设我们的数据存储在一个名为"data"的数据框中,其中包含两个列:一个列是被试的编号,另一个列是生物指标的测量值。在上述代码中,我们创建了一个名为"data"的数据框,其中"Subject"列包含了被试的编号,"Measurement"列包含了生物指标的测量值。参数指定了数据来源。

PixelNovaO的博客 363

Openstack Ironic简介

Openstack 提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、Ironic的作用什么,虚机与裸金属的差别在哪?二、概念1.组件关系图2.具体含义3.裸金属正常工作需要的组件4.逻辑架构 前言 提示: OpenStack是一个开源云计算平台项目,旨在为公共及私有云的建设与管理提供软件的开源实现。当前OpenStack支持VM和BM(Bare-Metal 裸金属服务器)两种上线方式,这里主要说第二种。 一、Ironic的作用什么,虚机与裸金属的差别在哪? Iron

nb_zsy的博客 7811

【Kubernetes】怎么根据pod找到关联的deployment呢

在文章中我们删除pod需要删除deployment,那么怎么根据pod找到关联的deployment呢。

九师兄 505

OpenStack-Ironic裸机部署安装

一,Ironic简述 简而言之,OpenStackIronic就是一个进行裸机部署安装的项目。 所谓裸机,就是指没有配置操作系统的计算机。从裸机到应用还需要进行以下操作: (1)硬盘RAID、分区和格式化; (2)安装操作系统、驱动程序; (3)安装应用程序。 Ironic实现的功能,就是可以很方便的对指定的一台或多台裸机,执行以上一系列的操作。例如部署大数据群集需要同时部署多台物理机,就可以使...

zyfnuaa的专栏 1775

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

云计算-Ironic概念

Ironic结合多个驱动提供一套hypervisor API来操作物理机,类似提供一个hypervisor驱动来供Nova使用。 简介: 简而言之,OpenStackIronic就是一个进行裸机部署安装的项目。 所谓裸机,就是指没有配置操作系统的计算机。从裸机到应用还需要进行以下操作: (1)硬盘RAID、分区和格式化; (2)安装操作系统、驱动程序; (3...

CodeAsWind 1963

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

六、安装Nova服务【VMware虚拟机搭建Openstack+Ironic】

openstack nova安装

weixin_41809577的博客 653

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

【ironic】ironic / neutron / nova 配置文件

[DEFAULT] enabled_network_interfaces=noop,flat,neutron default_network_interface=neutron auth_strategy=keystone enabled_drivers=pxe_ipmitool debug=True [agent] deploy_logs_collect=always [

zhonglinzhang 5103

OpenStack-Ironic裸金属简介

一,Ironic简述 简而言之,OpenStack Ironic就是一个进行裸机部署安装的项目。 所谓裸机,就是指没有配置操作系统的计算机。从裸机到应用还需要进行以下操作: (1)硬盘RAID、分区和格式化; (2)安装操作系统、驱动程序; (3)安装应用程序。 Ironic实现的功能,就是可以很方便的对指定的一台或多台裸机,执行以上一系列的操作。例如部署大数据群集需要同时部署多台物理机,就可以使用Ironic来实现。 Ironic可以实现硬件基础设施资源的快速交付。 二,Why Provision Ba

AiFool的博客 1036

安装与配置ironic

安装及配置 由于Ironic的配置很长,下面我们简短的说一下安装和配置过程,具体的安装配置教程参考官方手动配置教程或者使用devstack安装。 Ironic需要与Nova、Neutron、Glance、Keystone等进行交互,于是先要对这些进行配置。 1.配置KeyStone 首先我们需要在keystone中创建ironic用户、服务、endpoint信息。 keystone us...

迷失的专栏 1465

Tripleo之nova-compute 和Ironic的代码深入分析(四)

tripleo如何使用openstack部署openstack的Juno版本源代码流程分析

Hcloud 2307

OpenStack-ironic research report 调研报告

Background 调研背景 目前Union Pay一个物理装机项目中因考虑项目进度风险和没调研ironic,采用了RackHD进行物理装机。 现将该项目进行产品化,架构师建议调研OpenStack-ironic,以之取代RackHD,这个OpenStack-ironic也备受一些物理机厂商推崇。 Introduction 简介 OpenStack Ironic就是一个进行裸机部署...

Through Da Storm 320

OpenStack的“神秘组件” 裸金属(Ironic)管理使用

揭开OpenStack Ironic神秘的面纱,首先Ironic作为OpenStack一个独立的模块同样可与keystone、nova、neutron、cinder等组件交互,和部署虚拟机的调用流程是一样的,都是通过Nova的接口来执行创建实例,只是底层的nova-scheduler和nova-compute驱动不一样,虚拟机底层驱动采用的是虚拟化技术,而物理机采用的是PXE和IPMI技术。OpenStack是目前全球部署最广泛的开源云基础架构,在OpenStack中提供的裸金属服务的项目是Ironic。

统信软件的博客 2894
上一篇: from nova to ironic(4)
下一篇: from nova to ironic(6)
dingdingwolf
博客等级 码龄16年 7粉丝 94原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值