IPA使用lookup和hearteat机制与Ironic Conductor进行交互,启动时agent给Conductor的vendor_passthru lookup endpoint(地址为/v1/drivers/{driver}/vendor_passthru/lookup)发送一个硬件的profile,
然后Ironic就可以得出该节点的uuid,在成功发现该节点之后,agent隔N秒发送心跳包给Conductor(hearteat地址为/v1/nodes/{node_ident}/vendor_passthru/heartbeat ),conductor执行一系列动作,包括查询已经运行的命令的状态,启动带内清洁任务或将镜像部署到节点。

#主函数入口,定义了IronicPythonAgent类的对象, 初始化它,并调用该对象的run()函数.
#机器上电后,ramdisk在内存中执行,然后启动IPA,入口为cmd.agent.run(),
#然后调用ironic-python-agent.agent.run(),其代码如下: def run(self):
"""Run the Ironic Python Agent."""
# Get the UUID so we can heartbeat to Ironic. Raises LookupNodeError
# if there is an issue (uncaught, restart agent)
self.started_at = _time()
#运行ipa,获取node的uuid,发送心跳包
# Cached hw managers at runtime, not load time. See bug 1490008.
hardware.load_managers()
#调用hardwarre.load_managers加载硬件到缓存,以优先级顺序获取硬件管理器的列表。
# Operator-settable delay before hardware actually comes up.
# Helps with slow RAID drivers - see bug 1582797.
if self.hardware_initialization_delay > 0:
LOG.info('Waiting %d seconds before proceeding',
self.hardware_initialization_delay)
time.sleep(self.hardware_initialization_delay)
#该函数中会判断是否为standalone模式启动,如果不是,则会向ironic-api查询当前节点的信息,比如uuid等:
if not self.standalone:
# Inspection should be started before call to lookup, otherwise
# lookup will fail due to unknown MAC.
uuid = None
if cfg.CONF.inspection_callback_url:
uuid = inspector.inspect()
#利用Ironic API给Condutor发送lookup()请求,用户获取UUID,相当于自发现
if self.api_url:
self._wait_for_interface()
#此处会调取ironic_python_agent.agent._wait_for_interface函数,
#通过ironic_python_agent.hardware.dispatch_to_managers获取网卡信息
content = self.api_client.lookup_node(
#调用到ironic_python_agent.ironic_api_client.lookup_node的_do_lookup(),
#然后发送一个GET /{api_version}/drivers/{driver}/vendor_passthru/lookup请求。
#Condutor API在接受到lookup请求后调用指定驱动的lookup函数处理,返回节点UUID。 hardware_info=hardware.dispatch_to_managers(
'list_hardware_info'),
#调取ironic_python_agent.hardware.dispatch_to_managers获取硬件信息列表
timeout=self.lookup_timeout,
starting_interval=self.lookup_interval,
node_uuid=uuid) LOG.debug('Received lookup results: %s', content)
self.node = content['node']
LOG.info('Lookup succeeded, node UUID is %s',
self.node['uuid'])
hardware.cache_node(self.node)
self.heartbeat_timeout = content['config']['heartbeat_timeout'] # Update config with values from Ironic
config = content.get('config', {})
if config.get('metrics'):
for opt, val in config.items():
setattr(cfg.CONF.metrics, opt, val)
if config.get('metrics_statsd'):
for opt, val in config.items():
setattr(cfg.CONF.metrics_statsd, opt, val)
elif cfg.CONF.inspection_callback_url:
LOG.info('No ipa-api-url configured, Heartbeat and lookup '
'skipped for inspector.')
else:
LOG.error('Neither ipa-api-url nor inspection_callback_url'
'found, please check your pxe append parameters.') self.serve_ipa_api()#调取ironic_python_agent.agent.serve_ipa_api,创建一个wsgi的server服务对象,发送心跳包 if not self.standalone and self.api_url:
self.heartbeater.stop()
#部署完成后停止心跳包

ipa和ironic-conductor交互的更多相关文章

  1. 注册 Ironic 裸金属节点并部署裸金属实例

    目录 文章目录 目录 前文列表 注册(Enrollment)裸机 创建裸金属实例的 Flavor 部署裸金属实例 日志分析 问题:Failed to create neutron ports for ...

  2. 手动集成 Ironic 裸金属管理服务(Rocky)

    目录 文章目录 目录 前文列表 横向扩展裸金属管理服务节点 配置基础设施 安装 Ironic(BareMetal) 安装 Nova Compute(BareMetal) 配置 Neutron 提供 P ...

  3. ironic-conductor与ipa交互clean部分代码分析

    clean的动作会在provide和delete阶段才会触发 从代码分析: 对节点执行的node provide/deleted/clean会先发送到ironicclient ironicclient ...

  4. 理解裸机部署过程ironic

    部署物理机跟部署虚拟机的概念在nova来看是一样,都是nova通过创建虚拟机的方式来触发,只是底层nova-scheduler和nova-compute的驱动不一样.虚拟机的底层驱动采用的libvir ...

  5. 剖析ironic

    关键技术 在安装操作系统时需要存储介质来存储系统镜像.需要控制物理机开关机,在网络部署环境中还需要预启动环境. PXE (预启动环境) IPMI(电源管理) iSCSI(存储) 什么是PXE PXE( ...

  6. ironic baremetal rescue process

    1.用户调用Nova的rescue函数 nova/virt/ironic/driver.py class IronicDriver(virt_driver.ComputeDriver): ...... ...

  7. 【ironic】ironic介绍与原理

    [ironic]ironic介绍与原理 零,配置文件 0.1 配置驱动 文件ironic.conf, ipmi硬件类型,默认值也是ipmi, pxe_ipmitool驱动也是默认值,配置驱动 [DEF ...

  8. Ironic 裸金属实例的部署流程

    目录 文章目录 目录 逻辑架构 部署架构 前提条件 部署流程 iSCSI Deploy UML PXE Deploy Driver Direct Deploy UML IPA Deploy Drive ...

  9. Ironic 裸金属管理服务

    目录 文章目录 目录 Ironic 软件架构设计 资源模型设计 全生命周期的状态机设计 Inspection 裸金属上架自检阶段 Provision 裸金属部署阶段 Clean 裸金属回收阶段 快速体 ...

随机推荐

  1. CentOS下用rinetd做端口转发

    windows下的端口转发一般用的是自带的nat和porttunnel.portmap linux下端口转发映射的程序叫rinetd,启动方法rinetd -c /etc/rinetd.conf  , ...

  2. eclipse 插件relo使用

    1. eclipse插件安装 在线安装地址:http://relo.csail.mit.edu/update 本地配置,文件下载:http://download.csdn.net/download/s ...

  3. 带有data-ng-bind表达式

    <!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...

  4. iOS App 瘦身方案

    缩减iOS安装包大小是很多中大型APP都要做的事,一般首先会对资源文件下手,压缩图片/音频,去除不必要的资源.这些资源优化做完后,我们还可以尝试对可执行文件进行瘦身,项目越大,可执行文件占用的体积越大 ...

  5. java.lang.UnsupportedOperationException: Exception occurred during processing request: null

    1.Action有问题,Struts2注解拼写错误,注解包版本不匹配! 2.今天还有一个错误,Tomcat服务器异常,无法启动,Remove/clean后还是无法启动 :极大可能是web.xml 写错 ...

  6. 生产者消费者-Java代码实现

    import java.util.LinkedList; class Storage{ private static final int MAX = 100; LinkedList<Object ...

  7. laravel 安装excel扩展

    1,使用Composer安装依赖 在Laravel项目根目录下使用Composer安装依赖: composer require maatwebsite/excel ~2.1 ps:一定要加上~2.1! ...

  8. php 利用composer引用第三方类库构建项目

    经常看到各种开源库推荐使用 composer 安装代码,却总是看不懂怎么用composer, 这几天静下心来学习了composer的使用,发现这可真是一个好东西,先贴上一个讲的很棒的视频教程: PHP ...

  9. swoole中swoole_timer_tick回调函数使用对象方法

    swoole_timer_tick的回调函数无法使用类似于array($this, 'method')来调用对象方法,所以我用一下方法变通了一下来调用 swoole_timer_tick(1000, ...

  10. 第一章 UNIX 基础知识

    1.1 Unix体系结构 OS定义为一种软件,它控制计算机硬件资源,提供程序运行环境,一般称其为内核(kernel),它体积小,位于环境中心. 内核的接口为系统调用(system call),共用函数 ...