OpenStack Ironic實現原理簡介

來源於問題:OpenStack ironic組件如何管理物理機?

Ironic是OpenStack裸機管理服務(baremetal as service),裸機即沒有安裝任何操作系統的物理伺服器。雖然ironic支持standalone部署模式,但通常會協同OpenStack其他服務共同工作,具體分工如下:

  • Keystone:認證與授權。
  • Glance:為裸機提供鏡像服務,保存OS安裝介質。
  • Nova:負責裸機調度,提供裸機服務。
  • Ironic:裸機管理,包括裸機信息錄入、硬體信息自動發現等。
  • Neutron:裸機網路管理和配置。
  • Swift:保存ConfigDrive數據,後面細講。

以上,比較容易混淆的是Ironic組件和Nova組件的分工,Ironic是裸機管理,可以類同為企業的IT資產管理系統,而Nova是提供裸機服務的,可以認為是給用戶分配物理伺服器的。底層技術實現上,Ironic是Nova的其中一種ComputeDrive,和Libvirt平行,一個裸機node對應Nova的一個Hypervisor實例。

通常用戶只需要和Nova交互,只有管理員才需要與Ironic交互。創建裸機和創建虛擬機完全一樣,都是調用nova boot API,指定flavor、image、network等參數。如果平台既有裸機又有虛擬機,nova-scheduler怎麼知道調度的是虛擬機還是裸機呢?答案是通過flavor的extra specs過濾,裸機錄入時會指定一些硬體特性,如cpu-arch、boot-option,裸機的flavor也會添加這些硬體特性,nova-scheduler調度時會一一比對這些特性,從而保證調度的是裸機hypervisor。

既然Ironic和Libvirt是平行的,那自然裸機和虛擬機有很多相似的地方,二者都是提供OS服務,大多數用戶其實並不關心底層是裸機還是虛擬機的。

因此為了更好的理解裸機的實現原理,不妨和虛擬機的操作原理做個對比。

首先介紹電源管理,虛擬機的開關機直接調用libvirt API即可。裸機伺服器則通過調用IPMI指令進行伺服器的遠程電源管理。當然IPMI並不是唯一的方式,ironic還支持如redfish、redfish,ilo,irmc等。

裸機的裝機是Ironic最重要的功能。虛擬機創建的過程是compute節點向Glance下載鏡像到本地目錄,定義虛擬機xml模板,鏡像文件映射為虛擬機的一個虛擬塊設備,調用libvirt啟動虛擬機。而裸機部署則相對複雜些。首先conductor節點會啟動一個TFTP服務,保存有操作系統的bootloader文件,而Neutron可提供DHCP服務,並提供TFTP服務的地址。Ironic會首先從Glance下載initramfs鏡像到conductor節點的TFTP路徑,然後通過IPMI命令開機伺服器,並設置從PXE啟動(網卡需要提前開啟PXE功能)。裸機伺服器PXE引導後,自動從TFTP下載bootloader文件,bootloader會告訴伺服器載入deploy initramfs和deploy kernel,啟動deploy操作系統。deploy操作系統僅僅是一個臨時的操作系統,並沒有安裝到硬碟,可以認為是一個內存精簡操作系統,該操作系統除了安裝一些必要的驅動和工具外,還安裝了ironic-python-agent。deploy操作系統起來後,agent會下載用戶鏡像到本地(或者通過iscsi協議attach到conductor節點),通過規則找到需要安裝的目標設備,比如/dev/sda。然後對該硬碟設備進行清零操作後(dd if=/dev/zero of=/dev/sda, sgdisk),把下載的鏡像dd到設備中(qemu-img convert -t directsync -O host_device test.img /dev/sda)。如果配置了ConfigDrive,則還會從Swift下載ConfigDrive文件並拷貝到設備的一個單獨分區中。鏡像和ConfigDrive數據都全部拷貝完後agent會發送信號給conductor,conductor收到該信號,意味著操作系統安裝完成,調用IPMI重啟伺服器,並設置從本地硬碟啟動(boot_option為local),伺服器再次起來後就可以進入指定的操作系統了。

如上有個細節需要注意的是,deploy操作系統需要與conductor服務和Swift通信,意味著網路必須和管理網通,這裡存在安全隱患的。因此ironic支持指定單獨的部署網路(provision網路),該網路只在部署時臨時使用,與用戶的租戶網路隔離。PXE啟動時會使用provision網路,操作系統安裝完後會自動切換為用戶指定的網路,即期間會有一個切port的過程。

