nova-compute 部署 instance 詳解 - 每天5分鍾玩轉 OpenStack(28)


本節討論 nova-compute,並詳細分析 instance 部署的全過程。

先給大家道個歉:今天這篇文章的篇幅比以往要多一些,本來想分兩次發,但考慮到文章的完整和系統性,還是一次發了出來,這次可能要超出 5 分鍾了,大家見諒。

nova-compute 在計算節點上運行,負責管理節點上的 instance。 OpenStack 對 instance 的操作,最后都是交給 nova-compute 來完成的。 nova-compute 與 Hypervisor 一起實現 OpenStack 對 instance 生命周期的管理。

通過 Driver 架構支持多種 Hypervisor

接着的問題是:現在市面上有這么多 Hypervisor,nova-compute 如何與它們配合呢? 這就是我們之前討論過的 Driver 架構。

nova-compute 為這些 Hypervisor 定義了統一的接口,Hypervisor 只需要實現這些接口,就可以 Driver 的形式即插即用到 OpenStack 系統中。 下面是Nova Driver的架構示意圖

image144.png

我們可以在 /opt/stack/nova/nova/virt/ 目錄下查看到 OpenStack 源代碼中已經自帶了上面這幾個 Hypervisor 的 Driver

某個特定的計算節點上只會運行一種 Hypervisor,只需在該節點 nova-compute 的配置文件 /etc/nova/nova.conf 中配置所對應的 compute_driver 就可以了。

在我們的環境中因為是 KVM,所以配置的是 Libvirt 的 driver。

image145.png
nova-compute 的功能可以分為兩類:

  1. 定時向 OpenStack 報告計算節點的狀態

  2. 實現 instance 生命周期的管理

下面我們依次介紹。

定期向 OpenStack 報告計算節點的狀態

前面我們看到 nova-scheduler 的很多 Filter 是根據算節點的資源使用情況進行過濾的。 比如 RamFilter 要檢查計算節點當前可以的內存量;CoreFilter 檢查可用的 vCPU 數量;DiskFilter 則會檢查可用的磁盤空間。

那這里有個問題:OpenStack 是如何得知每個計算節點的這些信息呢? 答案就是:nova-compute 會定期向 OpenStack 報告。

從 nova-compute 的日志 /opt/stack/logs/n-cpu.log 可以發現: 每隔一段時間,nova-compute 就會報告當前計算節點的資源使用情況和 nova-compute 服務狀態。

如果我們再深入問一個問題:nova-compute 是如何獲得當前計算節點的資源使用信息的? 給大家一分鍾自己先思考一下?

好,揭曉答案。

要得到計算節點的資源使用詳細情況,需要知道當前節點上所有 instance 的資源占用信息。 這些信息誰最清楚? 當然是 Hypervisor。

大家還記得之前我們討論的 Nova Driver 架構吧,nova-compute 可以通過 Hypervisor 的 driver 拿到這些信息。

舉例來說,在我們的實驗環境下 Hypervisor 是 KVM,用的 Driver 是 LibvirtDriver。 LibvirtDriver 可以調用相關的 API 獲得資源信息,這些 API 的作用相當於我們在 CLI 里執行 virsh nodeinfo、virsh dominfo 等命令。

實現 instance 生命周期的管理

OpenStack 對 instance 最主要的操作都是通過 nova-compute 實現的,包括 instance 的 launch、shutdown、reboot、suspend、resume、terminate、resize、migration、snapshot 等。

本小節重點學習 nova-compute 如何實現 instance launch(部署)操作,其它操作將會在后面的章節討論。

當 nova-scheduler 選定了部署 instance 的計算節點后,會通過消息中間件 rabbitMQ 向選定的計算節點發出 launch instance 的命令。 該計算節點上運行的 nova-compute 收到消息后會執行 instance 創建操作。 日志 /opt/stack/logs/n-cpu.log 記錄了整個操作過程。

