摘要:標簽源碼閱讀在中虛擬機的創建無疑是非常重要的了解虛擬機創建流程并閱讀模塊關于創建虛擬機的源碼對開發有很很大幫助本篇文章將以版本為基礎講解創建虛擬機的源碼由于模塊代碼復雜而且閱讀源碼所需知識較多所以側重于流程邏輯源碼閱讀可能不夠詳盡指出模塊結
標簽: openstack nova 源碼閱讀
在openstack中,虛擬機的創建無疑是非常重要的,了解虛擬機創建流程并閱讀nova模塊關于創建虛擬機的源碼對opensatck開發有很很大幫助,本篇文章將以openstack queens版本為基礎.講解創建虛擬機的源碼.由于nova模塊代碼復雜,而且閱讀源碼所需知識較多,所以側重于流程邏輯,源碼閱讀可能不夠詳盡指出.
nova模塊結構DB: 用于存儲nova服務相關數據的SQL數據庫,通常為MySQL
API:接收HTTP請求的組件,處理請求并通過oslo.messaging隊列或HTTP與其他組件通信
Scheduler: 決定虛擬機在哪個主機運行
Network: 管理IP轉發,橋接和vlans
Compute: 管理虛擬機和虛擬機管理器直接的通信
Conductor: 處理需要協同的請求(創建/重建),作為數據庫代理,或者處理對象轉換
創建虛擬機流程為了簡便,這里省略了認證過程,實際上一個請求發送過來,還要經過認證和鑒權等過程,確保該用戶有權限創建虛擬機.
在openstack的wiki中給出創建一個虛擬的workflow,圖有點大,但對于每個組件的工作內容寫的非常詳細
我們可以把創建流程分成幾個部分
用戶發送一個創建虛擬機的請求,Nova-Api接收到請求后,Nova-Api負責激活擴展插件,檢查虛擬機名稱,接收注入文件,提取新虛擬機的網絡設置,檢查配置和鏡像等工作.
然后Nova-Api將處理好的參數集以JSON文件通過HTTP請求發送給Nova的Compute-Api.然后向用戶發送帶有虛擬機預留ID的相應(這時的相應碼202,提示虛擬機創建成功,但實際上虛擬機還未真正創建成功)
Compute-Api在接收到請求后將會檢查創建政策,進一步檢查虛擬機,網絡,鏡像和配額,然后正式建立虛擬機的配置.
接著在數據庫中生成虛擬機的相應記錄,而后通過消息隊列發送請求讓scheduler選擇一個host來創建虛擬機.
scheduler接收到消息后根據消息中filters對所有host進行過濾,最后選出某個host,然后跟新數據庫,并通過消息隊列向被選定的host發送創建虛擬機消息
被選定的host接收到隊列的消息后在數據庫中更新虛擬機和任務的狀態,然后通過nova network-api為虛擬機創建或獲取網絡.
接著通過nova volume-api為虛擬機創建新的卷,決定虛擬機的塊設備映射,并將卷掛載到虛擬機上
此時虛擬機的調度和資源準備都以完成.
被選定的host獲取鏡像,建立塊設備映射,最后生成libvirt.xml最后執行hypervisor的spawn()方法,至此,虛擬機已經在host上運行了.最后一步是跟新虛擬機和任務的狀態.
源碼閱讀下面將根據虛擬機創建時調用的模塊順序閱讀代碼
Nova-ApiNova-Api將處理不同類型的請求寫成了各種controler類,而處理創建虛擬機的類被稱為ServerControler
# nova/api/openstack/compute/servers.py class ServersController(wsgi.Controller): # 為了簡明,省略了很多用于檢查的裝飾器 @wsgi.response(202) def create(self, req, body): """Creates a new server for a given user.""" context = req.environ["nova.context"] server_dict = body["server"] password = self._get_server_admin_password(server_dict) name = common.normalize_name(server_dict["name"]) description = name # create方法干的是些從請求中提取并檢查參數的臟活 # 省略... try: # 依然是構建參數的代碼... # 調用compute_api創建虛擬機 (instances, resv_id) = self.compute_api.create(context, inst_type, image_uuid, display_name=name, display_description=description, availability_zone=availability_zone, forced_host=host, forced_node=node, metadata=server_dict.get("metadata", {}), admin_password=password, requested_networks=requested_networks, check_server_group_quota=True, supports_multiattach=supports_multiattach, **create_kwargs) # 錯誤處理...compute-api
# nova/compute/api.py class API(base.Base): def create(self, context, instance_type, image_href, kernel_id=None, ramdisk_id=None, min_count=None, max_count=None, display_name=None, display_description=None, key_name=None, key_data=None, security_groups=None, availability_zone=None, forced_host=None, forced_node=None, user_data=None, metadata=None, injected_files=None, admin_password=None, block_device_mapping=None, access_ip_v4=None, access_ip_v6=None, requested_networks=None, config_drive=None, auto_disk_config=None, scheduler_hints=None, legacy_bdm=True, shutdown_terminate=False, check_server_group_quota=False, tags=None, supports_multiattach=False): """準備實例創建工作,然后將實例信息發送至scheduler, 由scheduler計算host上創建和在DB創建記錄。 """ # preparation # 為了簡介,所有參數簡略為args和kwargs self_create_instance(*args, **kwargs) def _create_instance(self, context, instance_type, image_href, kernel_id, ramdisk_id, min_count, max_count, display_name, display_description, key_name, key_data, security_groups, availability_zone, user_data, metadata, injected_files, admin_password, access_ip_v4, access_ip_v6, requested_networks, config_drive, block_device_mapping, auto_disk_config, filter_properties, reservation_id=None, legacy_bdm=True, shutdown_terminate=False, check_server_group_quota=False, tags=None, supports_multiattach=False): """核查所有參數""" # verifying pass # 獲取鏡像信息 if image_href: # if image_href is provied, get image via glance api image_id, boot_meta = self._get_image(context, image_href) else: # if image_href is not proved, get image metadata from bdm image_id = None boot_meta = self._get_bdm_image_metadata( context, block_device_mapping, legacy_bdm) # 繼續檢查參數 # 由于block device mapping有兩種版本,為了兼容,需要檢查并在必要時轉換 block_device_mapping = self._check_and_transform_bdm(context, base_options, instance_type, boot_meta, min_count, max_count, block_device_mapping, legacy_bdm) # go on checking # 為了支持cell特性,參見cell wiki # https://docs.openstack.org/nova/ocata/cells.html if CONF.cells.enable: # 創建instance模型對象 # 檢查quota # 調用rpc api將消息發送到隊列 self.compute_task_api.build_instance(*args, **kwargs) else: compute_task_api.schedule_and_build_instances(*args, **kwargs) return instances, reservation_id調度和消息傳遞代碼
nova組件之間可以通過rpc api以消息隊列通信,而最后的真正執行的任務的類都在manager.py文件中定義.這里我們方便理解省略調度代碼
# nova/conductor/api.py class ComputeTaskAPI(object): def schedule_and_build_instance(self, *args, **kwargs): # very simple method # call rpc api only self.conductor_compute_rpc_api.schedule_and_build_instance(*args, **kwargs) # nova/conductor/rpcapi.py class ComputeTaskAPI(object): def schedule_and_build_instance(self, *args, **kwargs): # 構建參數和api版本檢查 # 最后將其發送到消息隊列 cctxt.cast(context, "schedule_and_build_instance", **kwargs)manager代碼
# nova/compute/manager.py class ComputeManager(object): @wrap_exception() @reverts_task_state @wrap_instance_fault def build_and_run_instance(self, *args, **kwargs): # 給資源加鎖,避免競爭 @utils.synchronized(instance.uuid) def _locked_do_build_and_run_instance(*args, **kwargs): with self._build_semaphore: try: result = self._do_build_and_run_instance(*args, **kwargs) # handle exceptions pass # 由于創建虛擬機的工作可能會持續很長時間,為了避免進程阻塞 # 將這個任務分發給某個worker utils.spawn_n(_locked_do_build_and_run_instance, context, instance, ...) def _do_build_and_run_instance(self, *args, **kwargs): # 更新虛擬機和任務狀態 # 解碼注入文件 try: with timeutils.StopWatch() as timer: self._build_and_run_instance(*args) # handle exceptions def _build_and_run_instance(self, *args, **kwargs): # 獲取 image ref try: scheduler_hints = self._get_scheduler_hints(filter_properties, request_spec) rt = self._get_resource_tracker() with rt.instance_claime(context, instance, node, limits): # 獲取群組策略和鏡像metadata # 通過調用_build_resources創建network和volume with self._build_resources(*args) as resources: # handle vm and task state # spawn instance on hypervisor with timeuitls.StopWatch() as time: # 通過driver創建xml,然后真正運行虛擬機 self.driver.spawn(*args, **kwargs) # handle exceptions
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/41893.html
摘要:一為什么要使用虛擬云桌面背景攜程呼叫中心,即服務聯絡中心,是攜程的核心部門之一,現有幾萬員工。他們全年小時為全球攜程用戶提供服務。為此,攜程正式引入了虛擬云桌面。攜程云桌面現狀攜程云桌面現已部署上海南通如皋合肥信陽穆棱六個呼叫中心。 編者:本文為劉科在第六期【攜程技術微分享】中的分享內容。在攜程技術中心(微信號ctriptech)微信后臺回復【云桌面】,可加入微信交流群,和關注云桌面的...
摘要:一為什么要使用虛擬云桌面背景攜程呼叫中心,即服務聯絡中心,是攜程的核心部門之一,現有幾萬員工。他們全年小時為全球攜程用戶提供服務。為此,攜程正式引入了虛擬云桌面。攜程云桌面現狀攜程云桌面現已部署上海南通如皋合肥信陽穆棱六個呼叫中心。 編者:本文為劉科在第六期【攜程技術微分享】中的分享內容。在攜程技術中心(微信號ctriptech)微信后臺回復【云桌面】,可加入微信交流群,和關注云桌面的...
摘要:上周,在舉行的上,發布,整合和。多虧存儲應用程序會話到數據庫通常來說是下載安裝或者是,我們不需要特定的負載均衡器,運行完全沒有問題。用負載均衡器描述的展示了浮動和私有集群。特別感謝來自的的支持和在測試過程中作出的貢獻。 上周,在Austin舉行的OpenStack Summit上,CoreOS發布Stackanetes,整合Kubernetes和OpenStack。 一個月前,Core...
摘要:下圖展示了虛擬機可以獲取到的信息神奇的這個地址來源于,亞馬遜在設計公有云的時候為了讓能夠訪問,就將這個特殊的作為服務器的地址。服務啟動了服務,負責處理虛擬機發送來的請求。服務也運行在網絡節點。中的路由和服務器都在各自獨立的命名空間中。前言下圖是OpenStack虛擬機在啟動過程中發出的一個請求,我們在里面可以看到cloud-init和169.254.169.254。那么它們分別是做什么用的呢...
摘要:和的云計算功能特點對比正式這個戰爭或者說趨勢的一個生動寫照。總而言之,目前調度器將只會對部署虛擬機環節有影響。目前有一個孵化項目其作用是為提供虛擬機級別高可用支持。容錯在中沒有針對于容錯的功能,并且截至目前也沒有計劃去完成這些功能。 OpenStack中國社區編者按:在云計算生態系統中,有兩種類型的用戶需要使用云計算資源:傳統型(Traditional IT applications)和在互...
閱讀 2368·2021-11-18 10:07
閱讀 2318·2021-09-22 15:59
閱讀 3077·2021-08-23 09:42
閱讀 2276·2019-08-30 15:44
閱讀 1191·2019-08-29 15:06
閱讀 2303·2019-08-29 13:27
閱讀 1210·2019-08-29 13:21
閱讀 1412·2019-08-29 13:13