沖突與碰撞:OpenStack中的虛擬機(jī)和裸機(jī)
要虛擬化還是非虛擬化?
如果您追求性能,那么就沒有爭(zhēng)議——裸機(jī)仍然勝過虛擬機(jī);特別是對(duì)于I/O密集型應(yīng)用程序。但是,除非您可以保證充分利用它,否則是有代價(jià)的。在本文中,我們描述了如何使用Nova來以統(tǒng)一的方式提供對(duì)虛擬機(jī)管理程序和裸機(jī)計(jì)算節(jié)點(diǎn)的訪問。
scheduling
當(dāng)Nova首次引入通過Ironic支持裸機(jī)計(jì)算時(shí),它不能輕松地與傳統(tǒng)的基于hypervisor的工作負(fù)載共存。當(dāng)時(shí)的解決方法通常涉及使用宿主aggregates和flavor特性。
我們?cè)诙ㄖ频穆銠C(jī)博客文章中詳細(xì)介紹了 裸機(jī)調(diào)度(請(qǐng)參閱概述:Nova中的調(diào)度)。
自引入Placement服務(wù)以來,裸機(jī)的scheduling已發(fā)生了顯著變化。對(duì)于每個(gè)Ironic節(jié)點(diǎn),將標(biāo)準(zhǔn)vCPU,內(nèi)存和磁盤資源替換為自定義資源類的單個(gè)單元。這有兩個(gè)關(guān)鍵的副作用:
- 裸機(jī)節(jié)點(diǎn)已完全分配或根本未分配
- 虛擬機(jī)和裸機(jī)使用的資源類是不相交的,因此我們最終無法將VM Flavor調(diào)度到裸機(jī)節(jié)點(diǎn)
“tiny” VM的flavor可能如下所示:
- openstack flavor show vm-tiny -f json -c name -c vcpus -c ram -c disk -c properties
- {
- "name": "vm-tiny",
- "vcpus": 1,
- "ram": 1024,
- "disk": 1,
- "properties": ""
- }
“gold”節(jié)點(diǎn)的裸機(jī)flavor可能如下所示:
- openstack flavor show bare-metal-gold -f json -c name -c vcpus -c ram -c disk -c properties
- {
- "name": "bare-metal-gold",
- "vcpus": 64,
- "ram": 131072,
- "disk": 371,
- "properties": "resources:CUSTOM_GOLD='1',
- resources:DISK_GB='0',
- resources:MEMORY_MB='0',
- resources:VCPU='0'"
- }
請(qǐng)注意,vCPU/RAM/Disk資源僅供參考,并通過屬性歸零以進(jìn)行調(diào)度。我們稍后將進(jìn)一步討論這個(gè)問題。
那網(wǎng)絡(luò)呢?
在我們的混合環(huán)境中,我們可能希望vm和裸機(jī)實(shí)例能夠相互通信,或者希望它們彼此隔離。這兩種模型都是可能的,并且工作方式與典型的neutron網(wǎng)絡(luò)一樣——neutron網(wǎng)絡(luò)彼此隔離,直到通過neutron路由器連接。
裸機(jī)計(jì)算節(jié)點(diǎn)通常使用VLAN或扁平網(wǎng)絡(luò)。當(dāng)然,通過網(wǎng)絡(luò)硬件和Neutron插件的正確組合,其他模型也是可以的。對(duì)于VLAN網(wǎng)絡(luò),假設(shè)虛擬機(jī)管理程序與裸機(jī)計(jì)算節(jié)點(diǎn)連接到同一物理網(wǎng)絡(luò),然后將VM與裸機(jī)計(jì)算實(shí)例連接到同一VLAN,這將在它們之間提供L2連接?;蛘?,應(yīng)該可以使用Neutron路由器將VLAN上的裸機(jī)實(shí)例與另一個(gè)網(wǎng)絡(luò)(例如VXLAN)上的VM相連,二這將在他們之間提供L3連接。
實(shí)際上這是什么樣的?我們需要同時(shí)支持VM和裸機(jī)網(wǎng)絡(luò)的Neutron plugins/drivers程序的組合。要將裸機(jī)服務(wù)器連接到租戶網(wǎng)絡(luò),Neutron必須配置物理網(wǎng)絡(luò)設(shè)備。我們通常使用networking-generic-switch ML2機(jī)制驅(qū)動(dòng)程序,盡管networking-ansible驅(qū)動(dòng)程序正在成為一種供應(yīng)商中立的替代方案。這些驅(qū)動(dòng)程序支持裸機(jī)端口,即neutron端口與VNIC_TYPE的baremetal。特定于供應(yīng)商的驅(qū)動(dòng)程序也可用,并且可能同時(shí)支持VM和裸機(jī)。
有何問題?
更成熟的云可能遇到的一個(gè)問題是從基于標(biāo)準(zhǔn)資源類(vCPU、RAM、disk)的調(diào)度過渡到基于自定義資源類的調(diào)度。如果存在在Rocky發(fā)行版或更早版本中創(chuàng)建的舊裸機(jī)實(shí)例,則除了自定義資源類之外,它們?cè)赑lacement中還可能具有標(biāo)準(zhǔn)資源類清單。例如,以下是報(bào)告給Placement的此類節(jié)點(diǎn)的清單:
- $ openstack resource provider inventory list <node UUID>
- +---------------+-----------------+----------+----------+-----------+----------+--------+
- | resource_class | allocation_ratio | max_unit | reserved | step_size | min_unit | total |
- +---------------+-----------------+----------+----------+-----------+----------+--------+
- | VCPU | 1.0 | 64 | 0 | 1 | 1 | 64 |
- | MEMORY_MB | 1.0 | 131072 | 0 | 1 | 1 | 131072 |
- | DISK_GB | 1.0 | 371 | 0 | 1 | 1 | 371 |
- | CUSTOM_GOLD | 1.0 | 1 | 0 | 1 | 1 | 1 |
- +---------------+-----------------+----------+----------+-----------+----------+--------+
如果將此節(jié)點(diǎn)分配給一個(gè)flavor請(qǐng)求(或未顯式清空)標(biāo)準(zhǔn)資源類的實(shí)例,我們將有如下用法:
- $ openstack resource provider usage show <node UUID>
- +----------------+--------+
- | resource_class | usage |
- +----------------+--------+
- | VCPU | 64 |
- | MEMORY_MB | 131072 |
- | DISK_GB | 371 |
- | CUSTOM_GOLD | 1 |
- +----------------+--------+
如果刪除此實(shí)例,則標(biāo)準(zhǔn)資源類清單將變?yōu)榭捎?,并且可由VM的調(diào)度程序選擇。這不可能很好地結(jié)束。我們必須做的是確保不將這些資源報(bào)告給Placement。默認(rèn)情況下,這是在Stein版本的Nova中完成的,并且可以通過在nova.conf中設(shè)置以下內(nèi)容來配置Rocky以執(zhí)行相同的操作:
- [workarounds]
- report_ironic_standard_resource_class_inventory = False
但是,如果我們這樣做,Nova將嘗試從我們的實(shí)例已經(jīng)消耗的Placement資源提供程序中移除庫存,并將收到一個(gè)HTTP 409沖突。這將很快使我們的日志充滿無用的告警。
Flavor遷移
值得慶幸的是,有一個(gè)解決方案。我們可以修改現(xiàn)有實(shí)例中的使用的flavor以刪除標(biāo)準(zhǔn)資源類清單,這將導(dǎo)致從Placement中刪除這些資源的分配。這將使Nova可以從資源提供者處刪除庫存。Matt Riedemann啟動(dòng)了一個(gè)Nova Patch,它將刪除我們的標(biāo)準(zhǔn)資源類清單。該補(bǔ)丁需要推到生產(chǎn)線上,但效果很好,足以被 Rocky版本 生產(chǎn)使用。
遷移可以離線或在線完成。我們選擇離線進(jìn)行此操作,以避免部署此修補(bǔ)程序。對(duì)于每個(gè)要遷移的節(jié)點(diǎn):
- nova-manage db ironic_flavor_migration --resource_class <node resource class> --host <host> --node <node UUID>
或者,如果所有節(jié)點(diǎn)都具有相同的資源類:
- nova-manage db ironic_flavor_migration --resource_class <node resource class> --all
您可以通過數(shù)據(jù)庫檢查實(shí)例包含的flavor是否已正確更新:
- sql> use nova
- sql> select flavor from instance_extra;
現(xiàn)在(僅適用于Rocky),可以禁用標(biāo)準(zhǔn)資源類清單報(bào)告。在nova計(jì)算服務(wù)運(yùn)行了一段時(shí)間之后,展示位置將被更新:
- $ openstack resource provider inventory list <node UUID>
- +---------------+------------------+----------+----------+-----------+----------+-------+
- | resource_class| allocation_ratio | max_unit | reserved | step_size | min_unit | total |
- +---------------+------------------+----------+----------+-----------+----------+-------+
- | CUSTOM_GOLD | 1.0 | 1 | 0 | 1 | 1 | 1 |
- +---------------+------------------+----------+----------+-----------+----------+-------+
- $ openstack resource provider usage show <node UUID>
- +----------------+--------+
- | resource_class | usage |
- +----------------+--------+
- | CUSTOM_GOLD | 1 |
- +----------------+--------+
我們希望這表明OpenStack現(xiàn)在處于虛擬機(jī)和裸機(jī)可以和平共處狀態(tài),即使對(duì)于那些討厭的場(chǎng)景。感謝Nova團(tuán)隊(duì)努力使Ironic成為一流的項(xiàng)目。