摘要:標簽源碼閱讀在中虛擬機的創(chuàng)建無疑是非常重要的了解虛擬機創(chuàng)建流程并閱讀模塊關于創(chuàng)建虛擬機的源碼對開發(fā)有很很大幫助本篇文章將以版本為基礎講解創(chuàng)建虛擬機的源碼由于模塊代碼復雜而且閱讀源碼所需知識較多所以側(cè)重于流程邏輯源碼閱讀可能不夠詳盡指出模塊結(jié)
標簽: openstack nova 源碼閱讀
在openstack中,虛擬機的創(chuàng)建無疑是非常重要的,了解虛擬機創(chuàng)建流程并閱讀nova模塊關于創(chuàng)建虛擬機的源碼對opensatck開發(fā)有很很大幫助,本篇文章將以openstack queens版本為基礎.講解創(chuàng)建虛擬機的源碼.由于nova模塊代碼復雜,而且閱讀源碼所需知識較多,所以側(cè)重于流程邏輯,源碼閱讀可能不夠詳盡指出.
nova模塊結(jié)構(gòu)DB: 用于存儲nova服務相關數(shù)據(jù)的SQL數(shù)據(jù)庫,通常為MySQL
API:接收HTTP請求的組件,處理請求并通過oslo.messaging隊列或HTTP與其他組件通信
Scheduler: 決定虛擬機在哪個主機運行
Network: 管理IP轉(zhuǎn)發(fā),橋接和vlans
Compute: 管理虛擬機和虛擬機管理器直接的通信
Conductor: 處理需要協(xié)同的請求(創(chuàng)建/重建),作為數(shù)據(jù)庫代理,或者處理對象轉(zhuǎn)換
創(chuàng)建虛擬機流程為了簡便,這里省略了認證過程,實際上一個請求發(fā)送過來,還要經(jīng)過認證和鑒權(quán)等過程,確保該用戶有權(quán)限創(chuàng)建虛擬機.
在openstack的wiki中給出創(chuàng)建一個虛擬的workflow,圖有點大,但對于每個組件的工作內(nèi)容寫的非常詳細
我們可以把創(chuàng)建流程分成幾個部分
用戶發(fā)送一個創(chuàng)建虛擬機的請求,Nova-Api接收到請求后,Nova-Api負責激活擴展插件,檢查虛擬機名稱,接收注入文件,提取新虛擬機的網(wǎng)絡設置,檢查配置和鏡像等工作.
然后Nova-Api將處理好的參數(shù)集以JSON文件通過HTTP請求發(fā)送給Nova的Compute-Api.然后向用戶發(fā)送帶有虛擬機預留ID的相應(這時的相應碼202,提示虛擬機創(chuàng)建成功,但實際上虛擬機還未真正創(chuàng)建成功)
Compute-Api在接收到請求后將會檢查創(chuàng)建政策,進一步檢查虛擬機,網(wǎng)絡,鏡像和配額,然后正式建立虛擬機的配置.
接著在數(shù)據(jù)庫中生成虛擬機的相應記錄,而后通過消息隊列發(fā)送請求讓scheduler選擇一個host來創(chuàng)建虛擬機.
scheduler接收到消息后根據(jù)消息中filters對所有host進行過濾,最后選出某個host,然后跟新數(shù)據(jù)庫,并通過消息隊列向被選定的host發(fā)送創(chuàng)建虛擬機消息
被選定的host接收到隊列的消息后在數(shù)據(jù)庫中更新虛擬機和任務的狀態(tài),然后通過nova network-api為虛擬機創(chuàng)建或獲取網(wǎng)絡.
接著通過nova volume-api為虛擬機創(chuàng)建新的卷,決定虛擬機的塊設備映射,并將卷掛載到虛擬機上
此時虛擬機的調(diào)度和資源準備都以完成.
被選定的host獲取鏡像,建立塊設備映射,最后生成libvirt.xml最后執(zhí)行hypervisor的spawn()方法,至此,虛擬機已經(jīng)在host上運行了.最后一步是跟新虛擬機和任務的狀態(tài).
源碼閱讀下面將根據(jù)虛擬機創(chuàng)建時調(diào)用的模塊順序閱讀代碼
Nova-ApiNova-Api將處理不同類型的請求寫成了各種controler類,而處理創(chuàng)建虛擬機的類被稱為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方法干的是些從請求中提取并檢查參數(shù)的臟活 # 省略... try: # 依然是構(gòu)建參數(shù)的代碼... # 調(diào)用compute_api創(chuàng)建虛擬機 (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): """準備實例創(chuàng)建工作,然后將實例信息發(fā)送至scheduler, 由scheduler計算host上創(chuàng)建和在DB創(chuàng)建記錄。 """ # preparation # 為了簡介,所有參數(shù)簡略為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): """核查所有參數(shù)""" # 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) # 繼續(xù)檢查參數(shù) # 由于block device mapping有兩種版本,為了兼容,需要檢查并在必要時轉(zhuǎn)換 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: # 創(chuàng)建instance模型對象 # 檢查quota # 調(diào)用rpc api將消息發(fā)送到隊列 self.compute_task_api.build_instance(*args, **kwargs) else: compute_task_api.schedule_and_build_instances(*args, **kwargs) return instances, reservation_id調(diào)度和消息傳遞代碼
nova組件之間可以通過rpc api以消息隊列通信,而最后的真正執(zhí)行的任務的類都在manager.py文件中定義.這里我們方便理解省略調(diào)度代碼
# 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): # 構(gòu)建參數(shù)和api版本檢查 # 最后將其發(fā)送到消息隊列 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 # 由于創(chuàng)建虛擬機的工作可能會持續(xù)很長時間,為了避免進程阻塞 # 將這個任務分發(fā)給某個worker utils.spawn_n(_locked_do_build_and_run_instance, context, instance, ...) def _do_build_and_run_instance(self, *args, **kwargs): # 更新虛擬機和任務狀態(tài) # 解碼注入文件 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 # 通過調(diào)用_build_resources創(chuàng)建network和volume with self._build_resources(*args) as resources: # handle vm and task state # spawn instance on hypervisor with timeuitls.StopWatch() as time: # 通過driver創(chuàng)建xml,然后真正運行虛擬機 self.driver.spawn(*args, **kwargs) # handle exceptions
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/41893.html
摘要:一為什么要使用虛擬云桌面背景攜程呼叫中心,即服務聯(lián)絡中心,是攜程的核心部門之一,現(xiàn)有幾萬員工。他們?nèi)晷r為全球攜程用戶提供服務。為此,攜程正式引入了虛擬云桌面。攜程云桌面現(xiàn)狀攜程云桌面現(xiàn)已部署上海南通如皋合肥信陽穆棱六個呼叫中心。 編者:本文為劉科在第六期【攜程技術微分享】中的分享內(nèi)容。在攜程技術中心(微信號ctriptech)微信后臺回復【云桌面】,可加入微信交流群,和關注云桌面的...
摘要:一為什么要使用虛擬云桌面背景攜程呼叫中心,即服務聯(lián)絡中心,是攜程的核心部門之一,現(xiàn)有幾萬員工。他們?nèi)晷r為全球攜程用戶提供服務。為此,攜程正式引入了虛擬云桌面。攜程云桌面現(xiàn)狀攜程云桌面現(xiàn)已部署上海南通如皋合肥信陽穆棱六個呼叫中心。 編者:本文為劉科在第六期【攜程技術微分享】中的分享內(nèi)容。在攜程技術中心(微信號ctriptech)微信后臺回復【云桌面】,可加入微信交流群,和關注云桌面的...
摘要:上周,在舉行的上,發(fā)布,整合和。多虧存儲應用程序會話到數(shù)據(jù)庫通常來說是下載安裝或者是,我們不需要特定的負載均衡器,運行完全沒有問題。用負載均衡器描述的展示了浮動和私有集群。特別感謝來自的的支持和在測試過程中作出的貢獻。 上周,在Austin舉行的OpenStack Summit上,CoreOS發(fā)布Stackanetes,整合Kubernetes和OpenStack。 一個月前,Core...
摘要:下圖展示了虛擬機可以獲取到的信息神奇的這個地址來源于,亞馬遜在設計公有云的時候為了讓能夠訪問,就將這個特殊的作為服務器的地址。服務啟動了服務,負責處理虛擬機發(fā)送來的請求。服務也運行在網(wǎng)絡節(jié)點。中的路由和服務器都在各自獨立的命名空間中。前言下圖是OpenStack虛擬機在啟動過程中發(fā)出的一個請求,我們在里面可以看到cloud-init和169.254.169.254。那么它們分別是做什么用的呢...
摘要:和的云計算功能特點對比正式這個戰(zhàn)爭或者說趨勢的一個生動寫照。總而言之,目前調(diào)度器將只會對部署虛擬機環(huán)節(jié)有影響。目前有一個孵化項目其作用是為提供虛擬機級別高可用支持。容錯在中沒有針對于容錯的功能,并且截至目前也沒有計劃去完成這些功能。 OpenStack中國社區(qū)編者按:在云計算生態(tài)系統(tǒng)中,有兩種類型的用戶需要使用云計算資源:傳統(tǒng)型(Traditional IT applications)和在互...
閱讀 2373·2021-11-18 10:07
閱讀 2330·2021-09-22 15:59
閱讀 3088·2021-08-23 09:42
閱讀 2287·2019-08-30 15:44
閱讀 1201·2019-08-29 15:06
閱讀 2324·2019-08-29 13:27
閱讀 1224·2019-08-29 13:21
閱讀 1423·2019-08-29 13:13