1. 程式人生 > >OpenStack 建立虛機過程簡要彙總

OpenStack 建立虛機過程簡要彙總

1. 總體流程

建立虛機的請求流如下:

  1. Dashboard 或者 CLI 獲取使用者的登入資訊,呼叫 Keystone 的 REST API 去做使用者身份驗證。
  2. Keystone 對使用者登入資訊進行校驗,然後產生驗證token併發回。它會被用於後續 REST 呼叫請求。
  3. Dashboard 或者 CLI 將建立虛機的 REST請求中的‘launch instance’ 或‘nova-boot’ 部分進行轉換,然後呼叫 nova-api 的 REST 介面。
  4. nova-api 接到請求,向 keystone 傳送 auth-token 校驗和許可權認證請求。
  5. Keystone 校驗 token,並將 auth headers 發回,它包括了 roles 和 permissions。
  6. nova-api 和 nova-database 進行互動。
  7. nova-database 為新例項建立一個數據庫條目。
  8. nova-api 向 nova-scheduler 傳送  rpc.call 請求,期望它能通過附帶的 host ID 獲取到資料庫條目。
  9. nova-scheduler 從 queue 中獲取到請求。
  10. nova-scheduler 和 nova-database 互動,獲取叢集中計算節點的資訊和狀態。
  11. nova-scheuler 通過過濾(filtering)和稱重(weighting)找到一個合適的計算節點(host)。
  12. nova-scheduler 向找到的那個host上的 nova-compute 傳送 rpc.cast 請求去啟動虛機。
  13. 目標 host 上的 nova-compute 從 queue 中獲取到請求。
  14. nova-compute 向 nova-condutor 傳送 rpc.call 請求去獲取待建立虛機的資訊比如 host ID 和 flavor 等。
  15. nova-conductor 從queue 中獲取到請求。
  16. nova-conductor 和 nova-database 互動。
  17. nova-database 向 nova-conductor 返回虛機的資訊。
  18. nova-conductor 向 nova-compute 傳送 rpc.call,附帶所請求的資訊。圖中應該是遺漏了一個步驟,就是 nova-compute 從queue 中獲取返回的資料。
  19. nova-compute 呼叫 glance-api 的 REST API,傳入 auth-token,去根據映象 ID 獲取映象 URI,從映象儲存中下載(原文為upload)映象。
  20. glance-api 向 keystone 校驗 auth-token。
  21. nova-compute 獲取 image 的元資料。
  22. nova-compute 呼叫 Neutron API ,傳入 auth-token,去分配和配置網路,比如虛機的IP地址。
  23. neutron-server 通過 keystone 校驗 auth-token。
  24. nova-compute 獲得網路資訊。
  25. nova-compute 呼叫 Cinder API,傳入 auth-token,去將 volume 掛接到例項。
  26. cinder-api 通過 keystone 校驗 auth-token。
  27. nova-compute 獲得塊儲存資訊。
  28. nova-compute 為 hypervisor driver 產生資料,並呼叫 Hypersior 執行請求(通過 libvirt 或者 api)。

下表列出了每個步驟中例項的狀態:

Status Task Power state Steps
Build scheduling None 3-12
Build networking None 22-24
Build block_device_mapping None 25-27
Build spawing None 28
Active none Running

 2.  nova compute 接到建立虛機指令後開始建立虛機的程式碼流程分析 (第程式碼在 https://github.com/openstack/nova/blob/master/nova/compute/manager.py 中的 def _build_and_run_instance 函式中

_build_resources // 準備網路和磁碟
    //Start building networks asynchronously for instance
    self._build_networks_for_instance //為 instance 準備網路資源,實際上是建立一個 neutron port
        macs = self.driver.macs_for_instance(instance) //分配mac地址。多絕大多數hypersivor,返回None,也就是不預先分配
        network_info =self._allocate_network //開始非同步網路分配
            nwinfo = self.network_api.allocate_for_instance //Allocate network resources for the instance
                _validate_requested_port_ids //校驗 port ids
                _validate_requested_network_ids //校驗 network ids
                _clean_security_groups //刪除 default 安全組
                _process_security_groups //Processes and validates requested security groups for allocation
                _create_ports_for_instance //Create port for network_requests that don't have a port_id
                    _create_port_minimal //如果port 沒有的話,則Attempts to create a port for the instance on the given network.
                        port_client.create_port //呼叫 port api 來建立 port,包括建立 port,分配MAC及IP地址,更新資料庫
_generate_mac //生成MAC地址
_create_port_with_mac //建立 port
//DHCP 相關操作:port 建立完成後會通知 neutron-dhcp-agent去執行port_create_end函式,它會將port的ip和mac資訊載入到dnsmasq所需的配置檔案中
_allocate_ips_for_port //為 port 分配 IP,要麼使用者有指定,要麼從subnets 中選擇一個
_allocate_specific_ip //如果指定了IP
_generate_ip //如果沒指定IP
return requests_and_created_ports _update_ports_for_instance //為特殊case 更新 port _populate_neutron_extension_values _populate_pci_mac_address //只用於處理 SRIOV_PF _populate_mac_address _update_port port_client.update_port //將上述修改通過呼叫 port api 得以更新port _update_port_dns_name neutron.update_port(port_id, port_req_body) //將 port 的 dns_name 設定為 hostname nw_info = self.get_instance_nw_info _build_network_info_model //Return list of ordered VIFs attached to instance _gather_port_ids_and_networks //Return an instance's complete list of port_ids and networks ifaces = instance.get_network_info() return nw_info
//Start building block device mappings for instance
self._prep_block_device //處理掛接到虛機的磁碟,可能有多個,目標可能是 volume,snapshot 和 image。 當是 image 時,其實就是 boot from volume block_device_info = driver.get_block_device_info(instance, bdms) //Converts block device mappings for instance to driver format mapping = driver.block_device_info_get_mapping(block_device_info) return block_device_mapping driver_block_device.attach_block_devices //nova/virt/block_device.py _log_and_attach //寫日誌關於instance 將從哪裡啟動,可能從 volume,snapshot,image 上啟動 bdm.attach //這裡會呼叫 cinder api 去建立 volume,並且掛接到 nova compute host 上
//為每個磁碟呼叫 _log_and_attach _block_device_info_to_legacy return block_device_info
self.driver.spawn //呼叫 nova/virt/libvirt/driver.py 中的 spawn 函式,首先建立 image,然後建立domain disk_info = blockinfo.get_disk_info _create_configdrive _create_image //建立映象
fileutils.ensure_tree(libvirt_utils.get_instance_path(instance)) //在計算節點本地建立目錄 /var/lib/nova/instances/${uuid}/
_create_and_inject_local_root
if not booted_from_volume //判斷是否從 volume 啟動
backend = self.image_backend.by_name //根據配置的 image type 獲取 image backend,現在支援 rbd(使用 rbd volume),lvm(使用 lvm volume),qcow2(使用本地檔案),flat 和 Ploop 等幾種。
if backend.SUPPORTS_CLONE: //判斷 backend 是否支援 clone
backend.clone(context, disk_images['image_id']) //呼叫 backend 的 clone 方法
RbdProxy().clone //RBD 的clone 方法,從 image 的 snapshot 上 clone
else
fetch_func = libvirt_utils.fetch_image //從 Glance 下載映象
_try_fetch_image_cache
self._inject_data(backend, instance, injection_info) //處理資料注入
else
//對boot volume 不允許注入 _create_ephemeral
libvirt_utils.create_image('raw', target, '%dG' % ephemeral_size)
utils.execute('qemu-img', 'create', '-f', disk_format, path, size) _create_swap
libvirt_utils.create_image('raw', target, '%dM' % swap_mb)
nova.privsep.fs.unprivileged_mkfs('swap', target) xml = self._get_guest_xml //生成 domain xml 字串
conf = self._get_guest_config
_get_guest_numa_config
_get_guest_memory_backing_config
_get_guest_config_meta
_update_guest_cputune
_cpu_config_to_vcpu_model
_configure_guest_by_virt_type
_set_features
_set_clock
_get_guest_storage_config
self.vif_driver.get_config
_create_consoles
_guest_add_spice_channel
_add_video_driver
_set_qemu_guest_agent
_guest_add_pci_devices
_guest_add_watchdog_action
_guest_add_memory_balloon
_guest_add_mdevs
return guest
xml = conf.to_xml()
return xml
self._create_domain_and_network
//nova側去等待neutron側傳送network-vif-pluggend事件。neutron-linuxbridge-agent服務檢測tap裝置,neutron-server傳送event事件給nova-api
self.virtapi.wait_for_instance_event
self.plug_vifs(instance, network_info)
self.firewall_driver.setup_basic_filtering
self.firewall_driver.prepare_instance_filter
           self._create_domain(xml)
               libvirt_guest.Guest.create(xml, self._host)
                   write_instance_config // nova/virt/libvirt/host.py 中
                   domain = self.get_connection().defineXML(xml)
                   return libvirt_guest.Guest(domain)
               return guest
      _wait_for_boot   //每隔 0.5秒檢查虛機是否啟動
_update_instance_after_spawn
_update_scheduler_instance_info
    scheduler_client.update_instance_info
_notify_about_instance_usage

 補充:

  • port 建立成功後的 dhcp 相關操作(參考 https://blog.csdn.net/gj19890923/article/details/51558598):
    • 1. 建立VM時,nova-compute與neutron的plugin互動,在neutron的資料庫中建立VM所需的port資訊。

    • 2. neutron資料庫中的port資訊建立完成後,通知neutron-dhcp-agent去執行port_create_end函式。該函式將資料庫中的port中的ip和mac資訊載入到dnsmasq所需的配置檔案中(包括host和addn_hosts檔案)。

    • [[email protected] 43c0e274-28e3-482e-a32b-d783980fc3ed]# cat addn_hosts
      1.1.1.1 host-1-1-1-1.openstacklocal host-1-1-1-1
      1.1.1.2 host-1-1-1-2.openstacklocal host-1-1-1-2
      1.1.1.10 host-1-1-1-10.openstacklocal host-1-1-1-10
      
      [[email protected] 43c0e274-28e3-482e-a32b-d783980fc3ed]# cat host
      fa:16:3e:d1:d7:72,host-1-1-1-1.openstacklocal,1.1.1.1
      fa:16:3e:da:42:50,host-1-1-1-2.openstacklocal,1.1.1.2
      fa:16:3e:3c:a3:3e,host-1-1-1-10.openstacklocal,1.1.1.10

        [[email protected] 43c0e274-28e3-482e-a32b-d783980fc3ed]# cat leases

        1464599134 fa:16:3e:3c:a3:3e 1.1.1.10 host-1-1-1-10 01:fa:16:3e:3c:a3:3e

        1464598886 fa:16:3e:da:42:50 1.1.1.2 host-1-1-1-2 *

        1464598886 fa:16:3e:d1:d7:72 1.1.1.1 host-1-1-1-1 *

    • 3. 在VM啟動時,廣播dhcp discover請求,當dnsmasq程序的監聽介面ns-xxx監聽到這種請求時,dnsmasq程序將根據配置檔案(host和leases檔案)中的內容去判定是否有未分配的ip和mac為請求者進行提供。

    • 4. 最終VM便真實的獲取到與儲存在資料庫中的ip和mac資訊。neutron-dhcp-agent只是將所建立VM的ip和mac資訊從資料庫中獲取到自己的配置檔案中,然後等到VM啟動時,為它提供。因此neutron-dhcp-agent相當於在VM和資料庫之間起了箇中間橋樑的作用。

    1. 建立VM時,nova-compute 服務呼叫 wait_for_instance_event 函式等待 neutron 側傳送來的event。
    2. neutron的neutron-linuxbridge-agent定時檢測tap裝置的增加或刪除,當建立VM時,將建立新的tap裝置,此時將更新neutron資料庫中的ports表,而neutron-server服務建立core_plugin時,將利用sqlalchemy自帶的event對neutron資料庫中的ports表進行監視,當ports表發生變化時,neutron-server將通過HTTP請求的方式傳送event事件給nova。
    3. nova 收到 neutron 傳送來的 event 時間,結束等待,繼續建立VM下面的操作。

3. 虛機被建立後的L2網路操作

虛機被建立後,nova-compute 節點上的 neutron-linuxbridge-agent 會檢測到新建的 tap 裝置(通過輪詢 /sys/class/net/ 裡面的tap 裝置),找到後則執行一系列網路方面的操作,包括設定安全組,

tap裝置示例:

[[email protected] net]# ls
brq8165bc3d-40 eth0 eth1 eth1.120 eth2 lo tap712a2c63-e6 tap83e7c095-f0 tap8f4fcfbb-2b

tap 裝置資訊:

Port tap93121330-58 updated. Details: {u'profile': {}, u'allowed_address_pairs': [], u'admin_state_up': True, u'network_id': u'8165bc3d-400a-48a0-9186-bf59f7f94b05', u'segmentation_id': 120,u'device_owner': u'compute:nova',
u'physical_network': u'physnet1', u'mac_address': u'fa:16:3e:9f:6f:c5', u'device': u'tap93121330-58', u'port_security_enabled': True, u'port_id': u'93121330-58', u'fixed_ips': [{u'subnet_id': u'ec1028b2-7cb0-4feb-b974-6b8ea7e7f08f', u'ip_address': u'172.16.0.7'}],
u'network_type': u'vlan'}

參考文件:

相關推薦

OpenStack 建立過程簡要彙總

1. 總體流程 建立虛機的請求流如下: Dashboard 或者 CLI 獲取使用者的登入資訊,呼叫 Keystone 的 REST API 去做使用者身份驗證。 Keystone 對使用者登入資訊進行校驗,然後產生驗證token併發回。它會被用於後續 REST 呼叫請求。 Dashb

OpenStack 創建過程簡要匯總

包括 監視 mis learn efi wap cell 安全 logging 1. 總體流程 翻譯自原文(英文):https://ilearnstack.com/2013/04/26/request-flow-for-provisioning-instance-i

Openstack之Nova建立流程分析

2、虛擬機器建立簡單說來三步,nova api接受建立虛機請求,nova scheduler為建立虛機指定宿主機,nova compute啟動虛擬機器。如果能夠理解上面的所有步驟,那麼對於定位問題可以精準,甚至有些問題可以自己解決,譬如虛機error了,如果你看到虛機的資訊已經有host資訊了,那基本能從no

nova建立流程原始碼分析 openstack

    今天跟大家分享openstack中利用nova建立虛機時的原始碼流程,以便更好的理解openstack雲平臺實現,也有助於故障定位。     建立虛機方式有兩種,一種是通過dashboard雲管理平臺建立,一種是nova命令列方式建立。現在各雲端計算公

openstack修復模式(類似PE)

openstack救援 pe 修復當虛機系統不能啟動時,在openstack環境的修復辦法:1、使用nova rescue <server> 會從虛機初始鏡像啟動實例,將實例的原有磁盤會做為second硬盤2、啟動後將第二硬盤聯機就可以修復了。3、修復系統完成後,需要將虛機從rescue恢復到正

virtualbox建立後配置網路上網

一般來說常用的會配置兩個網絡卡:(兩個網絡卡應該在安裝虛擬機器之前就設定好) 1、NAT網路: 用於上外網; 2、host-only: 用於ssh連線,可以被其他人遠端訪問。 前提: 如圖:在virtualbox下設定全域性的網路 操作步驟:   1 -->  全

OpenStack建立例項完整過程原始碼詳細分析(14)----依據AMQP通訊架構實現訊息接收機制解析之一

感謝朋友支援本部落格,歡迎共同探討交流,由於能力和時間有限,錯誤之處在所難免,歡迎指正! 如果轉載,請保留作者資訊。 部落格地址:http://blog.csdn.net/gaoxingnengjisuan 郵箱地址:[email protected] 這篇博文

openstack丟失恢復 (雲硬碟存在,但丟失或無法啟動

openstack中有很多虛機在物理機重啟或服務重啟,資源不足,被人誤刪等原因導致在計算節點執行好好的虛機變成了 ERROR狀態或者shutoff 更可悲的是無法重啟,那樣如果機器中跑著業務,損失就大了。 現基於卷虛機跟大家分享一個解決方案  1. 為了測試對比,現在已有的卷虛機上寫東西,證明資料完

OpenStack網絡卡的建立過程

OpenStack最基本和常用的操作就是啟動虛機。虛機啟動的過程中涉及很多內容,其中非常重要的一個環節就是建立並繫結虛機的虛擬網絡卡。虛機的建立和管理是Nova的任務,虛機網路的建立和管理是Neutron的任務,而虛機網絡卡,作為連線虛機和虛機網路的橋樑,其建立

openstack建立虛擬機器流程,從介面任務發起,到nova等元件處理,到建立完成

1.客戶端使用自己的使用者名稱密碼請求認證。 2.keystone通過查詢在keystone的資料庫user表中儲存了user的相關資訊,包括password加密後的hash值,並返回一個token_id(令牌),和serviceCatalog(一些服務的endpoint地址,cinder、glance-ap

openstack原始碼解析之建立

本文講的是openstack原始碼解析 虛擬機器建立流程 版本是icehouse版 首先先看架構圖,請求從nova-api發起,然後到nova-conductor,再到scheduler進行排程,排程選中某臺機器後,通過rpc請求,傳送到某臺機器上執行建立機器方法,期間會訪

openstack在vmware環境(exsi或者workstation)中實例掛死

openstack 在vmware虛機環境中安裝了openstack平臺,創建實例cirros和centos,openstack並未報錯,但是在novnc裏查看cirros實例卡在grub無法進入系統,centos實例卡在install centos7之後的界面,並且報內核錯誤。 後來發現comt

雲計算---openstack創建虛擬過程

存儲信息 記錄 sched boot 接受 stack log 網絡信息 虛擬化 虛擬機創建過程:(1)界面或命令行通過RESTful API向keystone獲取認證信息。(2)keystone通過用戶請求認證信息,並生成auth-token返回給對應的

openstack將iso制作成volumes並啟動

iso cinder volumes 啟動 openstack openstack將iso制作成volumes並啟動虛機 1、創建iso鏡像(步驟略) 查看已有鏡像:nova image-list 選擇要創建volume的鏡像id,創建volumenova volume-create -

Openstack中用keypair生成和訪問的方法

IE jca SM h+ cow IV -i wkt tro Openstack中用鏡像文件生成的image來創建虛機(VM或Instance)時, 通常不支持用戶名加密碼的ssh方式登錄訪問該VM,而是key file方式. 這裏以Centos的鏡像為例, 介紹用keyp

Terraform:建立 Azure

筆者在前文《Terraform 簡介》中簡單介紹了 Terraform 相關的概念,本文讓我們使用 Terraform 在 Azure 上建立一個虛機,以此來直觀體驗一下 Terraform 強大威力。說明:本文的演示環境為 ubuntu 16.04。 provider 與 resource 在 Terr

玩轉OpenStack--4>啟動第一個 KVM

玩轉OpenStack--4>啟動第一個 KVM 虛機 本節演示如何使用 virt-manager 啟動 KVM 虛機。 首先通過命令 virt-manager 啟動圖形介面 # virt-manager 點上面的圖示建立虛機 給虛機命名為 kvm1

玩轉OpenStack--5>遠端管理 KVM

玩轉OpenStack--5>遠端管理 KVM 虛機 上一節我們通過 virt-manager 在本地主機上建立並管理 KVM 虛機。其實 virt-manager 也可以管理其他宿主機上的虛機。只需要簡單的將宿主機新增進來 填入宿主機的相關資訊,確定即可。

支援向量SVM 簡要推導過程

SVM 是一塊很大的內容,網上有寫得非常精彩的部落格。這篇部落格目的不是詳細闡述每一個理論和細節,而在於在不丟失重要推導步驟的條件下從巨集觀上把握 SVM 的思路。 1. 問題由來 SVM (支援向量機) 的主要思想是找到幾何間隔最大的超平面對資料進行正確劃分,與一般的線性分類器相比,這樣的超平面理論上

openstack 中擴大根分割槽

映象起來後,硬碟沒有自動擴充套件,flavor分了200G,啟動後就10G。由於分割槽用的是lvm,手工使用lvextend來擴大分割槽。 1 檢視當前磁碟資訊,對未分割槽空間的進行分割槽 shell> fdisk /dev/vda