使用不同 CPU 架构部署多个 Ironic 节点

Ironic 可以部署 CPU 架构与控制平面 CPU 架构不匹配的节点。Openstack-Ansible 的默认设置假定一个 x86-64 控制平面部署 x86-64 Ironic 节点。

本文档描述了如何使用 x86-64 控制平面部署 aarch64 Ironic 节点。通过不同的变量定义,可以使用相同的方法支持其他架构组合。

本示例假定 Glance 用于 Ironic 镜像存储,并且 Ironic 控制平面 Web 服务器为部署提供这些镜像。

构建 aarch64 的 ironic-python-agent 部署镜像

必须为需要部署的每个架构构建 ironic-python-agent 内核和 initramfs,并将其上传到 Glance。

要在 Rocky Linux aarch64 主机上构建 aarch64 ironic-python-agent 镜像

dnf install python3-virtualenv git qemu-img

virtualenv venv
source ./venv/bin/activate
pip install ironic-python-agent-builder

export DIB_REPOREF_ironic_python_agent=origin/master
export DIB_REPOREF_requirements=origin/master
ironic-python-agent-builder -o my-ipa --extra-args=--no-tmpfs --release 9-stream centos
  • origin/master 替换为另一个分支引用,以便构建特定版本的 IPA,例如 stable/zed

为多个架构配置 Ironic

此配置假定使用 iPXE。支持其他架构所需的设置最少。Ironic 具有一个默认设置,用于使用的 EFI 固件文件,可以根据每个架构覆盖该设置,方法是使用 ipxe_bootfile_name_by_arch 配置设置。

在控制平面上,aarch64 EFI iPXE 固件必须存在于 tftp 服务器的根目录中。请注意,并非所有发行版都提供与主机架构不同的架构的 EFI 固件包,因此可能需要直接从 https://boot.ipxe.org 下载特定架构的固件。

本示例演示了如何指定要用于 aarch64 节点的 iPXE 启动固件,以及从哪里获取该固件以填充 tftp 服务器。

ironic_ironic_conf_overrides:
  # Point to aarch64 uefi firmware on aarch64 platforms
  pxe:
    ipxe_bootfile_name_by_arch: 'aarch64:ipxe_aa64.efi'

ironic_tftp_extra_content:
  - url: http://boot.ipxe.org/arm64-efi/ipxe.efi
    name: ipxe_aa64.efi

注意

必须将此覆盖与任何现有的 ironic_ironic_conf_overrides 定义结合使用。

注册 aarch64 节点

在注册 aarch64 节点时,即使现有的 Ironic 节点使用传统 BIOS 启动,boot_mode 也必须设置为 uefi。

包含 uefi 启动的节点功能示例是

capabilities='boot_option:local,disk_label:gpt,boot_mode:uefi'

注册 aarch64 节点与注册 x86_64 节点完全相同,除了 deploy_kerneldeploy_ramdisk 必须设置为 aarch64 版本的部署镜像。

构建 aarch64 用户镜像

在现有的 aarch64 Ubuntu 主机上构建 aarch64 全盘用户镜像的示例

sudo apt update
sudo apt install python3-venv qemu-utils
python3 -m venv venv
source ./venv/bin/activate
pip install diskimage-builder
DIB_RELEASE=jammy DIB_CLOUD_INIT_DATASOURCES=Ec2 disk-image-create -a arm64 ubuntu vm block-device-efi cloud-init-datasources -o baremetal-ubuntu-22.04-efi-arm64.qcow2
  • 环境变量 DIB_RELEASE=<name> 告诉 ‘ubuntu’ 元素为哪个版本的 Ubuntu 创建镜像。如果未指定,则默认值为 Focal。

  • 环境变量 DIB_CLOUD_INIT_DATASOURCES=Ec2 由 cloud-init-datasources 元素使用,以强制 cloud-init 使用其 Ec2 数据源。由于它目前不支持裸机实例,因此无法使用本机 OpenStack 数据源,直到 cloud-init 版本 23.1。(由于 OpenStack 元数据服务也提供与 EC2 兼容的 API,因此 Ec2 数据源是一个合理的解决方法。(注意:这实际上是 Ubuntu 云镜像的默认行为,但出于完全不相关的原因,因此值得在此明确说明。)

使用类似的方法在 Rocky Linux aarch64 系统上构建最新版本的 Rocky Linux 的全盘用户镜像

DIB_RELEASE=9 DIB_CLOUD_INIT_DATASOURCES=Ec2 DIB_CLOUD_INIT_GROWPART_DEVICES='["/"]' disk-image-create -a arm64 rocky-container vm block-device-efi cloud-init openssh-server cloud-init-datasources cloud-init-growpart -o baremetal-rocky-9-efi-arm64.qcow2
  • 环境变量 DIB_RELEASE=<number> 告诉 ‘rocky-container’ 元素为哪个版本的 Rocky 创建镜像。

  • 由于 Rocky 容器镜像不包含这些软件包,因此 cloud-initopenssh-server 元素至关重要。(顺便说一句:diskimage-builder 文档错误地声称 cloud-init 元素仅适用于 Gentoo,但事实并非如此)。

  • 与 Ubuntu 一样,设置 DIB_CLOUD_INIT_DATASOURCES=Ec2 并使用 cloud-init-datasources 元素是必要的,因为 OpenStack cloud-init 数据源不起作用。与 Ubuntu 的情况不同,使用 Ec2 数据源不是默认设置,因此添加这些选项对于获得可用的镜像至关重要。

  • DIB_CLOUD_INIT_GROWPART_DEVICES 变量告诉 cloud-init-growpart 配置 cloud-init 在首次启动时扩展根分区,这在某些操作系统/架构组合上必须显式设置。