Ironic 概述

Bare Metal 服务,代号为 ironic,是一系列组件的集合,为管理和配置物理机提供支持。

为什么配置 Bare Metal

以下是云环境中配置裸机(物理服务器)的几个用例;无疑还有更多有趣的用例

  • 高性能计算集群

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

  • 数据库托管(某些数据库在虚拟机中运行效果不佳)

  • 单租户、专用的硬件,用于性能、安全性、可靠性

    以及其他监管要求

  • 或者,快速部署云基础设施

Bare Metal 服务组件

Bare Metal 服务包括以下组件

ironic-api

一个 RESTful API,通过 远程过程调用 (RPC) 将应用程序请求发送到 ironic-conductor 进行处理。可以通过 WSGI 或作为单独的进程运行。

ironic-conductor

添加/编辑/删除节点;使用 IPMI 或其他特定于供应商的协议打开/关闭节点;配置/部署/清理裸机节点。

ironic-conductor 使用 驱动程序 在硬件上执行操作。

ironic-python-agent

一个 Python 服务,在临时 ramdisk 中运行,为 ironic-conductor 和 ironic-inspector 服务提供远程访问、带内硬件控制和硬件内省。

ironic-novncproxy

一个 Python 服务,通过 NoVNC Web 浏览器界面代理图形控制台。

此外,Bare Metal 服务具有某些外部依赖项,这些依赖项与其他 OpenStack 服务非常相似

  • 一个数据库,用于存储硬件信息和状态。您可以设置数据库后端类型和位置。一种简单的方法是使用与计算服务相同的数据库后端。另一种方法是使用单独的数据库后端,以进一步隔离裸机资源(以及关联的元数据)与用户。

  • 一个 oslo.messaging 兼容的队列,例如 RabbitMQ。它可以使用与计算服务相同的实现,但这不是必需的。用于实现 ironic-api 和 ironic-conductor 之间的 RPC。

与 OpenStack 组件的交互

Bare Metal 服务可能,取决于配置,与多个其他 OpenStack 服务交互。这包括

  • OpenStack 遥测模块 (ceilometer),用于消耗 IPMI 指标

  • OpenStack Identity 服务 (keystone),用于请求身份验证和定位其他 OpenStack 服务

  • OpenStack 镜像服务 (glance),从中检索镜像和镜像元数据

  • OpenStack 网络服务 (neutron),用于 DHCP 和网络配置

  • OpenStack 计算服务 (nova) 与 Bare Metal 服务协同工作,并充当面向用户的 API,用于实例管理,而 Bare Metal 服务提供用于硬件管理的管理员/操作员 API。OpenStack 计算服务还提供调度设施(匹配 flavor <-> 镜像 <-> 硬件)、租户配额、IP 分配和其他服务,这些服务 Bare Metal 服务本身不提供。

  • OpenStack 对象存储 (swift) 为 configdrive、用户镜像、部署日志和检查数据提供临时存储。

逻辑架构

下图显示了逻辑架构。它显示了构成 Bare Metal 服务的基本组件、Bare Metal 服务与其他 OpenStack 服务的关系以及引导实例请求导致配置物理服务器的逻辑流程。

Logical Architecture

用户引导实例的请求通过计算 API 和计算调度器传递到计算服务。计算服务使用 *ironic virt 驱动程序* 将此请求交给 Bare Metal 服务,请求从 Bare Metal API 传递到 Conductor,再到 Driver,最终成功配置用户的物理服务器。

就像计算服务与各种 OpenStack 服务(如 Image、Network、Object Store 等)交互以配置虚拟机实例一样,Bare Metal 服务也与相同的 OpenStack 服务交互,以获取配置裸机实例的镜像、网络和其他资源需求。

请参阅 了解 Bare Metal 部署,了解典型的部署过程的更详细分解。

相关项目

可选地,您可能希望使用以下相关项目以获得其他功能

python-ironicclient

一个命令行界面 (CLI) 和 Python 绑定,用于与 Bare Metal 服务交互。

ironic-ui

Horizon 仪表板,为 Bare Metal API 提供图形用户界面 (GUI)。

ironic-inspector

一个关联的服务,通过 PXE 引导未注册的硬件到 ironic-python-agent ramdisk 来执行带内硬件内省。

diskimage-builder

一个相关项目,有助于促进 ramdisk 和机器镜像的创建,例如运行 ironic-python-agent 的镜像。

bifrost

一组 Ansible playbook,可自动执行将基本镜像部署到已知硬件的任务,使用 ironic 以独立模式运行。

Bare Metal 托管的关键技术

预启动执行环境 (PXE)

PXE 是 Intel 和 Microsoft 开发的 Wired for Management (WfM) 规范的一部分。PXE 使系统的 BIOS 和网络接口卡 (NIC) 能够代替磁盘从网络启动计算机。引导是指将操作系统加载到本地内存中,以便处理器可以执行它。允许系统通过网络引导的能力简化了管理员的服务器部署和服务器管理。

动态主机配置协议 (DHCP)

DHCP 是一种在 Internet 协议 (IP) 网络上使用的标准化网络协议,用于动态分发网络配置参数,例如接口和服务的 IP 地址。使用 PXE,BIOS 使用 DHCP 获取网络接口的 IP 地址并找到存储网络引导程序 (NBP) 的服务器。

网络引导程序 (NBP)

NBP 等效于 GRUB (GRand Unified Bootloader) 或 LILO (LInux LOader) - 传统上用于本地引导的加载器。与硬盘环境中的引导程序一样,NBP 负责将操作系统内核加载到内存中,以便通过网络引导操作系统。

简易文件传输协议 (TFTP)

TFTP 是一种简单的文件传输协议,通常用于本地环境中机器之间自动传输配置文件或引导文件。在 PXE 环境中,TFTP 用于使用 DHCP 服务器中的信息通过网络下载 NBP。

智能平台管理接口 (IPMI)

IPMI 是一种标准化的计算机系统接口,系统管理员用于对计算机系统进行带外管理和监控其运行。这是一种使用仅通过网络连接到硬件而不是连接到操作系统来管理无响应或已关闭的系统的方法。

了解 Bare Metal 部署

当引导实例请求进来时会发生什么?下图介绍了配置裸机实例期间涉及的步骤。

在部署过程之前,必须满足以下先决条件

  • 要在 ironic-conductor 正在运行的 Bare Metal 服务节点上配置的依赖包,例如 tftp-server、ipmi、grub/ipxe 等,用于裸机配置。

  • 必须配置 Nova 以使用 bare metal 服务端点,并且计算节点上的计算驱动程序应配置为使用 ironic 驱动程序。

  • 必须为可用硬件创建 flavor。Nova 必须知道从哪个 flavor 引导。

  • 必须在 Glance 中提供镜像。以下是成功进行裸机部署所需的镜像类型

    • bm-deploy-kernel

    • bm-deploy-ramdisk

    • user-image

    • user-image-vmlinuz

    • user-image-initrd

  • 必须通过 bare metal API 服务注册硬件。

部署过程

这描述了使用 PXE 引导 ramdisk 在 OpenStack 中进行典型的裸机节点部署。根据使用的 ironic 驱动程序接口,某些步骤可能略有不同,但大多数步骤将保持不变。

  1. 通过 Nova API 发送引导实例请求,通过消息队列发送到 Nova 调度器。

  2. Nova 调度器应用过滤器并找到合适的超visor。Nova 调度器还使用 flavor 的 extra_specs,例如 cpu_arch,以匹配目标物理节点。

  3. Nova 计算管理器声明所选超visor 的资源。

  4. Nova 计算管理器根据 nova 引导请求中请求的网络接口创建(未绑定)租户虚拟接口 (VIF) 在网络服务中。需要注意的是,端口的 MAC 将随机生成,并在 VIF 附加到某个节点以对应于节点网络接口卡(或 bond)的 MAC 时更新。

  5. Nova 计算程序创建了一个 spawn 任务,其中包含所有信息,例如要从哪个镜像引导等。它调用 Nova 计算 virt 层的 driver.spawn。在 spawn 过程中,virt 驱动程序执行以下操作

    1. 使用部署镜像、实例 UUID、请求的功能和各种 flavor 属性更新目标 ironic 节点。

    2. 通过调用 ironic API 验证节点的电源和部署接口。

    3. 将先前创建的 VIF 附加到节点。每个 neutron 端口可以附加到任何 ironic 端口或端口组,端口组的优先级高于端口。在 ironic 端,这项工作由网络接口完成。附件是指将 VIF 标识符保存到 ironic 端口或端口组,并更新 VIF MAC 以匹配端口或端口组的 MAC,如要点 4 中所述。

    4. 生成 config drive(如果请求)。

  6. Nova 的 ironic virt 驱动程序通过 Ironic API 向为裸机节点服务的 Ironic conductor 发出部署请求。

  7. 虚拟接口被插入,并且 Neutron API 更新 DHCP 端口以设置 PXE/TFTP 选项。如果使用 neutron 网络接口,ironic 会在网络服务中创建单独的配置端口,而在使用 flat 网络接口的情况下,nova 创建的端口将同时用于配置和已部署实例的网络。

  8. ironic 节点的引导接口准备 (i)PXE 配置并缓存部署内核和 ramdisk。

  9. ironic 节点的管理接口发出命令以启用节点的网络引导。

  10. ironic 节点的部署接口缓存实例镜像(正常部署)、内核和 ramdisk(ramdisk 部署)或 ISO(ramdisk 部署与虚拟媒体)。

  11. ironic 节点的电源接口指示节点上电。

  12. 节点引导部署 ramdisk。

  13. 根据使用的确切驱动程序,部署 ramdisk 从 URL 下载镜像(直接部署),或者 conductor 使用 SSH 执行命令(Ansible 部署)。URL 可以由 Swift API 兼容的对象存储生成,例如 Swift 本身或 RadosGW,或者由用户提供。

    完成镜像部署。

  14. 节点的引导接口切换 pxe 配置以引用实例镜像(或者,在本地引导的情况下,将引导设备设置为磁盘),并要求 ramdisk 代理软关机节点。如果 ramdisk 代理的软关机失败,则通过 IPMI/BMC 调用关机裸机节点。

  15. 部署接口会触发网络接口移除已创建的配置端口,如果租户端口尚未绑定,则将其绑定到节点。然后,节点将被启动。

    注意

    在裸机部署过程中有 2 次电源循环;第一次是在启动 ramdisk 时节点上电,第二次是在部署镜像之后。

  16. 裸机节点的配置状态更新为 active

以下是描述上述过程的图表。

digraph "Deployment Steps" {

    node [shape=box, style=rounded, fontsize=10];
    edge [fontsize=10];

    /* cylinder shape works only in graphviz 2.39+ */
    { rank=same; node [shape=cylinder]; "Nova DB"; "Ironic DB"; }
    { rank=same; "Nova API"; "Ironic API"; }
    { rank=same; "Nova Message Queue"; "Ironic Message Queue"; }
    { rank=same; "Ironic Conductor"; "TFTP Server"; }
    { rank=same; "Deploy Interface"; "Boot Interface"; "Power Interface";
                 "Management Interface"; }
    { rank=same; "Glance"; "Neutron"; }
    "Bare Metal Nodes" [shape=box3d];

    "Nova API" -> "Nova Message Queue" [label=" 1"];
    "Nova Message Queue" -> "Nova Conductor" [dir=both];
    "Nova Message Queue" -> "Nova Scheduler" [label=" 2"];
    "Nova Conductor" -> "Nova DB" [dir=both, label=" 3"];
    "Nova Message Queue" -> "Nova Compute" [dir=both];
    "Nova Compute" -> "Neutron" [label=" 4"];
    "Nova Compute" -> "Nova Ironic Virt Driver" [label=5];
    "Nova Ironic Virt Driver" -> "Ironic API" [label=6];
    "Ironic API" -> "Ironic Message Queue";
    "Ironic Message Queue" -> "Ironic Conductor" [dir=both];
    "Ironic API" -> "Ironic DB" [dir=both];
    "Ironic Conductor" -> "Ironic DB" [dir=both, label=16];
    "Ironic Conductor" -> "Boot Interface" [label="8, 14"];
    "Ironic Conductor" -> "Management Interface" [label=" 9"];
    "Ironic Conductor" -> "Deploy Interface" [label=10];
    "Deploy Interface" -> "Network Interface" [label="7, 15"];
    "Ironic Conductor" -> "Power Interface" [label=11];
    "Ironic Conductor" -> "Glance";
    "Network Interface" -> "Neutron";
    "Power Interface" -> "Bare Metal Nodes";
    "Management Interface" -> "Bare Metal Nodes";
    "TFTP Server" -> "Bare Metal Nodes" [label=12];
    "Ironic Conductor" -> "Bare Metal Nodes" [style=dotted, label=13];
    "Boot Interface" -> "TFTP Server";

}

以下两个示例更详细地描述了 ironic 的操作,省略了 nova 执行的操作以及一些更高级的选项。

示例:PXE 启动和直接部署流程

此流程是 直接部署 的工作方式。

../_images/direct-deploy.svg

(来自 演讲幻灯片)

部署架构

Bare Metal RESTful API 服务用于注册 Bare Metal 服务将管理的硬件。云管理员通常会注册它,指定其属性,例如 MAC 地址和 IPMI 凭据。API 服务可以有多个实例。

ironic-conductor 进程执行大部分工作。出于安全原因,建议将其放置在隔离的主机上,因为它是在数据平面和 IPMI 控制平面都需要访问的唯一服务。

可以有多个 conductor 服务实例来支持各种驱动程序类别,并管理故障转移。conductor 服务实例应位于不同的节点上。每个 conductor 本身可以运行许多驱动程序来操作异构硬件。下图描述了这一点。

Deployment Architecture

API 暴露了受支持的驱动程序列表以及为其提供服务的 conductor 主机名称。