另外關於鏡像,物理伺服器和虛擬機的鏡像是有區別的,物理伺服器往往需要安裝更多的硬體驅動。官方提供了使用DIB製作裸機的鏡像的方法:Create and add images to the Image service。如果需要從虛擬機鏡像轉化為裸機鏡像,需要注意更新initramfs文件,因為該initramfs可能並沒有包含硬體設備驅動,啟動時識別不了硬碟導致進入操作系統失敗。通常rhel以及suse系列通過dracut工具生成即可,需要注意禁用Host-Only模式,否則換一個型號的伺服器可能又由於硬體驅動不兼容導致引導不起來。另外如果鏡像操作系統有LVM分區,則必須添加dracut驅動lvm,否則會不識別vg,這個坑折騰了很久。。。

關於網路,虛擬機是通過OVS或者Linux Bridge實現vswitch,而Ironic裸機則管理的是物理交換機設備。目前Ironic支持兩種網路模式,其中一種為flat模式,該模式下不支持配置硬體交換機,需要提前做好裸機的網路接入,支持的Neutron網路類型為flat或者vlan。另一種為neutron模式,該模式需要配置交換機埠信息和登錄信息,該模式更靈活,並且支持多租戶。

安裝完操作系統後,和虛擬機一樣,支持通過cloud-init進行OS初始化,如主機名修改、密碼密鑰注入等功能。除此之外,還可以通過cloud-init實現物理伺服器網卡bond配置。不過如果需要支持bond,datasource貌似不能使用OpenStack,而必須使用ConfigDrive。前面提過,裸機和虛擬機的ConfigDrive實現不一樣,虛擬機是通過計算節點的一個虛擬設備文件映射給虛擬機的,而裸機則需要把Configdrive數據上傳到Swift,agent從Swift下載到本地並dd到硬碟設備的一個分區中。

虛擬機可以通過VNC實現Web console,用戶可以通過頁面訪問操作系統。裸機沒有VNC的概念,console功能可通過SOL(IPMI Serial Over LAN)實現,因此需要在IPMI上開啟SOL功能,並且操作系統也需要開啟Stty功能,如果使用DIB製作鏡像,需要添加enable-serial-console element。實現了console功能,如何實現Web console呢?我們知道虛擬機的VNC是通過nova-novncproxy代理轉發到計算節點libvirt VNC的。裸機的console同理也是通過層層代理轉發實現的,首先conductor節點通過socat把IPMI SOL轉發到本地的一個埠中,如15900,然後通過nova-serialconsoleproxy負責轉發到conductor節點綁定的埠15900,即用戶訪問Web console -> nova-serialconsoleproxy -> ironic-conductor -> IPMI SOL。不過社區存在一個bug導致通過nova get-serial-console獲取web console失敗,目前已提交代碼到社區,等待core review,如果merge的話後續就不會出現這個問題了。

OpenStack虛擬機支持rescue,即進入拯救模式,可以用來修復操作系統故障,實現原理是重新指定一個鏡像rebuild重建虛擬機,並把原根磁碟(root disk)作為重建虛擬機的附加硬碟掛載,用戶可進入新的操作系統,chroot到原操作系統的根分區進行修復。裸機也支持rescue模式,實現原理和裝機過程類似,通過PXE啟動一個initramfs臨時內存操作系統,用戶進入該操作系統進行操作系統修復。

剩下最後一個問題,關於伺服器的回收。虛擬機回收比較簡單,只需要把虛擬機從libvirt中移除並刪除鏡像文件即可。裸機則不一樣,需要考慮數據的安全性,回收必須清零硬碟。刪除裸機時,會進入initramfs臨時操作系統進行clean,對所有的硬碟進行dd清零。

其他功能與虛擬機的對比:

虛擬機支持遷移,裸機不支持。不過裸機支持rebuild操作,即重裝系統。

虛擬機支持掛載volume,裸機目前不支持。

虛擬機支持擴容修改flavor,裸機不支持。

虛擬機支持創建快照,裸機不支持。

虛擬機支持通過qemu-guest-agent動態修改操作系統密碼,裸機不支持(可通過rescue重置密碼)。

如上,通過對比虛擬機,簡單的介紹了OpenStack Ironic裸機的實現原理。目前看國內Ironic的介紹還不是特別多,後續準備寫幾篇系列文章更詳細地介紹下Ironic。


推薦閱讀:

TAG:OpenStack | 雲計算 | x86 |