Introduction 简介

OpenStack Ironic就是一个进行裸机部署安装的项目。

所谓裸机,就是指没有配置操作系统的计算机。

从裸机到应用还需要进行以下操作:  

(1)硬盘RAID、分区和格式化;  

(2)安装操作系统、驱动程序;  

(3)安装应用程序。  Ironic实现的功能,就是可以很方便的对指定的一台或多台裸机,执行以上一系列的操作。

例如部署大数据集群需要同时部署多台物理机,就可以使用Ironic来实现。  Ironic可以实现硬件基础设施资源的快速交付。

如今Openstack在虚拟化管理部分已经很成熟了, 通过nova我们可以创建虚拟机、枚举虚拟设备、管理电源状态、安装操作系统等。但是有时候虚拟机无法满足要求,比如以下几种情况需要直使用物理机:

高性能的计算集群。

计算任务需要访问无法虚拟化的硬件设备。

数据库主机(有些数据库在hypervisor中运行效率很差)。

单租户、专用硬件、安全性、可靠性和其他控制要求。

快速部署云基础设施。

但是在物理机管理上一直没有成熟的解决方案。在这样的背景下Ironic(Bare- Metal Provisioning)诞生了,它可以解决物理机的添加,删除,电源管理和安装部署。Ironic提供了一系列常用的驱动,同时提供了插件的机制让厂 商可以开发自己的driver,这让它支持几乎所有的硬件。

部署物理机跟部署虚拟机的概念在nova来看是一样,都是nova通过创建虚拟机的方式来触发,只是底层nova-scheduler和nova- compute的驱动不一样。虚拟机的底层驱动采用的libvirt的虚拟化技术,而物理机是采用Ironic技术,ironic可以看成一组 Hypervisor API的集合,其功能与libvirt类似。

最早baremetal的概念出现在nova里,物理机和虚拟机管理有很多地方非常相似,比如 物理机和虚拟机都需要开机关机,安装部署,添加和删除,为了避免重复造轮子,他们在nova中实现了一个物理机的driver,这样把物理机管理做为计算 资源管理的一个子集了。后来发现这样做有问题:

早期baremetal作为一个driver有自己的数据库,同一个项目中有两套数据库不合适。

在部署和管理baremetal的过程中有很多需要存储的信息是和部署管理虚拟机是不同的,通过nova api来获取这些信息比较尴尬,把baremetal剥离出来有助于划清baremetal和虚拟机部署的界限。

有时候baremetal需要做一些比较特殊的行为,比如discovery, hardware raid configuration, firmware updates, burn-in这些操作,它们不适合放在nova里面。比较好的办法是当完成这些操作的时候,向nova去注册信息,作为nova中的可用的资源,最后通 过nova boot去调用这些资源。

经过很多次讨论,开始社区把bare metal分离出来了, 命名为Ironic,从Icehouse版开始进入孵化项目,并在Juno版与Nova进行集成,从完成了项目毕业评审,在Kilo版正式的集成到 openstack项目中来,今后会通过nova调用Ironic的api来实现对物理机资源的管理和控制。

传统的hypervisor一般包括创建虚拟机、枚举虚拟设备、管理电源、加载操作系统等功 能,与之对应,Ironic可以看成结合多个驱动提供一套hypervisor API来操作物理机提供类似操作,所以ironic可以看成一个hypervisor驱动来给Nova来用。

 

Strengths优势

1.提供更强大的计算能力 。

2.有些计算任务需要接触到不能被虚拟化的硬件设备 ,在一些场景下,虚拟化的环境是不合适的,这些场景的用户需要的是真实的、物理的、裸金属的服务器。为了能够满足这些场景的自助服务需求,OpenStack 需要支持裸机的部署。

3.提供数据库托管能力,因为一些数据库在虚拟化设备中表现得不尽如人意。

4.由于提供独立的物理设备,可以更好地保证安全性、独立性以及其他可靠性需求。

5.可以快速部署云基础设施

PXE 

预启动执行环境(Preboot eXecution Environment,PXE)也被称为预执行环境,提供了一种使用网络接口(Network Interface)启动计算机的机制。这种机制让计算机的启动可以不依赖本地数据存储设备(如硬盘)或本地已安装的操作系统

IPMI

智能平台管理接口(Intelligent Platform Management Interface)原本是一种Intel架构的企业系统的周边设备所采用的一种工业标准。IPMI亦是一个开放的免费标准,用户无需支付额外的费用即可使用此标准。

IPMI 能够横跨不同的操作系统、固件和硬件平台,可以智能的监视、控制和自动回报大量服务器的运作状况,以降低服务器系统成本。

 

项目组成

ironic:包含ironic-api 和ironic-conductor进程。

python-ironicclient: python clinet and CLI。

ironic-python-agent: 一个运行在deployment ramdisk中的Python程序,用于执行一系列部署动作。

pyghmi:一个python的IPMI库,可以代替IPMItool。

ironic-inspector: 硬件自检工具。

ironic-lib:ironic的通用库函数。

ironic-webclient :web客户端。

ironic-ui:ironic的horizon插件。

bifrost:一套只运行Ironic的Ansible脚本。

 

概念架构(与其他组件的关系)

openstack neutron 多租户 openstack ironic_python

上面的图显示了有物理服务器的情况下所有的服务怎样工作的(注意Ceilometer和Swift可以使用,但是在图中没有体现)。

 

逻辑架构(与其他组件的调用关系)

Ironic服务由以下组件构成。

Ironic API,一个RESTful API服务,管理员和其他服务通过API与Ironic进行交互。

Ironic Conductor, 完成Ironic服务的绝大部分工作,通过API对外开放其功能,与Ironic API通过RPC进行交互;负责与其他组件进行交互。

Drivers,真正管理物理机的模块,通过一系列的驱动来支持不同的硬件。

Database,用来存储资源信息。

消息队列

openstack neutron 多租户 openstack ironic_数据库_02

 

部署架构

云平台管理员可以使用RESTful API注册硬件,制定硬件的属性,比如MAC地址、IPMI证书。可以开启多个API服务实例。

由于Ironic Conductor是唯一一个需要访问数据层和IPMI控制层的服务,为了安全起见,最好将conductor service 放在一个独立的主机上。为了支持各类驱动和管理故障迁移,可以有多个conductor实例存在,每个conductor实例可以运行多个 drivers。

openstack neutron 多租户 openstack ironic_数据库_03

 

消息路由

每一个Conductor实例在启动时想数据库注册自己,注册的信息包含了本实例支持的驱动列表,并且定期更新自己记录的时间戳,这就使得所有的服务能够知道哪些Conductor和哪些驱动可用。

物理机根据自己的驱动,使用一致性哈希算法映射在一组Conductor上。部署任务通过RPC 从API层分发到合适的Conductor上。当Conductor实例加入或者退出集群,物理机会重新映射到不同的Conductor上,会触发驱动的多种动 作,比如take-over 或者 clean-up动作。

openstack neutron 多租户 openstack ironic_python_04

裸机部署的主要技术

 

Preboot Execution Environment (PXE)

预启动执行环境。PXE 是目前主流的无盘启动技术,它可以使计算机通过网络而不是从本地硬盘、光驱等设备启动。利用 PXE 进行系统安装需要被安装的主机上有 PXE 支持的网卡,不过现在的网卡一般都内嵌支持 PXE 的 ROM 芯片。当计算机引导时,BIOS 首先会 把 PXE Client 调入内存中执行,PXE Client 被载入内存后,它便同时具有 DHCP client 和 TFTP Client 的功能,DHCP client 会向 DHCP server 请求 ip 分配给将要安装系统的主机,然后由 PXE Client 将放置在远端的文件通过 TFTP 下载到本地运行。

https://technet.microsoft.com/zh-cn/library/cc732649

 

Dynamic Host Configuration Protocol (DHCP)

动态主机配置协议是标准的网络协议,用来动态的分发网络配置参数,例如网口的IP地址。

http://network.51cto.com/art/201406/441752.htm

 

Network Bootstrap Program (NBP)

网络引导程序,NBP和本地启动时通常使用的GRUB或者LILO相同。像硬件驱动环境的启动程序,NBP负责下载OS内核到内存,然后系统可以通过网络启动。

 

Trivial File Transfer Protocol (TFTP)

在PXE环境,TFTP被用来使用DHCP服务器的信息通过网络下载NBP。

 

Intelligent Platform Management Interface (IPMI)

IPMI(Intelligent Platform Management Interface) 智能平台管理接口,是一种开放标准的硬件管理接口规格,使用嵌入式管理子系统进行通信而不依赖主机操作系统,这使得在操作系统不响应或未加载的情况下其仍然可以进行开关机、信息提取等操作。Ironic 正是利用此技术可以远程的对裸机进行上下电或者其他操作,而不是依赖物理开关或者操作系统。

关于Ironic里的一些服务

ironic-api: 接收REST请求,送给ironic-conductor。

ironic-conductor: 接收来自ironic-API的请求,进行创建、更新、删除nodes, 通过IPMI、ssh开关电源,或者部署bare metal机器。

ironic-python-agent: 当一台bare metal服务启动时,如果从PXE启动,机器可以从远端拉取一个最小版的Linux内核,也可以拉取一个ramdisk,不过最小版的Linux内核功能较弱,如果是ramdisk的话,可以在上面安装各种服务(也可以配置RAID),其中可以包括ironic-python-agent。在ramdisk中的ironic-python-agent提供和ironic-conductor一样的服务。

ironicclient: Ironic CLI

 

API

节点相关(node)

节点增删改查(List, Searching, Creating, Updating, and Deleting)

合法性检查

设置和清除维修状态

设置和获取boot device

获取节点当前综合信息,包括power, provision, raid, console等

更改电源状态

更改节点提供状态( manage, provide, inspect, clean, active, rebuild, delete (deleted), abort)

设置RAID

启动、停止、获取console

查看、调用厂商定制方法(passthrough方法)

端口相关(Port)

对物理端口(Port)的增删改查(Listing, Searching, Creating, Updating, and Deleting ),新建的时候就要指定端口的物理地址(一般是MAC地址)与Node进行绑定。

查看与Node连接的端口

驱动相关(driver)

列举所有驱动

查看驱动的详细信息、属性

查看和调用厂商的驱动

Chassis(机箱,一组node的集合)

增删改查 Chassis

这个资源类型是为了给节点分组用的,目前只有列举一组节点的功能。不赞成使用这个类型,将来可能会去除掉。

openstack neutron 多租户 openstack ironic_python_05

openstack neutron 多租户 openstack ironic_API_06

openstack neutron 多租户 openstack ironic_数据库_07

openstack neutron 多租户 openstack ironic_数据库_08

 

Conductor

Ironic-Conductor是Ironic中最主要的模块,通过Ironic-API对 外提供功能,与Ironic-API之间通过RPC进行通信,负责绝大部分工作,包括与Neutron通信为物理机配置网络信息,与Glance通信获取 镜像,与Cinder和Swift通信进行为物理机提Ironic-Conductor是Ironic中最主要的模块,通过Ironic-API对外提供 功能,与Ironic-API之间通过RPC进行通信,负责绝大部分工作,包括与Neutron通信为物理机配置网络信息,与Glance通信获取镜像, 与Cinder和Swift通信进行为物理机提供存储。 供存储。

同时控制着物理机状态的改变过程。

在高可用方面,conductor 采用一致性哈希算法保证Conductor节点新增退出时不影响Bare metal节点。

 

DB

采用MySQL,存储物理机和驱动的状态信息,可以换成其他数据库。

 

Driver

驱动是真正操作物理机的模块,Ironic的驱动以插件形式设计,厂商可以实现自己的驱动来为自己的设备提供特色化功能。实现自己的驱动只需要实现几个相关的方法即可。

参考资料:

https://wiki.openstack.org/wiki/Ironic

https://docs.openstack.org/ironic/latest/