nova-compute 創建 instance 的過程可以分為 4 步:

  1. 為 instance 准備資源

  2. 創建 instance 的鏡像文件

  3. 創建 instance 的 XML 定義文件

  4. 創建虛擬網絡並啟動虛擬機

下面我們依次討論每個步驟。

為 instance 准備資源

nova-compute 首先會根據指定的 flavor 依次為 instance 分配內存、磁盤空間和 vCPU。 可以在日志中看到這些細節

網絡資源也會提前分配。

創建 instance 的鏡像文件

資源准備好之后,nova-compute 會為 instance 創建鏡像文件。 OpenStack 啟動一個 instance 時,會選擇一個 image,這個 image 由 Glance 管理。 nova-compute會:

  1. 首先將該 image 下載到計算節點

  2. 然后將其作為 backing file 創建 instance 的鏡像文件。

從 Glance 下載 image

nova-compute 首先會檢查 image 是否已經下載(比如之前已經創建過基於相同 image 的 instance)。如果沒有,就從 Glance 下載 image 到本地。

由此可知,如果計算節點上要運行多個相同 image 的 instance,只會在啟動第一個 instance 的時候從 Glance 下載 image,后面的 instance 啟動速度就大大加快了。 日志如下:

可以看到

  1. image(ID為 917d60ef-f663-4e2d-b85b-e4511bb56bc2)是 qcow2 格式,nova-compute 將其下載,然后通過 qemu-img 轉換成 raw 格式。 轉換的原因是下一步需要將其作為 instance 的鏡像文件的 backing file,而 backing file不能是 qcow2 格式。

  2. image 的存放目錄是 /opt/stack/data/nova/instances/_base,這是由 /etc/nova/nova.conf 的下面兩個配置選項決定的。

instances_path = /opt/stack/data/nova/instances base_dir_name = _base

  1. 下載的 image 文件被命名為 60bba5916c6c90ed2ef7d3263de8f653111dd35f,這是 image id 的 SHA1 哈希值。

為 instance 創建鏡像文件

有了 image 之后,instance 的鏡像文件直接通過 qemu-img 命令創建,backing file 就是下載的 image。

這里 instance 的鏡像文件位於 /opt/stack/data/nova/instances/f1e22596-6844-4d7a-84a3-e41e6d7618ef/disk,格式為 qcow2,其中 f1e22596-6844-4d7a-84a3-e41e6d7618ef 就是 instance 的 id。

可以通過 qemu-info 查看 disk 文件的屬性

這里有兩個容易搞混淆的術語,在此特別說明一下:

  1. image,指的是 Glance 上保存的鏡像,作為 instance 運行的模板。 計算節點將下載的 image 存放在 /opt/stack/data/nova/instances/_base 目錄下。

  2. 鏡像文件,指的是 instance 啟動盤所對應的文件

  3. 二者的關系是:image 是鏡像文件 的 backing file。image 不會變,而鏡像文件會發生變化。比如安裝新的軟件后,鏡像文件會變大。

因為英文中兩者都叫 “image”,為避免混淆,我們用 “image” 和 “鏡像文件” 作區分。

創建 instance 的 XML 定義文件

創建的 XML 文件會保存到該 instance 目錄 /opt/stack/data/nova/instances/f1e22596-6844-4d7a-84a3-e41e6d7618ef,命名為 libvirt.xml

創建虛擬網絡並啟動 instance

接下來便是為 instance 創建虛擬網絡設備

本環境用的是 linux-bridge 實現的虛擬網絡,在 Neutron 章節我們會詳細討論 OpenStack 虛擬網絡的不同實現方式。

一切就緒,接下來可以啟動 instance 了。


至此,instance 已經成功啟動。 OpenStack 圖形界面和 KVM CLI 都可以查看到 instance 的運行狀態。

在計算節點上,instance 並不是以 OpenStack上 的名字命名,而是用 instance-xxxxx 的格式。

哇,居然堅持看完了!
在下面給自己點個贊吧 :-)



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM