---
# System prepended metadata

title: OpenStack工程師問答

---

# OpenStack工程師問答

**Human:**
你現在是一個開發openstack的資深工程師 我有一些問題要問你

***

**Assistant:**

當然，我很樂意回答你關於OpenStack的問題。請告訴我你想問的是什麼，我將盡力提供協助。


***

**Human:**
我要怎麼自定義自己的scheduler

***

**Assistant:**

自訂義 OpenStack Scheduler 可以讓你根據你的特定需求和策略來控制實例（instances）的調度行為。下面是一些步驟，可以幫助你開始自訂義 Scheduler：

1. 
了解 OpenStack Scheduler 架構：OpenStack Scheduler 是一個模組化的系統，它負責決定將實例調度到哪個運算節點。熟悉 Scheduler 架構和相關組件，例如選擇器（Filters）、加權器（Weighers）和調度器（Scheduler）本身。

2. 
瞭解 Scheduler 選擇器（Filters）：選擇器用於篩選出符合特定條件的運算節點，例如篩選出具有足夠資源的節點或符合特定主機規則的節點。你可以根據你的需求定義自己的選擇器，以便根據特定的條件選擇適當的節點。

3. 
瞭解 Scheduler 加權器（Weighers）：加權器用於給予選擇器篩選後的節點一個權重，以便在最終決策中考慮節點的優先順序。你可以根據你的需求定義自己的加權器，以便根據特定的標準為節點分配權重。

4. 
瞭解 Scheduler 調度器（Scheduler）：調度器是 Scheduler 的核心組件，它使用選擇器和加權器來決定將實例調度到哪個節點。你可以編寫自己的調度器來根據你的需求定製調度邏輯。

5. 
編寫自訂義的選擇器和加權器：根據你的需求，編寫自己的選擇器和加權器。你可以使用 Python 編程語言來實現這些組件。選擇器需要實現 `host_passes()` 方法來判斷一個節點是否符合特定條件。加權器需要實現 `weigh_object()` 方法來計算節點的權重。

6. 
編寫自訂義的調度器：根據你的需求，編寫自己的調度器。你可以繼承並擴展 OpenStack Scheduler 的基礎調度




***

**Human:**
所以我要自定義scheduler的話 我一定需要用到哪些class 跟 function

***

**Assistant:**

若您要自定義 OpenStack Scheduler，以下是一些您可能會用到的主要類別（class）和函式（function）：
1. 
選擇器（Filters）：

- `BaseFilter`：選擇器的基礎類別，您可以繼承此類別來實現自己的選擇器。

- `AggregateFilter`：基於主機集合的選擇器，可用於根據主機集合來篩選節點。

- `AvailabilityZoneFilter`：基於可用區域的選擇器，可用於根據可用區域來篩選節點。

- 其他自定義的選擇器：您可以根據需求自行定義其他選擇器。




6. 
加權器（Weighers）：

- `BaseWeigher`：加權器的基礎類別，您可以繼承此類別來實現自己的加權器。

- `ChanceWeigher`：基於機率的加權器，可用於根據隨機機率分配權重。

- `RAMWeigher`：基於記憶體的加權器，可用於根據主機的記憶體使用情況分配權重。

- 其他自定義的加權器：您可以根據需求自行定義其他加權器。




11. 
調度器（Scheduler）：

- `BaseScheduler`：調度器的基礎類別，您可以繼承此類別來實現自己的調度器。

- `FilterScheduler`：基於選擇器的調度器，可用於根據選擇器篩選節點進行調度。

- `WeightedScheduler`：基於加權器的調度器，可用於根據加權器計算節點權重進行調度。

- 其他自定義的調度器：您可以根據需求自行定義其他調度器。






此外，您還可以使用其他相關的類別和函式，例如：

- `HostManager`：管理節點（主機）的類別，用於獲取節點資訊和狀態。
- `PlacementAPI`：用於與 Nova Placement 服務進行交互的 API 類別，可用於獲取有關節點資源和可用性的資訊。



***

**Human:**
openstack要怎麼知道現在cpu空閒的狀態

***

**Assistant:**

在 OpenStack 中，要獲取節點上 CPU 的空閒狀態，您可以使用 Nova Compute service 提供的 API 或 hypervisor driver 中的相關功能。以下是兩種常見的方式：
1. 
使用 Nova Compute API：

- 使用 `GET /v2.1/os-hypervisors/statistics` 端點可以獲取節點的統計資訊，包括 CPU 的使用情況。這將提供節點的 CPU 總數、已使用的 CPU 數量以及其他統計資料。

- 使用 `GET /v2.1/os-hypervisors/{hypervisor_id}/uptime` 端點可以獲取節點的運行時間信息，可以參考此資訊來判斷節點的 CPU 使用狀態。




4. 
使用 hypervisor driver：

- OpenStack 使用不同的 hypervisor driver 來管理不同的虛擬化平台，例如 KVM、VMware、Hyper-V 等。您可以根據您使用的 hypervisor driver 來進行操作。

- 每個 hypervisor driver 都提供了相應的 API 或方法，可以用於獲取節點的資源狀態，包括 CPU 使用情況。例如，在 KVM 中，您可以使用 libvirt API 來獲取節點的 CPU 狀態。






請注意，具體的實現方式可能因您所使用的 OpenStack 版本、配置和虛擬化平台而有所不同。請參考相應的文檔或官方資源以獲取更多詳細信息，並適應您的環境進行相應的操作。


***

**Human:**
openstack有提供讓別人自定義scheduler，如果沒有定義的話 openstack會怎麼樣來schedule

***

**Assistant:**

在 OpenStack 中，如果您未自定義調度器（scheduler），預設會使用 Nova Scheduler 作為內建的調度器來處理實例（instances）的調度。

Nova Scheduler 是 OpenStack Compute（Nova）服務的一部分，它負責根據預設的調度策略，將實例調度到適合的運算節點。預設情況下，Nova Scheduler 使用一組預定義的選擇器（Filters）和加權器（Weighers）來評估節點的可用性、資源狀態和其他條件，以選擇最佳的節點進行調度。

以下是一些常見的 Nova Scheduler 預設選擇器和加權器：
1. 
預設選擇器（Filters）：

- `AvailabilityZoneFilter`：根據可用區域進行過濾。

- `ComputeFilter`：根據節點的資源使用情況進行過濾，如 CPU、記憶體和磁碟空間。

- `ImagePropertiesFilter`：根據映像屬性進行過濾，如映像的格式或者是否需要 GPU 支援。

- 其他預設選擇器。




6. 
預設加權器（Weighers）：

- `AggregateInstanceExtraSpecsWeigher`：根據實例的額外規格（extra specs）進行加權，例如實例所需的特定主機標籤。

- `RAMWeigher`：根據節點的記憶體使用情況進行加權。

- `DiskFilter`：根據節點的磁碟使用情況進行加權。

- 其他預設加權器。






這些選擇器和加權器可以按照預設配置在 Nova Scheduler 中。當沒有自定義調度器時，Nova Scheduler 將使用這些預設組件來選擇和加權節點，以決定實例的最佳調度位置。

如果您希望自定義 Scheduler，您可以根據您的特定需求和策略，編寫自己的選擇器、加權器和調度器，以替代或擴展 Nova Scheduler 的預設行為。


***

**Human:**
openstack的scheduler是分配資源給某一個instance之後 就完全不會改變資源的分配了嗎

***

**Assistant:**

OpenStack Scheduler 在分配資源給實例之後，通常不會主動更改資源的分配。一旦實例被成功部署到特定的運算節點，資源（例如 CPU、記憶體和磁碟）通常會保持分配不變，直到實例被暫停、重新啟動、重建或遷移。

然而，有一些情況下，OpenStack 可能會自動調整實例的資源分配，這取決於特定的配置和策略：

1. 
自動調整：某些 OpenStack 版本和配置中可能啟用了自動調整（Auto Scaling）功能，該功能可以根據特定的指標（例如 CPU 使用率）自動增加或減少實例的資源分配。這是為了根據工作負載的需求進行動態調整，以達到更好的效能和資源利用率。

2. 
遷移：在某些情況下，OpenStack 可能會根據遷移策略將實例從一個節點遷移到另一個節點。這可能是因為節點故障、資源不足或優化資源分配等原因。遷移時，OpenStack 會確保目標節點具有足夠的資源來容納實例。



請注意，這些行為可能會受到 OpenStack 版本、配置和擴展模組的影響。因此，建議參考相應的文件和官方資源以獲取更詳細的信息，並確定您所使用的特定版本和配置下是否存在額外的資源調整機制。


***

**Human:**
openstack節點的意思是甚麼

***

**Assistant:**

在 OpenStack 中，「節點」（node）通常指的是物理或虛擬的運算資源單元，用於執行虛擬機實例（instances）的計算工作。這些節點可以是物理伺服器、虛擬機、容器或其他支援運行虛擬機的計算資源。

在 OpenStack Compute（Nova）服務中，節點可以是 Nova Compute service 管理的計算節點。這些節點通常具有運算資源，例如處理器（CPU）、記憶體（RAM）、磁碟和網路等。

節點在 OpenStack 中扮演著重要的角色，它們是部署和運行虛擬機實例的基礎。Nova Compute service 會監控節點的狀態，並在需要時進行虛擬機的調度和管理。每個節點可以執行多個虛擬機實例，這取決於節點的運算能力和資源配置。

在整個 OpenStack 集群中，可以有多個節點，並通過 Nova Compute service 進行管理和協調。節點的數量和規模根據實際需求和資源可用性進行配置，以提供彈性的運算能力和服務。

需要注意的是，「節點」一詞可能會因特定的 OpenStack 部署和上下文而有所差異，因此在具體的情境中，可能會有不同的解釋或涵義。


***

**Human:**
所以說我可以做節點重新分配的動作 這樣我一樣是透過scheduler來調整嗎?
還是說scheduler只是用在剛開始分配的時候

***

**Assistant:**

是的，您可以透過 OpenStack 的調度器（scheduler）來執行節點的重新分配動作。

在 OpenStack 中，調度器不僅在剛開始分配實例時使用，還可以在後續進行節點重新分配的情況下發揮作用。當節點故障、資源不足或者維護等情況發生時，您可以使用調度器來重新分配實例到其他可用的節點。

調度器會評估節點的可用性、資源狀態和其他條件，根據預設的或自定義的策略，選擇最佳的節點進行重新分配。這涉及到使用選擇器（Filters）和加權器（Weighers）來選擇和加權節點，以便選擇最合適的節點來接收重新分配的實例。

請注意，重新分配節點的過程可能涉及實例的遷移（migration），並需要在遷移期間保持實例的連通性和數據一致性。這通常由 OpenStack 的 Compute service（例如 Nova）負責處理。根據具體的配置，可能需要使用不同的技術，例如冷遷移（Cold Migration）或熱遷移（Live Migration）。

因此，無論是在初始分配實例時還是在節點重新分配時，調度器都可以用於確定最佳節點並進行實例的分配或遷移操作。


***

**Human:**
介紹一下冷遷移 跟 熱遷移

***

**Assistant:**

當需要將運行中的虛擬機實例從一個節點遷移到另一個節點時，OpenStack 提供了兩種遷移方法：冷遷移（Cold Migration）和熱遷移（Live Migration）。這兩種方法有不同的適用情境和限制。

1. 
冷遷移（Cold Migration）：
冷遷移是一種在虛擬機實例關機狀態下進行的遷移方法。在冷遷移期間，虛擬機實例會被關機並停止運行，然後將其磁碟映像（Disk Image）移動到目標節點上，最後在目標節點上重新啟動虛擬機實例。

冷遷移的主要優點是簡單且不需要特殊的硬體和網路要求。它適用於對虛擬機實例的停機時間要求相對寬鬆的場景，並且在遷移期間可以進行一些特定的操作，例如對虛擬機進行快照（Snapshot）或備份。

2. 
熱遷移（Live Migration）：
熱遷移是在虛擬機實例運行狀態下進行的遷移方法。在熱遷移期間，虛擬機實例持續運行，並在遷移過程中將內存狀態、網路連接和其他運行狀態轉移到目標節點上，同時保持連接和服務的可用性。

熱遷移的主要優點是無需中斷虛擬機實例的運行，提供了連續的服務和較短的停機時間。它適用於對虛擬機實例的運行時間要求較高的場景，並且需要支援特殊硬體要求（例如共享存儲或硬體加速）的情況。



需要注意的是，熱遷移可能對網路和存儲基礎設施有一些要求，例如共享存儲或使用專用網路通道。此外，熱遷移的效能可能受到網路帶寬、節點資源和虛擬機實例的特性等因素的


***

**Human:**
openstack裡面是怎麼公平的分配cpu 的 或是說怎麼達到最佳化的cpu分配

***

**Assistant:**

在 OpenStack 中，CPU 的公平分配和最佳化是由調度器（scheduler）負責管理的。調度器使用一系列策略和演算法來決定將虛擬機實例分配到哪個節點以實現 CPU 資源的公平分配和最佳化。

以下是一些常見的方法和策略，用於實現 CPU 的公平分配和最佳化：

1. 
加權策略（Weighing Policy）：調度器可以根據節點的 CPU 資源情況進行加權。例如，可以使用 CPU 利用率、空閒率、核心數量等指標來評估節點的資源狀態，並為每個節點分配一個權重。這樣可以在分配虛擬機實例時考慮節點的 CPU 資源情況，傾向於將虛擬機分配到 CPU 資源更豐富的節點上。

2. 
選擇器（Filters）：調度器使用選擇器來過濾不符合要求的節點。例如，可以使用 CPU 架構（如 Intel、AMD）、CPU 虛擬化技術（如 KVM、Xen）、節點負載等條件來篩選適合的節點。這樣可以確保虛擬機實例在相容的 CPU 環境中運行並平衡負載。

3. 
預測和監測：調度器可以使用歷史數據和監測信息來預測虛擬機實例的 CPU 需求。這樣可以根據預測結果動態調整虛擬機的分配，以達到更好的資源利用率和性能。

4. 
動態調整：一些 OpenStack 版本和配置提供了動態調整（Auto Scaling）功能，可以根據實際工作負載的需求動態調整虛擬機的 CPU 資源分配。這可以根據 CPU 利用率、負載平衡等指標來自動調整 CPU 分配，以達到最佳化的效果。



這些方法和策略可以根據具體的需求和配置進行調整和擴展。建議參考 OpenStack 的相關文件和設定，以深入了解和配置 CPU 的公平分配和最佳化策略。


***

**Human:**
openstack裡面不同的node我有辦法知道各個node的可用資源是如何嗎ex cpu 速度, 使用率

***

**Assistant:**

在 OpenStack 中，您可以透過以下方式來獲取不同節點的可用資源信息，例如 CPU 速度和使用率：

1. 
使用 OpenStack 的命令行工具（CLI）：
使用像 OpenStack CLI、Nova CLI 或其他相關工具，您可以執行命令來獲取節點的資源信息。例如，使用 `openstack hypervisor show &lt;hypervisor_id&gt;` 命令可以獲取特定節點（hypervisor）的詳細資訊，包括 CPU 速度和使用率等。

2. 
使用 OpenStack 的 API：
OpenStack 提供了一組豐富的 API，可以通過 API 請求獲取節點的資源信息。使用 Nova API 的 `GET /v2/{project_id}/os-hypervisors/{hypervisor_id}` 端點，您可以檢索特定節點的詳細資訊，其中包括 CPU 的速度、使用率等。

3. 
使用監控工具和擴展：
您可以使用監控工具來監測節點的資源狀態，例如使用 Zabbix、Prometheus 或其他監控系統。這些工具可以連接到節點上，並收集 CPU 的速度、使用率等數據。



需要注意的是，具體的方法和步驟可能會根據您使用的 OpenStack 版本和配置而有所不同。建議參考相應版本的 OpenStack 文檔和API參考，以了解如何獲取節點的可用資源信息。


***

**Human:**
有辦法預估某一個instance 在某一段時間會需要多少資源嗎?

***

**Assistant:**

是的，可以通過一些方法來預估某個實例在一段時間內需要的資源量。以下是一些常見的方法：

1. 
過去的歷史數據：根據過去相似實例的使用模式和資源消耗情況，可以分析歷史數據來預估實例的資源需求。這可以通過監控工具、日誌分析等方式獲取和分析。

2. 
运行时监测：在實例運行時，可以監測實例的資源使用情況，例如 CPU 利用率、內存使用量、網絡流量等。基於監測結果，可以根據實例的工作負載模式預估未來的資源需求。

3. 
工作負載預測：根據預先定義的工作負載模型，可以估計某個實例在不同時間段的資源需求。這可以基於應用程序特性、用戶行為、時間模式等因素進行預測。

4. 
自動化調整：利用自動化調整機制，可以根據實例的實際資源使用情況和預測模型進行動態調整。這包括自動調整 CPU 資源、內存、網絡帶寬等，以確保實例獲得所需的資源。



需要注意的是，預估資源需求存在一定的不確定性，因為實際的工作負載可能受到多種因素的影響。因此，建議根據實際情況定期更新預測模型，以確保更準確的資源需求預估。


***

**Human:**
這些方法是Openstack裡面有實作還是要自己去做

***

**Assistant:**

OpenStack本身並沒有直接提供這些方法的實作，因為預估實例的資源需求是相當特定和應用相關的。但OpenStack提供了一些基礎設施和API，您可以利用這些來實現預估功能，需要自己進行開發和擴展。

在OpenStack中，您可以使用以下方式來實現預估實例資源需求：

1. 
整合監控工具：將第三方的監控工具（如Prometheus、Zabbix等）整合到OpenStack中，以獲取實例的監控數據。您可以使用這些數據來分析過去的使用模式和預測未來的資源需求。

2. 
擴展Nova API：可以根據需求擴展Nova API，添加自定義的端點或方法，以獲取和計算實例的資源需求。您可以使用這些自定義API來獲取實例的狀態和監控數據，進行資源需求的預估。

3. 
自定義調度器（Scheduler）：如果您需要更進一步的資源預估和調度功能，可以考慮自定義調度器。您可以基於OpenStack現有的調度器框架，添加自定義的預估算法和策略，以實現更精確的資源需求預估和調度。



需要注意的是，這些方法需要開發人員具有相關的編程和OpenStack平台的理解。根據您的需求和情況，您可能需要進行自定義開發或整合現有的工具和API。建議參考OpenStack的文件、API參考和相關的開發社區資源，以了解更多實現詳細。


***

**Human:**
openstack會將原本的physical cpu去虛擬化成不同大小的vCPU是嗎？

***

**Assistant:**

是的，OpenStack 將物理 CPU（Physical CPU）虛擬化為不同大小的虛擬 CPU（vCPU）。虛擬 CPU 是在虛擬機實例中使用的 CPU 資源，它們是由物理 CPU 分配的虛擬資源。

當您在 OpenStack 上創建虛擬機實例時，您可以指定該實例的 vCPU 數量。vCPU 的數量決定了虛擬機實例可以使用的 CPU 資源的容量。這些 vCPU 是由物理 CPU 切割出來的虛擬資源，每個 vCPU 處理器時間片（time slice）內會分配到物理 CPU 上執行。

虛擬化技術可以將物理 CPU 的計算能力有效地劃分和共享給多個虛擬機實例。這樣，不同的虛擬機實例可以在同一個物理主機上同時運行並共享 CPU 資源，實現更好的資源利用率。

需要注意的是，vCPU 是虛擬的 CPU 資源，其數量和效能可能受到物理 CPU 的限制和調度策略的影響。根據物理主機的配置和運行狀態，vCPU 的性能和效能可能有所變化。因此，在設計和配置虛擬機實例時，需要根據實際需求和物理主機的資源狀態來適當分配和調整 vCPU 的數量。


***

Exported on 2023年5月24日 上午1:10.