from nova to ironic(6)

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

在ironic的配置文档里,我们需要配置nova,这样可以provision一个physical的HW就像provision一个虚机一样,nova中做ironic的配置为:

[default]
compute_driver=nova.virt.ironic.IronicDriver
firewall_driver=nova.virt.firewall.NoopFirewallDriver
scheduler_host_manager=nova.scheduler.ironic_host_manager.IronicHostManager
ram_allocation_ratio=1.0
reserved_host_memory_mb=0
compute_manager=ironic.nova.compute.manager.ClusteredComputeManager

firewall_driver并非ironic独有的,ram_allocation_ratio和reserved_host_memory_mb只是作为filter中的参数,还有其他的可以配置,至于IronicDriver用来实际provision物理

机,IronicHostManager用来调度available的物理机,ClusteredComputeManager可以看一下源码基本上复用了nova中的ComputeManager, 参照Ironic的文档,不同于普通

虚机的地方有:

1. 需要手动将node的信息输入DB(实际上如此,用户当然不能直接操作db),包括driver info,instance info, properties等,

2. ironic中network为Flat,且目前只支持Flat(https://software.intel.com/en-us/articles/physical-server-provisioning-with-openstack讲了原因,在neutron时候再说这个)

3. ironic配置中设置的flavor和target node 本身是一致的,即step1中传入的node的cpu,memory等和flavor定义的一致,我认为node传入的info <= 实际HW的真实参数即可

从conductor_manager开始:

hosts = self.scheduler_client.select_destinations(context, request_spec, filter_properties)

向上trace,看看request_spec和fileter_properties分别是什么, 一直trace到nova.compute.api中:

if image_href:
      image_id, boot_meta = self._get_image(context, image_href)
else:
      image_id = None
      boot_meta = self._get_bdm_image_metadata(context, block_device_mapping, legacy_bdm)

如果是image_href,则是glance image-show id的结果:

root@controller:~# glance image-show ad811205-d62a-43ab-bae0-28e4000edeb1
+------------------+--------------------------------------+
| Property         | Value                                |
+------------------+--------------------------------------+
| checksum         | 64d7c1cd2b6f60c92c14662941cb7913     |
| container_format | bare                                 |
| created_at       | 2014-07-17T13:51:33                  |
| deleted          | False                                |
| disk_format      | qcow2                                |
| id               | ad811205-d62a-43ab-bae0-28e4000edeb1 |
| is_public        | True                                 |
| min_disk         | 0                                    |
| min_ram          | 0                                    |
| name             | myos                                 |
| owner            | 70402632bd944179a2d44474d5b96fb7     |
| protected        | False                                |
| size             | 13167616                             |
| status           | active                               |
| updated_at       | 2014-07-17T13:51:33                  |
+------------------+--------------------------------------+

如果image_href is None, 则,boot_meta = self._get_bdm_image_metadata(context, block_device_mapping, legacy_bdm),其中block_device_mapping大致像:

"block_device_mapping_v2": [
            {
                "device_name": "/dev/sdb1",
                "source_type": "blank",
                "destination_type": "local",
                "delete_on_termination": "True",
                "guest_format": "swap",
                "boot_index": "-1"
            },
            {
                "device_name": "/dev/sda1",
                "source_type": "volume",
                "destination_type": "volume",
                "uuid": "fake-volume-id-1",
                "boot_index": "0"
            }
        ]

还有别的属性比如image id, volume id等,从中获取boot_meta,也是根据image_id从glance得到并添加一些属性


 filter_properties = self._build_filter_properties(context,scheduler_hints, forced_host,forced_node, instance_type,base_options.get('pci_requests'))

forced_host 和forced_node来自handle_az(context,availability_zone),由available_zone指定

base_options.get('pci_requests'),数据看起来像:

pci_requests = [{'count':2, 'specs': [{'vendor_id':'8086','device_id':'1502'}], 'alias_name': 'alias_1'}]

pci  device 所需信息。。。

而filter_properties就是上面这些信息得一个综合的dict,包括scheduler_hints, forced_host, forced_node, instance_type, pci_requests


还有一个instances此处也记下,经常出现

instances = self._provision_instances(context, instance_type,min_count, max_count, base_options, boot_meta, security_groups,
                block_device_mapping, shutdown_terminate, instance_group, check_server_group_quota)

要启动n个instance,则根据在DB中initial这些instance并填充objects.Instance属性:

fields = {
        'id': fields.IntegerField(),

        'user_id': fields.StringField(nullable=True),
        'project_id': fields.StringField(nullable=True),

        'image_ref': fields.StringField(nullable=True),
        'kernel_id': fields.StringField(nullable=True),
        'ramdisk_id': fields.StringField(nullable=True),
        'hostname': fields.StringField(nullable=True),
       ......去nova.objects.Instance.py中查看,属性很多,也可以自己添加
        }

然后我们看select_destinations方法,三个参数context,request_spec, filter_properties

request_spec = scheduler_utils.build_request_spec(context, image,  instances)#将image和instance信息放在一起, filter_properties前面讲过, 通过scheduler的rpc

call到scheduler manager:

selected_hosts = self._schedule(context, request_spec,filter_properties),这里使用了host_manager即前面提到的nova.scheduler.ironic_host_manager.IronicHostManager

1.hosts= self.host_manager.get_all_host_states(context)

mysql进入openstack的database,使用tee命令将输出重定向到文件,便于查看输出(表很长,取一部分):

+-------+-----------+----------+------------+----------------+---------------+-----------------+

| vcpus | memory_mb | local_gb | vcpus_used | memory_mb_used | local_gb_used | hypervisor_type |

+-------+-----------+----------+------------+----------------+---------------+-----------------+

|    32 |    128744 |       49 |          0 |            512 |             0 | QEMU            |

|     0 |         0 |        0 |          0 |              0 |             0 | ironic          |
|     0 |         0 |        0 |          0 |              0 |             0 | ironic          |
。。。。

在IronicHostManager中重载了方法:host_state_cls

if compute and compute.get('cpu_info') == 'baremetal cpu':
            return IronicNodeState(host, node, **kwargs)

调用重载的update_from_compute_node方法,得到cpu,disk,hypervisor,states({例如"cpu_arch": "i686", "boot_mode": "uefi"})的信息赋予hosts

然后根据hosts信息和前面提到的filter_properties过滤,剩下的节点随机选择一个

hosts = self.host_manager.get_filtered_hosts(hosts,
                    filter_properties, index=num)

weighed_hosts = self.host_manager.get_weighed_hosts(hosts,
                    filter_properties)

hosen_host = random.choice(
                weighed_hosts[0:scheduler_host_subset_size])

根据配置的Filter或者默认的Conf中指定的filter进行过滤,各个不同的filter等涉及的也比较多


Ironic 裸金属实例的部署流程 目录 文章目录目录 阅读详情

相关推荐

Ironic 的 Rescue 救援模式实现流程

目录 文章目录目录救援模式实现 UML 图 救援模式 以往只有虚拟机支持救援模式,裸机是不支持的。直到 Queen 版本 Ironic 实现了这个功能。救援模式下,用户可以完成修复、Troubleshooting 裸机节点的错误配置,修改密码等工作,将裸机设置为救援模式时可以传入 rescue_password 参数。 实现 UML 图 用户调用 Nova 的 Rescue API; Nova...

烟云的计算 2495

OpenStack-Pike版Ironic安装指导分析-(上)

基于OpenStack官网指导,结合实际中的应用,予以总结。整体结构:Bare Metal service overview 裸金属服务概况Install and configure the Bare Metal service 安装配置裸金属服务Install and configure for Red Hat Enterprise Linux and CentOS 红帽7/CentOS7环境下...

wuyongpeng的专栏 4631

Ironic 裸金属管理服务

目录 文章目录目录Ironic -- Bare Metal Provisioning应用场景部署方式架构设计底层实现支撑PXE & iPXEIPMI使用 Devstack 快速体验 Ironic上层资源模型参考文章 Ironic – Bare Metal Provisioning Ironic is an OpenStack project which provisions bare m...

烟云的计算 7096

ironic setup(2)

配置ironic到使用 ironic node-create -d pxe_ipmitool的时候总是无法成功,报错为: HTTPResponse instance has no attribute 'text' 视图查看ironic的日志,在/var/log/ 下竟然没有ironic的目录,因此修改ironic的配置文件 /etc/ironic/ironic.conf 在default下

dingdingwolf的专栏 890

一文搞懂【Linux 搭建 Dread Hunger 服务器】附本体及Docker部署集群方案

看直播发现了五花八门的开服器和版本,一时兴起按官方文档进行了搭建尝试,所以我的版本基于官方Stream2024.01.10更新的版本,也就是停服时的玩法,应该可以根据mod和补丁魔改成更那些开服器一样的版本,本文不做谈论,注重服务器搭建,毕竟8个人不可能在一个局域网里乱象:首先,我看了大量教程视频,一类是开服器的推广,另一类自建的基本采用Windows搭建,我觉得最离谱的是大部分教程都会教你买一台远程Windows虚拟机???

LHmine的博客 3987

关于爱思唯尔官方Latex模版参考文献不是按照引用顺序编号,乱序问题

接下来使用工具打开cas-model2-names.bst文件,全词匹配搜索。其他期刊的模版也是一样的操作,把规定序号的规则的。爱思唯尔给的Latex模版大概文件结构如此。发现是按照第一作者的姓氏的大写字母排序。命令行给注释掉,小写的sort可别注释。

weixin_42748439的博客 5112

openstack bdm基础

在代码中,文档中,接口中经常看见bdm或者block_device_mapping,直译就是块设备映射? 但它到底是什么东东?有没有一直心存困惑? 让我们来一探究竟。 块设备 指对其信息的存取以“块”为单位,如通常的光盘、硬磁盘、软磁盘、磁带等 本人机器上块设备信息如下: Nova服务创建的虚拟机,如何为其指派块设备? 猜的没错,可以通过块设备映射。 把原有的一些东东(比如ci

xiefp的专栏 5793

树莓派4B系统安装及SSH远程控制(简单易操作)

​自从2022年4月树莓派官网更新了RaspberryPiImager版本v1.7.2后,便不再支持自行建立ssh文件,并用默认用户名pi和密码raspberry的方式进行远程控制(亲测不行,输密码时一直access denied)。但是该版本软件提供了烧录系统前设置ssh用户及密码功能。本文记录了系统安装和SSH远程操作步骤。........................

机械人的代码路 5790

from nova ironic to horizon(6)

假使我们不希望使用horizon,当然了,作为一个Django项目,horizon在对openstack的操作上其实只能算是不错,如果你要实现自己的portal,当然可以,如果你希望 给别人看,希望很快的做出来,同时完完全全是自己的风格,或者干脆你比较熟悉java,不熟悉python,怎么快速的弄起来呢,我mark一下自己的想法: 不错,java dynamic web project

dingdingwolf的专栏 435

【论文泛读|附源码】如何进行动力学重构? 神经网络自动编码器结合SINDy发现数据背后蕴含的方程

这一篇文章叫做 **数据驱动**的**坐标发现与方程发现算法**。想回答的问题很简单,就是根据数据写方程。 想想牛顿的处境,如何根据各种不同物体下落的数据,写出万有引力的数学公式的。这篇文章就是来做这件事的。当然,这篇论文并没有从牛顿视角,完全去思考牛顿所想。而是利用现有的**深度学习技术** 和 **动力学重构的方法** 。提出了一种框架,基于现有的计算机技术,去发现物质运动背后的物理规律。 这里直接给出这篇方法的核心思路图,我们后面会逐个讲解。

qq5q13638的博客 2456

如何判断一个程序员的技术比你强?

技术大佬与普通程序员之间存在明显的认知差异:前者善于将复杂问题抽象为经典计算机科学问题,用声明式代码替代过程式逻辑;对异常和边界条件极度敏感,具备系统化的排查方法论;代码追求高可读性而非炫技,且执着于底层原理研究。这种技术压制体现在解决问题的确定性上——通过扎实的理论功底和工程直觉,快速定位问题本质,而非依赖试错或搜索。真正的技术实力源于对底层逻辑的深刻理解和对系统稳定性的敬畏。

wldtzzming的专栏 1088

ironic+nova详解

ironic+nova详解 说明: Openstack 的安装步骤省略,按照社区的文档即可搭建出一套相对稳定的使用环境.本文档基于Newton版本. 假设现在已经有一套可用的Newton环境, 以下的操作均在环境安装完成后进行. 在ironic安装配置过程中, 社区文档Nova和ironic 结合时的配置部分有一个错误, https://docs.openstack.org/proj...

weixin_30639719的博客 486

高温环境下(100℃以上)相机的几种保障方案

高温环境下相机保障措施摘要:针对120℃以上高温环境,相机需采取多重防护:1.散热设计采用金属机身、散热鳍片或风扇;2.关键部件选用耐高温材料(铝合金、特种玻璃);3.电子元件需军规级芯片并做三防处理;4.建议外接电源或耐高温电池。工业相机(如FLIR A655sc、Basler ace)及特种机型(Ximea xiQ)具备高温适应性,普通相机可加装隔热套件配合冷却系统。选择时需关注传感器信噪比和全局快门性能,并设置温度监控保护机制。注意高温会加速设备老化,需定期检测维护。(149字)

start_up_go的博客 1586

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

我们大家都知道部署物理机跟部署虚拟机的概念在nova来看是一样,都是nova通过创建虚拟机的方式来触发,只是底层nova-scheduler和nova-compute的驱动不一样。虚拟机的底层驱动采用的libvirt的虚拟化技术,而物理机是采用PXE+IPMItool的方式,

Hcloud 3845

C++之2048小游戏 第二期

游戏会有初始化、绘制界面、处理输入、更新游戏状态、判断胜负等部分。所以,可能需要一个二维数组来表示4x4的网格,存储每个格子的数值。然后,需要处理键盘输入,尤其是方向键的控制,这可能需要使用EasyX的键盘事件处理函数。然后,关于图形绘制部分,每个格子的大小、颜色、数字的显示都需要设计。不同的数字对应不同的颜色,比如2是浅色,4稍深,以此类推。可能需要一个函数根据数字的值返回对应的颜色,然后在绘制时调用。接下来,处理数字的移动和合并逻辑。这是比较复杂的部分。

Lucky_Glory的博客 805

Claude Code 处理长任务 + Cursor 专注交互:双栈协作的 3 种分工场景与响应提速 35% 实测

揭示 Claude Code 与 Cursor 在 AI 编程中的本质分工:Claude Code 作为离线式架构师处理跨文件、带约束的长链路重构(如单体拆微服务),Cursor 作为现场交互工程师专注秒级局部编辑;提出按任务切片动态切换的三种工程化协作场景,并给出结构化上下文构建、约束型 Prom

weixin_28728443的博客 123

from nova to ironic

在ironic的文档中,我们可以看到: compute_driver=nova.virt.ironic.IronicDriver compute_dirver是用来最终生成目标机的东西,这里说目标机是因为可能是虚机也可能是物理机,生成虚机有一般nova所用的libvirt,也有hyperv,xe

dingdingwolf的专栏 678

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Openstack Ironic简介

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

nb_zsy的博客 7811

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

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

ironic处理nova-compute的安装部署请求,带你一起查看ironic的源代码分析

Hcloud 2707

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

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

声明: 本博客欢迎转载,但请保留原作者信息! 作者:姜飞 团队:华为杭州OpenStack团队 物理单板在PXE的init启动时候,deploy-ironic发送了一个POST v1/nodes/{node-id}/vendor_passthru/pass_deploy_info请求到ironic-api,数据data是: DATA='{"address"

Hcloud 2326

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

ironic处理nova-compute的安装部署请求,带你一起查看ironic的源代码分析

Hcloud 3656

OpenStack-Ironic裸机部署安装

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

zyfnuaa的专栏 1775

from nova to ironic(7)

前面说到ironic配置中和nova打交道的地方在哪里,从nova create一个hardware的instance其实改动的只是nova的几个manager和driver而已,在scheduler进行 filter的时候,从DB的ComputeNode中拿出信息就可以知道当前使用的是什么类型的hypervisor, cpu info 等,那么这些信息是怎么进到ComputeNode中的呢,不

dingdingwolf的专栏 384

云计算-Ironic概念

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

CodeAsWind 1963

Centos-openstack-Rocky-ironic部署

Ironic基础环境配置 创建数据库 mysql -u root -p CREATE DATABASE ironic CHARACTER SET utf8; GRANT ALL PRIVILEGES ON ironic.* TO 'ironic'@'localhost' IDENTIFIED BY '123456'; GRANT ALL PRIVILEGES ON ironic.* TO...

wen328的博客 1722

OpenStack Ironic 深度指南

OpenStack Ironic 是一个管理裸金属服务器(不运行虚拟化层)的服务。它允许用户通过云接口来部署操作系统到物理硬件上,支持自动化配置网络、存储以及其它必要的驱动程序。Ironic 提供了一种可扩展的方法来处理各种类型的硬件,使得云环境中的裸金属资源能够像虚拟机一样被管理和分配。 ## 2. 项目快速启动 ### 安装依赖 首先,确保你的系统满足基本的 OpenStack 软件包要

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

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值