【ironic】ironic介紹與原理
零,配置文件
0.1 配置驅動
文件ironic.conf, ipmi硬件類型,默認值也是ipmi, pxe_ipmitool驅動也是默認值,配置驅動
[DEFAULT]
enabled_hardware_types = ipmi
0.2 注冊節點
需要的配置信息:
@ ipmi_address 必須
@ ipmi_username 可選
@ ipmi_password 可選
@ ipmi_port 可選,默認值623
命令創建:
#注冊一驅動為pxe_ipmitool的節點,狀態變為enroll,指ironic知道了這個節點,但是沒有還管理它
ironic node-create -d pxe_ipmitool -u ${ironic_node_uuid}
#設置driver_info),包括驅動相關配置、部署鏡像id
ironic driver-properties pxe_ipmitool
@設置IPMI-BMC
-
ironic node-update ${ironic_node_uuid} add driver_info/ipmi_address=${ipmi_address}
-
ironic node-update ${ironic_node_uuid} add driver_info/ipmi_port=${ipmi_port}
-
ironic node-update ${ironic_node_uuid} add driver_info/ipmi_username=${ipmi_username}
-
ironic node-update ${ironic_node_uuid} add driver_info/ipmi_password=${ipmi_password}
@ 設置部署鏡像
ironic node-update ${ironic_node_uuid} add driver_info/deploy_kernel=${deploy_kernel}
ironic node-update ${ironic_node_uuid} add driver_info/deploy_ramdisk=${deploy_ramdisk}
@ 設置節點屬性(properties
ironic node-update ${ironic_node_uuid} add properties/cpus=10000000
ironic node-update ${ironic_node_uuid} add properties/memory_mb=10000000
ironic node-update ${ironic_node_uuid} add properties/local_gb=10000000
ironic node-update ${ironic_node_uuid} add properties/cpu_arch=x86_64
ironic node-update ${ironic_node_uuid} add instance_info/root_gb=10000000 # must mark this, for find node
ironic node-update ${ironic_node_uuid} add instance_info/capabilities='{"boot_option":"local"}'
@ 檢查驅動接口信息
ironic node-validate ${ironic_node_uuid}
一,狀態圖
- MANAGEABLE(從CLEANING)通過clean API調用
- MANAGEABLE(從INSPECTING)通過inspect API調用
- AVAILABLE(從CLEANING)通過provide API調用
- 擦除驅動器
- 固件完整性驗證
- 驗證節點傳入屬性是否與實際硬件配置匹配
- booting到一個長時間運行的deploy ramdisk
- ACTIVE(從DEPLOYING)通過active API調用
- MANABGEABLE通過manage API調用
- 設置適當的BIOS配置
- 驅動器分區,生成文件系統
- 創建一些子系統需要的附加資源(網絡配置等)
二,Conceptual Architecture
Logical Architecture
Key Technologies for Bare Metal Hosting
PXE
DHCP
NBP
TFTP: 從DHCP server下載NBP
IPMI
部署流程
- 部署物理機的請求通過 Nova API 進入Nova;
- Nova Scheduler 根據請求參數中的信息(指定的鏡像和硬件模板等)選擇合適的物理節點;通過flavor中extra_spec(比如cpu_arch, baremetal:deploy_kerner_id, baremmetal:deploy_ramdisk_id)
- Nova 創建一個 spawn 任務,並調用 Ironic API 部署物理節點,Ironic 將此次任務中所需要的硬件資源保留,並更新數據庫;
- Ironic 與 OpenStack 的其他服務交互,從 Glance 服務獲取部署物理節點所需的鏡像資源,並調用 Neutron 服務為物理機創建網路端口;
- Ironic 開始部署物理節點,PXE driver 准備 tftp bootloader,IPMI driver 設置物理機啟動模式並將機器上電;
- 物理機啟動后,通過 DHCP 獲得 Ironic Conductor 的地址並嘗試通過 tftp 協議從 Conductor 獲取鏡像,Conductor 將部署鏡像部署到物理節點上后,通過 iSCSI 協議將物理節點的硬盤暴露出來,隨后寫入用戶鏡像,成功部署用戶鏡像后,物理節點的部署就完成了。
Ironic-Python-Agent
在PXE部署環境中,deploy模塊是通過打開一個iSCSI設備,ironic-conductro將OS的鏡像文件寫到iSCSI的設備,所以deploy_ramdisk只是完成了iSCSI部署的工作,但開發者覺得既然已經把kernel和ramdisk傳過去了,只做一個工作是不是太少了,而且還太缺乏靈活性了,所以就想在ramdisk里裝一個Python Agent。 實際上就是多提供了一個Restful API,控制節點可以通過這個agent遠程實現與物理機節點互動,而不僅僅使用dd命令。
Ironic Python Agent(簡稱IPA或者agent)是一個基於python的代理,用於處理ironic中裸機節點的一系列動作,比如檢查、配置、清除和部署鏡像。運行在ramdisk中,暴露出REST API給conductor。Ironic-Python-Agent可以在deploy模塊直接訪問硬件,提供以下功能:
- 磁盤格式化
- 磁盤分區
- 安裝OS( Bootloaders, OS)
- 固件升級
- raid配置
在Condutor端使用agent驅動,物理機端使用IPA,IPA通過暴露API給Condutor調用,則可完成相應功能。IPA啟動時通過發送lookup()請求給Condutor獲取UUID,相當於注冊自己,並且每隔一段時間給Condutor發送心跳包進行連接。
1. 與conductor的交互
IPA使用lookup和hearteat機制與Ironic Conductor進行交互
- 啟動時agent給Conductor的vendor_passthru lookup endpoint(地址為/v1/drivers/{driver}/vendor_passthru/lookup)發送一個硬件的profile
- 然后Ironic就可以得出該節點的uuid,在成功發現該節點之后,agent隔N秒發送心跳包給Conductor(hearteat地址為/v1/nodes/{node_ident}/vendor_passthru/heartbeat )
- conductor執行一系列動作,包括查詢已經運行的命令的狀態,
2. 與ramdisk、agent的關系
IPA是一個運行在ramdisk中python程序,當物理機注冊時使用agent為前綴的驅動時,則會使用agent方式部署,即允許包含有IPA的ramdisk。
3. 硬件管理
硬件管理器(HardwareManager)是IPA中的一個概念,IPA通過重寫硬件管理器來支持多種硬件平台。通過自定義 hardware managers 可以允許用戶引入特定的硬件工具集、文件和清除步驟等等,比如可以引入 BIOS flashing utility and BIOS file,然后在cleaning step中重寫BIOS版本。
修改硬件的方法按照優先順序發送給每個管理器,管理器檢查是否包含該方法,如果沒有則拋出IncompatibleHardwareMethodError異常,IPA繼續發送給下一個管理器,直到某個管理器包含該方法並且返回方法的結果,如果所有的管理器都沒有改方法則拋出 HardwareManagerMethodNotFound異常。
4. pxe部署與agent部署對比
使用pxe部署流程:
使用IPA部署流程: