定製裸機:Ironic的Deploy Templates


定製裸機:Ironic的Deploy Templates

Ironic簡述

OpenStack Ironic就是一個進行裸機部署安裝的項目。所謂裸機,就是指沒有配置操作系統的計算機。從裸機到應用還需要進行以下操作:

  • 硬盤RAID、分區和格式化;
  • 安裝操作系統、驅動程序;
  • 安裝應用程序。

Ironic實現的功能,就是可以很方便的對指定的一臺或多臺裸機,執行以上一系列的操作。例如部署大數據群集需要同時部署多臺物理機,就可以使用Ironic來實現。Ironic可以實現硬件基礎設施資源的快速交付。

OpenStack Ironic的Deploy Templates功能使我們更容易的自動配置裸機服務。

BIOS和RAID

驅動deploy templates工作的最需要的功能是動態BIOS和RAID配置。讓我們考慮deploy templates之前的狀態。

長期以來,Ironic支持一種叫做“清理”的功能。這通常用於執行清理硬件的操作,但也可以執行一些一次性配置任務。有兩種模式——自動和手動。當節點被解除配置時,會發生自動清理。自動清理的一個典型用例是擦除磁盤以刪除敏感數據。當節點不在使用時,按需進行手動清理。下圖顯示了與清理相關的節點狀態的簡化視圖。

定製裸機:Ironic的Deploy Templates

清理工作是通過執行一系列清理step來完成的,這些step映射到使用中的Ironic驅動程序公開的方法。每個清理step都有以下字段:

  • 接口:deploy,電源,管理,BIOS, raid
  • step:驅動程序界面上的方法(功能)名稱
  • args:關鍵字參數字典
  • 優先級:執行順序(更高的運行在前面)

BIOS

在Rocky版本中增加了BIOS配置支持。該BIOS驅動程序接口提供了兩個清理step:

  • apply_configuration:應用BIOS配置
  • factory_reset:將BIOS配置重置為出廠默認值

這是一個使用BIOS驅動程序界面禁用超線程的清理step的示例:

<code>{
"interface": "bios",
"step": "apply_configuration",
"args": {
  "settings": [
    {
      "name": "LogicalProc",

      "value": "Disabled"
    }
  ]
}
}/<code>

RAID

在Mitaka版本中增加了對RAID配置的支持。該RAID驅動程序接口提供了兩個清理step::

  • create_configuration:創建RAID配置
  • delete_configuration:刪除所有RAID虛擬磁盤

在清理之前,必須在單獨的API調用中設置目標RAID配置。

<code>{
"interface": "raid",
"step": "create_configuration",
"args": {
  "create_root_volume": true,
  "create_nonroot_volumes": true
}
}/<code>

當然,對BIOS和RAID配置的支持取決於硬件。

侷限性

儘管通過清理觸發的BIOS和RAID配置可能很有用,但它有許多限制。該配置未集成到Ironic節點部署中,因此用戶無法按需選擇配置。Nova用戶無法使用清理功能,因此只有管理員可以使用。最後,需要單獨的API調用來設置目標RAID配置,這一要求非常繁雜,並且會阻止RAID在自動清理中的配置。

考慮到這些限制,讓我們考慮定製裸機的目標。

目標

我們希望允許將硬件資源池應用於各種任務,併為每個任務使用最佳服務器配置。一些例子:

  • 僅有一堆磁盤(JBOD)的Hadoop節點
  • 具有鏡像磁盤和條帶化磁盤的數據庫服務器(RAID 10)
  • 具有優化的BIOS參數的高性能計算(HPC)計算節點

為了避免對硬件進行分區,我們希望能夠在部署裸機實例時動態配置這些內容。

我們也想使其雲化管理。它不應該要求管理員特權,而是應該從硬件規範中抽象出來。操作員應該能夠控制可以配置的內容以及可以配置的人員。我們還希望儘可能使用現有的接口和概念。

回顧:Nova中的Scheduling

理解deploy templates的機制需要合理地瞭解scheduling在Ironic的Nova中是如何工作的。Placement服務在Newton版本中添加到Nova,並在Stein版本中成為單獨項目。它提供了一個用於跟蹤資源Inventory和消耗的API,支持定量和定性兩個方面。

讓我們開始介紹Placement中的關鍵概念。

  • 資源提供程序提供不同resource class的資源Inventory
  • 資源提供者可能被標記為一個或多個Traits
  • 使用者可能具有消耗資源提供者的某些Inventory的分配

Scheduling虛擬機

對於虛擬機,這些概念映射如下:

  • 計算節點提供vCPU、磁盤和內存資源的Inventory
  • 計算節點可以標記一個或多個Traits
  • 一個實例可能有一個消耗計算節點的一些Inventory的分配

具有35GB磁盤、5825MB RAM和4個CPU的虛擬機監控程序可能會在Placement中有一個資源提供程序inventory記錄,該記錄通過GET/resource和providers/{uuid}/inventory訪問,如下所示:

