使用不同 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_kernel 和 deploy_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-init和openssh-server元素至关重要。(顺便说一句:diskimage-builder文档错误地声称cloud-init元素仅适用于 Gentoo,但事实并非如此)。与 Ubuntu 一样,设置 DIB_CLOUD_INIT_DATASOURCES=Ec2 并使用
cloud-init-datasources元素是必要的,因为 OpenStackcloud-init数据源不起作用。与 Ubuntu 的情况不同,使用 Ec2 数据源不是默认设置,因此添加这些选项对于获得可用的镜像至关重要。DIB_CLOUD_INIT_GROWPART_DEVICES 变量告诉 cloud-init-growpart 配置 cloud-init 在首次启动时扩展根分区,这在某些操作系统/架构组合上必须显式设置。