OpenStack Ironic 獨立部署入門詳解:上

新鈦雲服已累計爲您分享856篇技術乾貨

想在雲環境中像管理虛擬機(VM)一樣管理物理服務器嗎?想在物理節點上實現基礎設施即代碼(IaC)和 CI/CD 流水線嗎?下面,讓我們通過一些實用、簡單且可復現的案例,來揭開私有云基礎設施和裸金屬生命週期管理的一些神秘面紗,我們將從一個最小化的 OpenStack Ironic “獨立”部署開始。

使用 OpenStack Kolla 和 Ironic 安裝並管理一個簡單的裸金屬配置系統。

管理物理服務器的通用生命週期:上線、資源收集、操作系統安裝、故障恢復、回收。

應用 IaC 方法進行節點和應用程序的配置。

一旦我們瞭解了 Ironic 的“獨立”模式,將其與 Keystone、Cinder、Nova 和 Neutron 等其他 OpenStack 服務集成就會變得更加簡單,從而擴展其功能,將數據中心轉變爲一個能夠同時管理裸金屬工作負載和虛擬機的真正私有云。

引 言

日常與物理服務器 、手動配置、驅動程序、BIOS以及維護龐大物理機器打交道的人,都深知裸金屬管理(即管理未預裝操作系統的物理服務器)是多麼耗時且繁瑣。

你肯定對OpenStack不陌生。它是一個開源的雲服務套件,允許你以代碼方式和“as-a-Service”的形式管理虛擬資源(虛擬機、網絡、存儲)。而Ironic正是 OpenStack 中將這一理念延伸到物理機管理的組件。

OpenStack Ironic 是一個裸金屬配置和管理服務,它將物理服務器集成到 OpenStack 框架中,視其爲雲資源。這意味着物理服務器可以通過 API 進行請求、分配、配置和釋放,就像操作虛擬機一樣。

這與虛擬化無關:Ironic 不會在物理硬件上創建虛擬機。Ironic 管理的是物理硬件本身,它直接在機器上安裝操作系統,沒有任何中間的虛擬化層。

管理裸金屬生命週期

傳統上,管理裸金屬服務器的生命週期是一個包含多個階段的過程,通常是手動的且非常耗時:

採購與物理安裝:接收、上架、佈線。

BIOS/UEFI 配置:手動進入、進行特定設置。

RAID 控制器配置:創建陣列、配置磁盤。

操作系統安裝:從 CD/USB/PXE 啓動,手動或半自動安裝。

安裝後配置:驅動、軟件、網絡、安全加固。

維護與更新:打補丁、升級固件。

回收:擦除磁盤、移除設備。

有了 Ironic,整個過程發生了轉變,我們就實現了“as-a-Service”的管理方式:

發現與註冊(Onboarding):Ironic 通過 PXE 啓動和代理“發現”機器,並將其註冊到其清單中。註冊後,Ironic 可以直接與其BMC(管理控制器,如 iLO、iDRAC、IMM)進行交互。

“As-a-Service”式配置:用戶(或自動化服務)可以通過 OpenStack API 請求一臺具有特定特性(CPU、RAM、存儲)的物理服務器。Ironic 會選擇一臺可用的服務器,打開電源,安裝所選的操作系統(GNU/Linux、Windows、VMware ESXi 等),配置網絡,並在短時間內使其可用。

遠程自動化管理:得益於與 BMC 的集成,Ironic 可以通過程序方式執行諸如開/關機、重啓、重置、引導設備管理、固件更新(通過插件)甚至 BIOS/UEFI 設置等操作,所有這些都無需任何手動干預。

回收與清理:當不再需要某臺服務器時,Ironic 可以執行安全磁盤擦除並重置 BIOS/UEFI 設置,使服務器恢復到“乾淨”狀態,可供重用或最終回收,整個過程完全自動化。

與其他 OpenStack 服務集成:最後但同樣重要的是,Ironic 可以與用於物理網絡管理的Neutron、用於操作系統鏡像管理的Glance、用於提供持久性存儲的Cinder以及用於提供統一圖形界面的Horizon集成。這使得構建複雜的解決方案成爲可能,其中裸金屬是雲基礎設施的延伸,不僅可以實現資源的“即服務”消費,還可以實現像 CI/CD 流水線這樣的自動化交互。

01

實驗環境

讓我們考慮一個簡化的環境,這樣我們就可以用最少的精力來搭建它,並主要關注裸金屬配置機制:

LAN 網絡192.168.0.0/24:也稱爲公共網絡,這將是一個統一的客戶端和服務器網絡,通過一個路由器(.254)連接到互聯網,該路由器在 x.x.x.101-199 範圍內通過 DHCP 分配 IP 地址。

OOB/IB 網絡172.19.74.0/24:這個獨立的網絡由一臺小型服務器(圖中標記爲“bms”)管理,用於控制裸金屬節點的配置。這些節點通過 BMC 連接以進行帶外管理(iLO、iDRAC、IMM 等),並通過以太網卡進行帶內管理(部署、巡檢、救援等)。

兩個交換機都是非網管交換機,沒有 VLAN,這樣就可以使用“現成”的硬件,或者用企業級設備、甚至虛擬化環境輕鬆模擬。

1.1 裸金屬服務

bms服務器,即我們將要安裝裸金屬配置環境的服務器,並不需要很高的資源。最低規格要求是4GB 內存、2 個 CPU 核心、2 個網卡和至少 200GB 的磁盤空間(用於託管和構建操作系統鏡像及容器)。但是,建議至少使用8GB 內存和 4 個 CPU 核心,以便將來可以擴展環境並添加更多服務。

在軟件方面,將使用以下主要組件:

OpenStack 2025.1 (Epoxy):在撰寫本文時,這是最新的 OpenStack 版本,Kolla 和 Kolla Ansible(本文用於部署 OpenStack 的系統)已經爲其發佈了即用型容器。

Debian GNU/Linux 12 (Bookworm):儘管 OpenStack 在很大程度上與各種 GNU/Linux 發行版無關(尤其是在通過容器安裝時),但爲了避免偏向商業發行版,我們將使用 Debian。

Podman:它爲 Docker 提供了一個輕量級且集成的替代方案,同時保持了與現有生態系統的兼容性,並與像 Kubernetes 這樣的“Pod”基礎設施保持一致。

02

創建實驗環境

安裝 bms 服務器;

安裝 Podman 容器管理系統;

創建 kolla 管理用戶;

創建 Python 虛擬環境;

安裝 OpenStack Kolla Ansible;

爲裸金屬配置進行最小化配置;

部署 OpenStack。

2.1 服務器安裝(bms)

對於操作系統安裝,請選擇您偏好的 GNU/Linux 版本並相應地調整配置:

enp1s0 (192.168.0.13/24):LAN網絡

enp2s0 (172.19.74.1/24):OOB/IB網絡

對於 Kolla Ansible 項目來說,至關重要的一點是服務器名稱——在本場景中是 bms 和 bms.ironic.lab——必須解析到 OpenStack 內部服務將要監聽的IP 地址(172.19.74.1)。在所提議的實驗中,這個 IP 地址與OOB/IB 管理網絡的 IP 地址相同。

2.2 Podman

作爲Docker 的直接替代品,Podman 即使對新手來說也很容易使用。安裝非常直接,因爲它已作爲標準軟件包包含在大多數 GNU/Linux 發行版中:

如果您習慣使用 Docker 並希望爲了方便而保留 docker 命令,您也可以安裝 podman-docker 包,它會爲此創建一個專用的包裝器。然而,在大多數情況下,一個簡單的 alias docker=podman 可能就足夠了。

與 Docker 最明顯的區別之一是,Podman 使用調用它的用戶來運行容器,而不依賴於一個集中的守護進程。如果多個用戶運行容器,那麼只有擁有這些容器的用戶才能通過 podman container ps 命令看到它們;root 用戶也不例外。

2.3 管理用戶

創建一個管理用戶(例如 kolla)來執行各種操作,始終是一個好的實踐。這在安全性和功能性方面都有好處,可以將部署環境與您的個人用戶或 root 用戶分離開來:

注意:--add-subids-for-system選項是必需的,以允許即使是系統用戶也能執行無根容器 (rootless containers)。

確保該用戶能夠通過 sudo 執行 root 命令:

現在我們可以用 kolla 管理用戶連接並繼續進行服務器配置。

2.4 Python 虛擬環境(venv)

用於裸金屬配置和部署 OpenStack 本身的 OpenStack 組件也可以作爲PyPI 包獲取。在大多數最新的 GNU/Linux 發行版中,強烈不建議在系統級別安裝 Python 包。要擁有一個包含必要軟件的 Python 環境,而又不“污染”系統的 Python 環境,最方便的方法是創建一個與先前創建的管理用戶相關聯的Python 虛擬環境:

修改用戶主目錄中的 .profile 文件可以在每次登錄時自動激活虛擬環境。同時,使用 --system-site-packages選項可以訪問系統的 Python 庫(例如 python3-dbus),而無需重新安裝它們。

注意:要在虛擬環境中安裝 dbus-python 包(相當於系統包 python3-dbus),從而避免使用 --system-site-packages 選項,您需要安裝開發工具:sudo apt install build-essential pkg-config libdbus-1-dev libglib2.0-dev python3-dev。如果您選擇這條路,最好在生產環境中安裝後移除編譯器。

2.5 OpenStack Kolla Ansible

Kolla Ansible 項目的主要目標是簡化和最大化 OpenStack 配置和管理的效率。爲實現這一目標,它利用Ansible實現自動化和可復現性,並將 OpenStack 組件封裝在Docker 容器中,以簡化其部署、更新和擴展。

Kolla Ansible 依賴於一個特定且嚴格的 Python 包及其各自版本的鏈條。使用先前配置的Python 虛擬環境有助於在 kolla-ansible 包的各種版本之間保持分離和一致性,特別是 Ansible 本身及其各種 Ansible Galaxy 庫依賴項。

注意:tree 和 yq 包不是必需的;它們包含本文中用於目錄檢查和簡化 YAML 和 JSON 文件管理的實用程序。

讓我們安裝 OpenStack 命令行客戶端:

可選地,如果您想在登錄時通過 [tab] 鍵啓用命令自動補全,可以創建以下文件和目錄:

要配置 Kolla Ansible,您需要提供一對YAML 文件,globals.yml 和 passwords.yml,它們定義了配置以及與各種已啓用組件的系統用戶相關聯的憑據集。此外,還需要一個Ansible inventory文件。所有這些文件都應放在默認目錄 /etc/kolla 中,或由 KOLLA_CONFIG_PATH 環境變量指定的目錄中。

利用 kolla 系統用戶的主目錄,我們將所有配置文件放在 /var/lib/kolla/etc 中。

注意:擁有一個不同於默認值 (/etc/kolla) 的配置目錄,可以防止在重置 Kolla 環境時(例如,使用 kolla-ansible destroy 命令)意外刪除其文件。

對於 inventory,我們將使用提供的示例all-in-one文件,passwords.yml 文件也類似。後者是一個模板,稍後將使用 kolla-genpwd命令填充:

同時,我們將用一個最小化版本替換 globals.yml 配置文件:

注意:如果您使用的是基於ARM 處理器的系統,容器也必須遵循相同的架構。只需取消註釋 openstack_tag_suffix: "-aarch64"這一行即可下載正確的容器。

在使用 Ansible playbooks 並嘗試解讀任何以 JSON 表示的錯誤消息之前,使用一種稍微更易讀的輸出格式可能會很方便,例如YAML:

爲了驗證一切是否正確,讓我們運行 kolla-ansible prechecks 命令:

我們收到的紅色錯誤消息表明缺少兩個文件,它們代表Ironic Python Agent (IPA)的內核和ramdisk:

顧名思義,它是一個用 Python 編寫的代理,充當裸金屬服務器和 OpenStack Ironic 之間的中介。它由一個實時的、在內存中運行的 GNU/Linux 操作系統組成,通過網絡啓動(PXE)加載到要管理的服務器上。

目前,我們將從 OpenStack 文檔

(https://tarballs.opendev.org/openstack/ironic-python-agent/dib/files/)

下載一個預構建的版本:

這兩個文件(ironic-agent.kernel 和 ironic-agent.initramfs)必須放在 $KOLLA_CONFIG_PATH/config/ironic/ 目錄中。稍後它們將被一個爲我們的需求專門創建的自定義版本所取代。

現在我們可以重新運行 kolla-ansible prechecks 命令:

注意:每個報告的錯誤都必須被糾正,並且預檢查步驟必須重新執行,直到獲得一個乾淨的結果(errors=0)。

2.6 OpenStack Ironic “獨立”配置

在“獨立”模式下,Ironic 可以獨立於其他 OpenStack 服務運行。這使您可以使用其功能而無需安裝整個雲平臺(儘管您會放棄私有云環境可能提供的一系列高級功能)。因此,$KOLLA_CONFIG_PATH/globals.yml 文件包含以下幾行:

enable_openstack_core: false選項禁用了所有本應由 Kolla Ansible 自動安裝的組件,包括 Keystone、Glance、Nova、Neutron、Heat 和 Horizon。相反,enable_ironic: true只啓用了 Ironic。

2.6 Ironic 配置

ironic.conf配置文件,應放置在 $KOLLA_CONFIG_PATH/config/ 中,必須包含特定的指令以啓用要支持的 BMC 類型(Ironic 稱之爲硬件類型 (Hardware Types))以及其他關於如何管理特定領域的說明。

對於 Ironic 管理的每個領域,都有相應的“接口”來控制操作:

BIOS:管理 BIOS 設置。

Boot:提供引導機制(例如,PXE、虛擬介質等)。

Console:訪問串行控制檯。

Deploy:管理節點安裝和清理。

Firmware:更新 BIOS/UEFI、RAID 控制器等。

Inspect:收集硬件配置。

Management:管理服務器引導模式。

Network:與 OpenStack 的網絡服務交互。

Power:管理電源狀態。

RAID:配置 RAID 卷。

Rescue:提供恢復功能。

Storage:與 OpenStack 的存儲系統交互。

Vendor:提供額外的特定於供應商的功能。

在 [conductor] 部分,我們可以指定用於系統安裝和恢復的默認內核和 ramdisk。變量 ironic_http_interface_address 和 ironic_http_port——其名稱已足夠自明——將在實際配置文件創建過程中由 Ansible 用其各自的值進行擴展。

2.7 OpenStack 部署

讓我們檢查一下配置目錄 $KOLLA_CONFIG_PATH,它應該包含以下文件:

globals.yml:OpenStack Kolla 的 YAML 配置文件;

passwords.yml:包含各組件使用的用戶和密碼的 YAML 文件;

ansible/inventory/all-in-one:默認的 Ansible inventory;

config/ironic.conf:包含 OpenStack Ironic 特定配置選項的 INI 文件;

config/ironic/ironic-agent.{kernel,initramfs}:與 Ironic Python Agent 相關的二進制文件。

要在實際部署前預先驗證配置,您可以運行 kolla-ansible validate-config 命令,如果沒有錯誤需要糾正,最終可以繼續執行 kolla-ansible deploy 命令:

注意:如果出現錯誤,爲了獲得更多的調試信息,您可以通過使用相應數量的“-v”選項重新運行命令來增加 Ansible 消息的“詳細程度”(例如,kolla-ansible deploy -vvv)。

部署完成後,將有多個容器處於活動狀態:一些是服務容器,另一些是 OpenStack Ironic 特有的容器:

kolla_toolbox:這是一個管理“代理”容器。

cron:用於執行計劃的批處理操作(例如,logrotate)。

mariadb[tcp/3306]:用於 OpenStack 持久化數據的數據庫。

rabbitmq[tcp/5672]:用於跟蹤事務性或有狀態活動的消息隊列。

ironic_conductor:Ironic 的業務邏輯。

ironic_api[tcp/6385]:RESTful API 前端 (裸金屬 API)。

ironic_tftp[udp/69]:用於通過 PXE 提供內核和 ramdisk 的 Trivial FTP (FTP over UDP)。

ironic_http[tcp/8089]:HTTP 倉庫。

ironic_dnsmasq[udp/67]:DHCP 服務器。

相關組件的最終配置可以在 /etc/kolla 目錄中找到,該目錄只能用 root 權限訪問:

這包括默認的OpenStack Kolla配置,並結合了位於由$KOLLA_CONFIG_PATH變量標識的目錄下 config文件夾中文件的特定變動。在本實驗中,該目錄是 /var/lib/kolla/etc/config,而默認情況下應爲 /etc/kolla/config。

或者,託管自定義配置文件的目錄可以在 globals.yml文件中通過設置 node_custom_config 變量來定義 。

注意:這些配置文件可以獨立於部署過程,使用 kolla-ansible genconfig 命令生成。

要檢查Ironic服務是否已啓動並運行,我們可以直接使用命令 curl http://172.19.74.1:6385 | yq -y 查詢 API:

我們再通過命令行測試一下客戶端:

作爲第二種選擇,您可以用OS_ENDPOINT和OS_AUTH_TYPE環境變量替換 --os-endpoint 和 --auth-type 參數:

另外,OpenStack 客戶端會按特定順序在以下文件系統位置使用一個名爲 clouds.yaml 的文件:

當前目錄

~/.config/openstack目錄

/etc/openstack目錄

注意:如果 clouds.yaml 文件中有多個配置,則必須使用 --os-cloud 命令行選項(例如,openstack --os-cloud=ironic …)或通過 OS_CLOUD 環境變量(例如,export OS_CLOUD=ironic)來指定相關條目。

如有相關問題,請在文章後面給小編留言,小編安排作者第一時間和您聯繫,爲您答疑解惑。

未完待續…