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执行一系列动作,包括查询已经运行的命令的状态,启动带内清洁任务或将镜像部署到节点。

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

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. Poj(1521),哈夫曼编码

    题目链接:http://poj.org/problem?id=1521 这里,网上有很多博客都有写,很多人没有建树,直接就是求一下这个哈夫曼编码的长度,的确很巧妙,我也用的这个方法,但是,几乎所有博客 ...

  2. AMD、CMD、CommonJs和ES6对比

    一.AMD(异步模块定义) AMD(异步模块定义)是RequireJS在推广过程中对模块定义的规范化产出.AMD是一个概念,RequireJs是对这个概念的实现.比如javascript语言是对ECM ...

  3. SQL基础语句汇总

    连接数据库 1 mysql -h10.20.66.32 -uroot -p123456 -h后面是mysqlServer所在地址,-u后面是用户名,-p后面是密码 查看数据库 1 show datab ...

  4. pod 指令无效

    到了新公司,配置pod,死活找不到pod指令,用了很多方法之后,找到了解决办法 sudo vim .bash_profile 然后添加 export PATH=/usr/local/bin:$PATH ...

  5. 通过tomcat配置访问本机资源

    背景:在最近的项目中使用海康威视的摄像机,在项目预算中没有购买对应的硬盘录像机,但是由于客户需要能够进行视频的回放功能,所以直接采用了海康提供的视频管理客户端直接进行视频录像,然后保存在本机进行播放. ...

  6. 复用传统C/S架构系统,升级成‘伪’B/S架构设计

    应用场景:已经部署了传统系统又想要移动方式的场景.安全性考虑要求高的场景(核心资源要求在企业内部的场景). 我们 做了如下的系统设计: 核心是我们利用了WS做了内外穿透的设计.

  7. Ajax上传文件/照片时报错TypeError :Illegal invocation

    问题 Ajax上传文件/照片时报错TypeError :Illegal invocation 解决 网上搜索问题,错误原因可能有以下几个,依次检查: 请求类型有误,如post请求,但在后台设置的是ge ...

  8. 连接mysql 报错 Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)

    网上找不到  朋友说是因为非正常关机导致,mysql.server start 运行报错 ERROR! The server quit without updating PID file(): 解决办 ...

  9. Python常用函数记录

    Python常用函数/方法记录 一. Python的random模块: 导入模块: import random 1. random()方法: 如上如可知该函数返回一个[0,1)(左闭右开)的一个随机的 ...

  10. hive 学习系列一(数据类型的定义)

    数字类型(Numeric Types) 整型 TINYINT(取值范围:-128 -- 127) SMALLINT(取值范围:-32,768 to 32,767) INT/INTEGER(取值范围: ...