<code>{
  "inventories": {
      "DISK_GB": {
          "allocation_ratio": 1.0, "max_unit": 35, "min_unit": 1,
          "reserved": 0, "step_size": 1, "total": 35
      },
      "MEMORY_MB": {
          "allocation_ratio": 1.5, "max_unit": 5825, "min_unit": 1,
          "reserved": 512, "step_size": 1, "total": 5825
      },
      "VCPU": {
          "allocation_ratio": 16.0, "max_unit": 4, "min_unit": 1,
          "reserved": 0, "step_size": 1, "total": 4
      }
  },
  "resource_provider_generation": 7
}/<code>

請注意,inventory跟蹤了系統管理程序的所有資源,無論它們是否被消耗。分配跟蹤實例消耗了什麼。

Scheduling裸機

上述針對VM的調度不適用於裸機。裸機節點是不可分割的單元,不能被多個實例共享或過量使用。它們不是處於在用狀態就是沒在用狀態。要解決此問題,我們在Nova和Ironic中對Placement的使用會略有不同。

  • 裸機節點提供自定義資源的一個單元的inventory
  • 裸金屬節點可以標記一個或多個Traits
  • 一個實例可能有一個消耗所有裸機節點資源Inventory的分配

現在,如果我們查看裸機節點的資源提供者inventory記錄,則可能如下所示:

<code>{
  "inventories": {
      "CUSTOM_GOLD": {
          "allocation_ratio": 1.0,
          "max_unit": 1,
          "min_unit": 1,
          "reserved": 0,
          "step_size": 1,
          "total": 1
      }
  },
  "resource_provider_generation": 1
}/<code>

我們只有一個resource class的一個單元,在本例中是CUSTOM_GOLD。resource class來自節點的resource_class字段,採用大小寫敏感形式,前綴為CUSTOM_,表示它是一個自定義resource class,而不是像VCPU這樣的標準resource class。

調度到該節點需要哪種Nova Flavor?

<code>openstack flavor show bare-metal-gold -f json \\
  -c name -c ram -c properties -c vcpus -c disk
{
"name": "bare-metal-gold",
"vcpus": 4,
"ram": 4096,
"disk": 1024,
"properties": "resources:CUSTOM_GOLD='1',
                resources:DISK_GB='0',
                resources:MEMORY_MB='0',
                resources:VCPU='0'"
}/<code>

請注意,可以出於參考目的指定標準字段(vcpus等),但應使用如上所示的屬性將其歸零。

Traits

到目前為止,我們已經討論了基於數量資源的調度。Placement使用traits來標誌資源。它們與資源提供程序關聯。例如,我們可以查詢GET/resource_providers/{uuid}/traits以查找有關FPGA設備類的信息。

<code>{
  "resource_provider_generation": 1,
  "traits": [
      "CUSTOM_HW_FPGA_CLASS1",
      "CUSTOM_HW_FPGA_CLASS3"
  ]
}/<code>

Ironic的節點除了其resource class之外,還可以分配有Traits:GET/nodes/{uuid}?fields=name,resource_class,traits:

<code>{
"Name": "gold-node-1",
"Resource Class": "GOLD",
"Traits": [
  "CUSTOM_RAID0",
  "CUSTOM_RAID1",
]
}/<code>

與定量調度類似,在創建實例時可以通過Flavor指定Traits。

<code>openstack flavor show bare-metal-gold -f json -c name -c properties
{
"name": "bare-metal-gold",
"properties": "resources:CUSTOM_GOLD='1',
                resources:DISK_GB='0',
                resources:MEMORY_MB='0',
                resources:VCPU='0',
                trait:CUSTOM_RAID0='required'"
}/<code>

為了允許Ironic對象根據請求的Traits採取行動,所需Traits的列表存儲在instance_info字段下的Ironic節點對象中 。

這種flavor將選擇具有resource_class為 CUSTOM_GOLD的裸機節點,以及包括CUSTOM_RAID0的Traits列表。

Ironic的deploy step

Ironic的deploy step框架是在Rocky版本中添加的,作為使部署過程更加靈活的第一步。它基於前面描述的清理step模型,並允許驅動程序定義可在部署期間執行的step。這是我們前面看到的簡化狀態圖,這次突出顯示了執行deploy step的部署狀態。

定製裸機:Ironic的Deploy Templates

每個deploy step都具有:

  • 接口:部署,電源,管理,BIOS, Raid
  • step:驅動程序界面上的方法(功能)名稱
  • args:關鍵字參數字典
  • 優先級:執行順序(較高的運行順序更早)

請注意,這與清理step相同。

更進一步

部署過程的大部分被轉移到一個叫做deploy on the deploy interface的step,優先級為100。此step大致執行以下操作:

  • 打開節點以啟動代理
  • 等待代理啟動
  • 將映像寫入磁盤
  • 斷電關機
  • 從供應網絡分離
  • 接入租戶網絡
  • 設置啟動模式
  • 開機

驅動程序當前可以在此step之前或之後添加step。該計劃將其分為多個核心step,以對部署過程進行更精細的控制。

侷限性

對於一組給定的驅動程序接口,deploy step是靜態的,並且當前都處於帶外——無法在部署代理上執行step。

Ironic的deploy templates

Ironic的deploy templates API是在Stein週期中添加的,它允許註冊deploy templates,這些模板具有:

  • 一個名字,必須是一個有效的Traits
  • deploy step列表

例如,可以通過POST/v1/deploy_templates註冊一個deploy templates:

<code>{
  "name": "CUSTOM_HYPERTHREADING_ON",
  "steps": [
      {
          "interface": "bios",
          "step": "apply_configuration",
          "args": {
              "settings": [
                  {
                      "name": "LogicalProc",
                      "value": "Enabled"
                  }
              ]
          },
          "priority": 150
      }
  ]
}/<code>

該模板的名稱為CUSTOM_HYPERTHREADING_ON(這也是有效的Traits名稱),並引用bios接口上的deploy step,該step將LogicalProc BIOS設置為Enabled,以便在節點上啟用超線程。

未來的RAID

在Stein版本中,我們具有deploy template和steps框架,但是缺少帶有deploy steps實現的驅動程序來實現這一點。作為定製裸機會話演示的一部分,我們構建並演示了一個概念驗證deploy step,用於在Dell計算機上部署期間配置RAID。這段代碼經過了潤色,在編寫時正在向上遊運行,還影響了HP iLO驅動程序的deploy step。感謝Shivanand Tendulker從PoC中提取並更新了一些代碼。

現在,我們在RAID接口上有一個apply_configuration deploy step,該step接受RAID配置作為參數,以避免清理時需要單獨的API調用。

在iDRAC驅動程序中實現此功能的第一階段花費了30分鐘以上才能完成部署。通過將刪除和創建虛擬磁盤整合到一個deploy step中,從而避免了不必要的重啟,從而將流程精簡到僅10分鐘。

端到端流程

現在我們知道deploy template的樣子,那如何使用它們?

首先,雲操作員通過Ironic API創建deploy templates,以執行允許的操作的deploy steps。在此示例中,我們具有用於創建42GB RAID1虛擬磁盤的deploy template。

<code>cat << EOF > raid1-steps.json
[
  {
      "interface": "raid",
      "step": "apply_configuration",

      "args": {
          "raid_config": {
              "logical_disks": [
                  {
                      "raid_level": "1",
                      "size_gb": 42,
                      "is_root_volume": true
                  }
              ]
          }
      },
      "priority": 150
  }
]
EOF
openstack baremetal deploy template create \\
  CUSTOM_RAID1 \\
  --steps raid1-steps.json/<code>

接下來,操作員創建具有引用deploy template名稱的所需Traits的Nova flavor或Glance鏡像。

<code>openstack flavor create raid1 \\
  --property resources:VCPU=0 \\
  --property resources:MEMORY_MB=0 \\
  --property resources:DISK_GB=0 \\
  --property resources:CUSTOM_COMPUTE=1 \\
  --property trait:CUSTOM_RAID1=required/<code>

最終,用戶使用他們可以訪問的這些flavor創建一個裸機實例。

<code>openstack server create \\
  --name test \\
  --flavor raid1 \\
  --image centos7 \\
  --network mynet \\
  --key-name mykey/<code>

會發生什麼?裸金屬節點由Nova調度,Nova具有flavor和鏡像所需的所有Traits。然後,這些特性被Ironic用來查找具有匹配名稱的deploy template,並且這些模板中的deploy steps除了核心step之外,還按照它們的優先級確定的順序執行。在本例中,RAID apply_configuration deploystep在核心step之前運行,因為它具有更高的優先級。

未來的挑戰

仍有工作要做以提高裸機部署的靈活性。我們需要支持在節點上運行的代理中執行step,這將使部署時使用CERN的Arne Wiebalck最近開發的軟件RAID支持成為可能。

驅動程序需要針對BIOS,RAID和其他功能公開更多deploy steps。我們應該就如何多次執行一個step以及所有棘手的極端情況達成共識。

我們已經在這裡討論了Nova用例,但是我們也可以在獨立模式下使用deploy step,方法是將要執行的step列表傳遞給Ironic的provision API調用,類似於手動清理。Madhuri Kumari還提出了一個規範,它允許重新配置活動節點,以便在不需要重新部署的情況下調整BIOS設置。

感謝所有參與設計、開發和評審Nova和Ironic系列功能的人,這些功能使我們走到了今天。特別是John Garbutt提出了deploy steps和deploy templates的規範,Ruby Loo實現了deploy steps框架。


原文:http://www.stackhpc.com/bespoke-bare-metal.html

更多幹貨技術文章請訪問新鈦雲服官網https://www.tyun.cn


分享到:


相關文章: