09-nova的模塊及novnc詳解

  • 2019 年 12 月 27 日
  • 筆記

Nova的各個模塊

nova-api

  • 對外提供rest接口的處理
  • 對傳入的參數進行合法性校驗和約束限制
  • 對請求的資源進行配額(quota)的校驗和預留
  • 資源的創建,更新,刪除查詢等
  • 虛擬機生命周期的入口
  • 可水平擴展部署(可以有多個節點)

nova-scheduler

  • 選擇策略
  • 基於內存權重的選擇。
  • 散列:在候選的一個大小範圍內的主機中,隨機選擇一個主機。
  • Filter:對主機進行過濾的實體,支持自研擴展
  • scheduler_default_filters配置新寫的filter。
  • scheduler_available_filters指定擴展的filter目錄的收集函數。
  • 指定主機創建,遷移時候該調度失效

nova-conductor

  • 數據庫操作。解耦其他組件(nova-compute)數據庫訪問。
  • Nova複雜流程控制,如創建,冷遷移,熱遷移,虛擬機規格調整,虛擬機重建。
  • 其他組件的依賴。如nova-compute需要依賴nova-conductor啟動成功後才能啟動成功。
  • 其他組件的心跳定時寫入。Nova-compute,nova-conductor,nova-scheduler,nova-console,nova-consoleauth。
  • 可水平擴展部署

nova-compute

  • 虛擬機各生命周期操作的真正執行者(會調用對應的hypervisor的driver)。
  • 底層對接不同虛擬化的平台(kvm,vmware,xen,FusionCompute,hyperv等)。
  • 內置周期性任務,完成資源刷新,虛擬機狀態同步等功能。
  • 資源管理模塊(resource_tracker)配合插件機制,完成資源的統計。
  • Claim模塊完成資源的分配和釋放。

nova-novncproxy

在訪問VNC-Server的時候需要對應的VNC-Client,現在瀏覽器里已經集成了VNC的功能,可以直接通過瀏覽器來進行訪問。

nova vnc proxy原理圖解

vncproxy流程圖

VNC Proxy的功能

1 將公網(public network)和私網(private network)隔離

2 VNC client運行在公網上,VNCServer運行在私網上,VNC Proxy作為中間的橋樑將二者連接起來

3 VNC Proxy通過token對VNC Client進行驗證

4 VNC Proxy不僅僅使得私網的訪問更加安全,而且將具體的VNC Server的實現分離,可以支持不同Hypervisor的VNC Server但不影響用戶體驗

VNC Proxy的部署

1 在Controller節點上部署nova-consoleauth 進程,用於Token驗證

2 在Controller節點上部署nova-novncproxy 服務,用戶的VNC Client會直接連接這個服務

3 Controller節點一般有兩張網卡,連接到兩個網絡,一張用於外部訪問,我們稱為public network,或者API network,這張網卡的IP地址是外網IP,如圖中172.24.1.1,另外一張網卡用於openstack各個模塊之間的通信,稱為management network,一般是內網IP,如圖中10.10.10.2

4 在Compute節點上部署nova-compute,在nova.conf文件中有下面的配置

#nova vnc proxy是通過內網IP來訪問vnc server的,所以nova-compute會告知vnc proxy用這個IP來連接我。  novncproxy_base_url=http://192.168.150.10:6080/vnc_auto.html  #允許任何主機來訪問novnc  novncproxy_host=0.0.0.0  #代理端口  novncproxy_port=6080  #代理客戶端  vncserver_proxyclient_address=controller  #VNC Server的監聽地址  vncserver_listen=0.0.0.0

VNC Proxy的運行過程

1 用戶從瀏覽器裏面打開連接到虛擬機的VNC Client

2 瀏覽器向nova-api發送請求,要求返回訪問vnc的url

3 nova-api調用nova-compute的get vnc console方法,要求返回連接VNC的信息

4 nova-compute調用libvirt的get vnc console函數

5 libvirt會通過解析虛擬機運行的/etc/libvirt/qemu/instance-00000011.xml文件來獲得VNC Server的信息

6 libvirt將host, port等信息以json格式返回給nova-compute

7 nova-compute會隨機生成一個UUID作為Token

8 nova-compute將libvirt返回的信息以及配置文件中的信息綜合成connect_info返回給nova-api

9 nova-api會調用nova-consoleauth的authorize_console函數

10 nova-consoleauth會將instance –> token, token –> connect_info的信息cache起來

11 nova-api將connect_info中的access url信息返回給瀏覽器:

http:// 192.168.150.10:6080/vnc_auto.html?token=7efaee3f-eada-4731-a87c-e173cbd25e98&title=serverA%289169fdb2-5b74-46b1-9803-60d2926bd97c%29

12 瀏覽器會試圖打開這個鏈接

13 這個鏈接會將請求發送給nova-novncproxy

14 nova-novncproxy調用nova-consoleauth的check_token函數

15 nova-consoleauth驗證了這個token,將這個instance對應的connect_info返回給nova-novncproxy

16 nova-novncproxy通過connect_info中的host, port等信息,連接compute節點上的VNC Server,從而開始了proxy的工作

原文字描述