配置裸金属 (Ironic) 服务 (可选)¶
本节描述了 Ironic 部署所涉及的一般概念。部署者需要决定如何在自己的环境中应用这些一般概念以满足特定的需求。应该理解的是,Ironic 服务是高度可配置和可插拔的,因此 Ironic 项目团队并未指定单一的参考设计。
注意
此功能目前为实验性质,尚未经过全面生产测试。
Ironic 是一个 OpenStack 项目,它通过利用 PXE 启动和 IPMI 等通用技术来配置裸金属(而非虚拟)机器,以覆盖广泛的硬件,同时支持可插拔驱动程序以允许添加特定于供应商的功能。
OpenStack 的 Ironic 项目使物理服务器的配置与云中的虚拟机一样简单。
OpenStack-Ansible 部署¶
在 OpenStack 部署中使用 Ironic 时,它会利用 Nova 来部署裸金属实例,当发出使用裸金属配置文件的 openstack server create 命令时。因此,除了 Ironic API 服务之外,还必须配置一个使用 Ironic 计算驱动程序(而不是 libvirt)的 Nova 计算服务。当清单配置正确时,playbooks 可以自动部署此服务。
要部署 Ironic,请在 openstack_user_config.yml 中填充相应的组
ironic-infra_hosts: *infrastructure_hosts
ironic-compute_hosts: *infrastructure_hosts
更新清单后,Ironic API 和 conductor 服务将部署在 infra/controller 节点上,同时还会部署一个配置为与 Ironic 一起使用的 nova-compute 服务。
OpenStack-Ansible 默认配置为支持基于 PXE 的部署。要启用 iPXE 的使用(它使用 HTTP 而不是 TFTP 来进行完整部署),请添加以下覆盖配置
ironic_ipxe_enabled: yes
注意
启用 iPXE 后,PXE 用于引导到 iPXE 加载器。与 PXE 相比,iPXE 的部署时间要快得多,强烈推荐其配置。启用 iPXE 后,将在 conductor 节点上部署一个 Web 服务器来托管镜像和文件。
裸金属服务的一些驱动程序(特别是任何使用 Direct deploy 或 Ansible deploy 接口的驱动程序,以及一些虚拟媒体驱动程序)要求目标用户镜像可通过干净的 HTTP(S) URL 访问,且无需任何身份验证(既不是基于用户名/密码,也不是基于令牌)。
默认的部署方法依赖 Swift 来提供此功能。如果环境中没有 Swift,那么以下覆盖配置可以通过使用在 conductor 节点上部署的 Web 服务器提供类似功能(请参阅 ironic_ipxe_enabled)
ironic_enable_web_server_for_images: yes
裸金属服务的 ipmi 硬件驱动程序默认启用。供应商特定的驱动程序,包括 iLO 和 DRAC,可用于支持的硬件。OpenStack-Ansible 提供了一组具有预配置硬件、启动、部署、检查、管理和电源特性的驱动程序,包括
agent_ilo
agent_ipmitool
agent_ipmitool_socat
agent_irmc
pxe_drac
pxe_drac_inspector
pxe_ilo
pxe_ipmitool
pxe_ipmitool_socat
pxe_irmc
pxe_snmp
注意
可以通过查看 Ironic 角色中的 ironic_driver_types 变量来详细了解这些驱动程序的特性。
要启用 iLO 和 DRAC 驱动程序以及 IPMI,请设置以下覆盖配置
ironic_drivers_enabled:
- agent_ipmitool
- pxe_ipmitool
- agent_ilo
- pxe_ilo
- pxe_drac
为 Ironic 设置 Neutron 网络¶
Ironic 支持两种主要的网络接口:flat 和 neutron
- 当配置的节点和正在部署的节点被放在同一个二层网络中时,
flat接口将所有配置的节点和正在部署的节点置于一个单一的二层网络中。部署。 - 当使用
neutron接口时,通过与 Neutron 集成,提供租户定义的网络(也称为多租户),同时还将租户网络与供应和清理提供商网络分开。(也称为多租户) 通过与 Neutron 集成,同时还将租户网络与供应和清理提供商网络分开。
使用 flat 网络接口时,检查、清理和供应功能将在同一个 flat 提供商网络上执行。所有裸金属节点将在部署后共享相同的 VLAN 和网络/子网,这可能会给租户和控制平面带来安全挑战。
使用 neutron 网络接口时,检查、清理、供应和租户网络可以使用不同的 VLAN。但是,必须使用 ML2 插件,例如 networking-generic-switch,在功能之间切换时配置相应的交换机端口。
https://docs.openstack.org/openstack-ansible-os_neutron/2025.2/app-genericswitch.html
注意
无论是 flat 还是 neutron 网络接口,都需要在 ironic.conf 中定义一个清理网络。对于 flat 部署,清理网络将与部署网络相同。
创建一个供裸金属实例用于清理、供应和部署后使用的网络和子网
openstack network create \
--provider-network-type flat \
--provider-physical-network physnet1 \
myBaremetalNetwork
openstack subnet create \
--network myBaremetalNetwork \
--subnet-range 172.17.100.0/24 \
myBaremetalNetworkSubnet
设置一个覆盖配置来定义清理网络名称
ironic_neutron_cleaning_network_name: "myBaremetalNetwork"
注意
Ironic 多租户是一个高级主题,需要使用兼容的 ML2 驱动程序,例如 networking-generic-switch。
重要提示
裸金属实例上的供应活动需要网络访问 Ironic conductor(Web)服务和其他 OpenStack API。您必须确保相应网络之间的路由存在,供应才能成功。
构建 Ironic 镜像¶
裸金属供应需要两组镜像:部署镜像和用户镜像。部署镜像由内核和 initrd 镜像组成,Ironic 使用它们来准备裸金属服务器以进行实际的操作系统部署,而用户镜像则安装在裸金属服务器上供最终用户使用。
有关构建和上传供 Ironic 使用的磁盘镜像的更多信息,请参阅以下文档
https://docs.openstack.org/ironic/2025.2/user/creating-images.html https://docs.openstack.org/ironic/2025.2/install/configure-glance-images.html
有两种类型的用户镜像
分区镜像
整盘镜像
为了方便您,以下步骤演示了如何创建基于分区的镜像。
注意
使用 diskimage-builder 创建的镜像必须在 LXC 容器外部构建。在此过程中,请使用环境中的物理主机之一或虚拟机。
安装必要的先决条件
apt install qemu uuid-runtime curl
安装
disk-imagebuilder包pip install diskimage-builder
重要提示
仅当您在 OpenStack-Ansible 部署的节点上构建时,才使用
--isolated标志,否则 pip 将无法解析外部包。创建 Ubuntu Focal 内核、initrd 和用户镜像
export IMAGE_NAME=my-image export DIB_RELEASE=focal export DIB_CLOUD_INIT_DATASOURCES="Ec2, ConfigDrive, OpenStack" disk-image-create ubuntu baremetal dhcp-all-interfaces grub2 -o ${IMAGE_NAME}
将创建的用户镜像上传到 Image (Glance) 服务
# Kernel image: openstack image create my-image.kernel \ --public \ --disk-format raw \ --container-format bare \ --file my-image.vmlinuz # Ramdisk image openstack image create my-image.initrd \ --public \ --disk-format raw \ --container-format bare \ --file my-image.initrd # User image openstack image create my-image \ --public \ --disk-format qcow2 \ --container-format bare \ --property kernel_id=<kernel image uuid> \ --property ramdisk_id=<ramdisk image uuid> \ --file my-image.qcow2
注意
当使用基于分区的镜像配置裸金属实例时,如果在 local 启动功能不可用时,将使用内核和 initrd 镜像进行 PXE 启动。
创建 Ironic 配置¶
在使用 Nova 创建实例时,配置是必需的,在定位裸金属节点以用于实例时应使用裸金属配置。配置的属性以及定义的资源类对于调度程序在调度到 libvirt 或 ironic 计算服务时非常有用。
例如,假设一个 Ironic 部署有以下节点
- node-1:
resource_class: ironic-gold
properties:
cpus: 32
memory_mb: 32768
capabilities:
boot_mode: uefi,bios
- node-2:
resource_class: ironic-silver
properties:
cpus: 16
memory_mb: 16384
操作员可能会这样定义配置
- baremetal-gold
resources:
ironic-gold: 1
extra_specs:
capabilities: boot_mode:bios
- baremetal-gold-uefi
resources:
ironic-gold: 1
extra_specs:
capabilities: boot_mode:uefi
- baremetal-silver
resources:
ironic-silver: 1
使用 baremetal-gold 或 baremetal-gold-uefi 配置启动实例的用户将落到 node-1 上,因为功能仍然可以传递给 ironic,并且节点上的 resource_class 与配置所需相匹配。baremetal-silver 配置将匹配 node-2。
注意
一个配置可以精确地请求一个裸金属资源类的实例。
创建裸金属配置时,添加 RAM 和 CPU 属性作为用户便利是一件好事,尽管它们不用于调度。此外,DISK 属性也不用于调度,但仍用于确定根分区大小。
openstack flavor create \
--ram 32768 \
--vcpu 32 \
--disk 120 \
baremetal-gold
创建后,将每个配置与一个自定义资源类关联。与裸金属服务中的节点资源类对应的自定义资源类的名称是
裸金属节点的资源类全部大写
并在其前加上
CUSTOM_所有标点符号替换为下划线
openstack flavor set \
--property resources:CUSTOM_IRONIC_GOLD=1 \
baremetal-gold
注意
确保配置中定义的资源类与裸金属节点的资源类匹配,否则调度程序将找不到符合条件的宿主。在提供的示例中,资源类是 ironic-gold。
必须使用另一组配置属性来禁用基于标准属性的裸金属配置的调度
openstack flavor set --property resources:VCPU=0 baremetal-gold
openstack flavor set --property resources:MEMORY_MB=0 baremetal-gold
openstack flavor set --property resources:DISK_GB=0 baremetal-gold
最后,可以设置一个 boot_option 能力来加快部署后的启动速度
openstack flavor set --property capabilities:'boot_option=local' baremetal-gold
注意
指定 local 启动选项允许部署的裸金属实例直接启动到磁盘而不是网络。
注册 Ironic 节点¶
注册裸金属节点使其可供 Ironic 服务使用。给定节点的属性将允许 Ironic 确定如何将镜像部署到节点上,包括使用 IPMI 或特定于供应商的带外接口。一些属性是可选的,可能依赖于操作员设置或 OpenStack-Ansible 内置的默认值。其他属性是必需的,并且可能如此标记。
在注册之前,应该了解一些关于裸金属节点的事情,包括
节点名称
驱动程序
部署接口(基于驱动程序)
供应接口(MAC 地址)
IPMI 或 OOB 凭据
OOB 管理 IP
部署内核镜像 UUID(来自 Glance)
部署 ramdisk 镜像 UUID(来自 Glance)
启动模式(bios 或 uefi)
网络接口(flat 或 neutron)
注意
内核和 ramdisk 镜像可以由 diskimage-builder 过程提供,也可以从 opendev.org 下载
https://tarballs.opendev.org/openstack/ironic-python-agent/dib/ https://docs.openstack.org/ironic/2025.2/install/deploy-ramdisk.html
重要提示
部署内核和 ramdisk 应定期更新,以匹配底层基础架构的 OpenStack 版本。运行在 ramdisk 上的 Ironic Python Agent 会与 Ironic API 进行交互,应保持同步。
要注册节点,请使用 openstack baremetal node create 命令。下面的示例演示了具有以下特征的裸金属节点的创建
node_name=baremetal01
node_mac="f0:92:1c:0c:1f:88" # MAC address of PXE interface (em1 as example)
deploy_kernel=ironic-deploy-kernel # Kernel image
deploy_ramdisk=ironic-deploy-ramdisk # Ramdisk image
resource=ironic-gold # Ironic resource class (matches flavor as CUSTOM_IRONIC_GOLD)
phys_arch=x86_64
phys_cpus=32
phys_ram=32768
phys_disk=270
ipmi_username=root
ipmi_password=calvin
ipmi_address=172.19.0.22
boot_mode=bios
network_interface=flat
重要提示
Ironic conductor 服务必须能够与 OOB IP 地址通信以执行供应功能。
openstack baremetal node create \
--driver ipmi \
--deploy-interface direct \
--driver-info ipmi_username=$ipmi_username \
--driver-info ipmi_password=$ipmi_password \
--driver-info ipmi_address=$ipmi_address \
--driver-info deploy_kernel=`openstack image show $deploy_kernel -c id |awk '/id / {print $4}'` \
--driver-info deploy_ramdisk=`openstack image show $deploy_ramdisk -c id |awk '/id / {print $4}'` \
--property cpus=$phys_cpus \
--property memory_mb=$phys_ram \
--property local_gb=$phys_disk \
--property cpu_arch=$phys_arch \
--property capabilities='boot_option:local,disk_label:gpt' \
--resource-class $resource \
--network-interface $network_interface \
--name $node_name
节点最初将显示为 enroll 状态。要使其可用于供应,请将状态设置为 manage,然后设置为 available
openstack baremetal node manage baremetal01
openstack baremetal node provide baremetal01
openstack baremetal node list --fit
+--------------------------------------+-------------+---------------+-------------+--------------------+-------------+
| UUID | Name | Instance UUID | Power State | Provisioning State | Maintenance |
+--------------------------------------+-------------+---------------+-------------+--------------------+-------------+
| c362890d-5d7a-4dc3-ad29-7dac0bf49344 | baremetal01 | None | power off | available | False |
+--------------------------------------+-------------+---------------+-------------+--------------------+-------------+
接下来,使用 openstack baremetal port create 命令创建一个裸金属端口
node_name=baremetal01
node_mac="f0:92:1c:0c:1f:88"
openstack baremetal port create $node_mac \
--node `openstack baremetal node show $node_name -c uuid |awk -F "|" '/ uuid / {print $3}'`
+-----------------------+--------------------------------------+
| Field | Value |
+-----------------------+--------------------------------------+
| address | f0:92:1c:0c:1f:88 |
| created_at | 2021-12-17T20:36:19+00:00 |
| extra | {} |
| internal_info | {} |
| is_smartnic | False |
| local_link_connection | {} |
| node_uuid | c362890d-5d7a-4dc3-ad29-7dac0bf49344 |
| physical_network | None |
| portgroup_uuid | None |
| pxe_enabled | True |
| updated_at | None |
| uuid | 44e5d872-ffa5-45f5-a5aa-7147c523e593 |
+-----------------------+--------------------------------------+
注意
裸金属端口用于设置 Neutron 以在供应期间提供 DHCP 服务。当使用 neutron 网络接口时,相应的交换机端口可以由 OpenStack 管理。
使用 Ironic 部署裸金属节点¶
可以使用 openstack server create 命令和裸金属配置来部署裸金属实例。除非镜像已创建支持密码,否则必须提供 SSH 密钥。裸金属实例依赖于 Neutron DHCP 和元数据服务,就像虚拟实例一样。
openstack server create \
--flavor baremetal-gold \
--image focal-server-cloudimg-amd64 \
--key-name myKey \
--network myBaremetalNetwork \
myBaremetalInstance
重要提示
如果您没有现成的 ssh 密钥,请使用 ssh-keygen 进行设置,和/或使用 openstack keypair create 创建一个。否则,您将无法连接到已部署的实例。