1. 程式人生 > >OpenStack之Nova分析——建立虛擬機器(五)

OpenStack之Nova分析——建立虛擬機器(五)

上篇兩篇文章分析了Nova Scheduler服務,這篇文章我們繼續來分析建立虛擬機器的過程。先來回顧一下。

class FilterScheduler(driver.Scheduler):
    def scheduler_run_instance(self, context, request_spec,
                               admin_password, injected_files,
                               requested_networks, is_first_time,
                               filter_properties):
        #獲取排程所需引數
        payload = dict(request_spec=request_spec)
        #通知Nova API開始排程
        notifier.notify(context, notifier.publisher_id("scheduler"),
                        'scheduler.run_instance.start', notifier.INFO, notifier.INFO,
                        payload)
        ...
        #執行排程演算法,獲取加權主機列表
        weighted_hosts = self._schedule(context, "compute", request_spec,
                                        filter_properties, instance_uuids)
        ...
        #為每個虛擬機器分配計算節點
        for num, instance_uuid in enumerate(instance_uuids):
            ...
            try:
                try:
                    #選擇權值最高的計算節點
                    weighted_host = weighted_hosts.pop(0)
                except IndexError:
                    raise exception.NoValidHost(reason="")
                #在權值最高的計算節點上建立虛擬機器
                self._provision_resource(context, weighted_host,
                                         request_spec,
                                         filter_properties,
                                         requested_networks,
                                         injected_files, admin_password,
                                         is_first_time,
                                         instance_uuid=instance_uuid)
            except Exception as ex:
                ...
        #通知Nova API虛擬機器排程完畢
        notifier.notify(context, notifier.publisher_id("scheduler"),
                        'scheduler.run_instance.end', notifier.INFO, payload)
這個方法的前半部分(_scheduler方法)我們已經在“Nova Scheduler排程演算法”中分析過,我們繼續來看該方法的後半部分。

_provision_resource方法

class FilterScheduler(driver.Scheduler):
    def _provision_resource(self, context, weighed_host, ...):
        ...
        self.compute_rpcapi.run_instance(context, instance=updated_instance, ...)

該方法在權值最高的計算節點上建立虛擬機器,遠端呼叫了Nova Compute服務的run_instance方法,這個方法位於nova/nova/compute/rpcapi.py。

class ComputeAPI(nova.openstack.common.rpc.proxy.RpcProxy):
    def run_instance(self, ctxt, instance, ...):
        ...
        self.cast(ctxt, self.make_msg('run_instance',intance=instance_p, ...),
                                      topic=_compute_topic(self.topic, ctxt, host ,None),
                                      ...)

可以看到,該方法會呼叫cast方法向Nova Compute服務傳送RPC請求。

和其它服務類似,在Nova Compute服務中,處理RPC請求的方法都定義在Nova Compute服務的manager類中,該類位於nova/nova/compute/manager.py。來看一下這個類下的run_instance方法。

class ComputeManager(manager.SchedulerDependentManager):
    def run_instance(self, context, instance, request_spec=None,
                     filter_properties=None, requested_networks=None,
                     injected_files=None, admin_password=None,
                     is_first_time=False, node=None):
        ...
        @lockutils.synchronized(instance['uuid'], 'nova-')
        def do_run_instance():
            self._run_instance(context, request_spec,
                    filter_properties, requested_networks, injected_files,
                    admin_password, is_first_time, node, instance)
        do_run_instance()
可以看到這個方法定義了一個內部方法do_run_instance,do_run_instance內部方法的主要作用是加了一個鎖,這個鎖的目的是保證同一個虛擬機器在同一時刻只能執行一個任務。在這個方法內部,呼叫了_run_instance方法來實現虛擬機器的建立。來看一下_run_instance方法
class ComputeManager(manager.SchedulerDependentManager):
    def _run_instance(self, context, request_spec,
                      filter_properties, requested_networks, injected_files,
                      admin_password, is_first_time, node, instance):
        ...
        try:
            #檢查虛擬機器是否存在
            self._check_instance_exists(context, instance)
            #更新資料庫中虛擬機器的狀態
            try:
                self._start_building(context, instance)
            except exception.InstanceNotFound:
                ...
            #檢查磁碟映象大小
            image_meta = self._check_image_size(context, instance)
            #選擇執行虛擬機器的節點
            if node is None:
                node = self.driver.get_available_nodes()[0]
            ...
            rt = self._get_resource_tracker(node)
            try:
                limits = filter_properties.get('limits', {})
                #為虛擬機器預留磁碟、記憶體、CPU等硬體資源
                with rt.instance_claim(context, instance, limits):
                    #獲取虛擬機器的MAC地址的約束
                    macs = self.driver.macs_for_instance(instance)
                    #為虛擬機器分配網路
                    network_info = self._allocate_network(context, instance,
                            requested_networks, macs, security_groups)
                    ...
                    #呼叫_spawn方法,進一步處理虛擬機器的建立請求
                    instance = self._spawn(context, instance, image_meta,
                                           network_info, block_device_info,
                                           injected_files, admin_password,
                                           set_access_ip=set_access_ip)
            except exception.InstanceNotFound:
                #虛擬機器在建立過程中被刪除
                with excutils.save_and_reraise_exception():
                    try:
                        #釋放分配的網路資源
                        self._deallocate_network(context, instance)
                    except Exception:
                        ...
            except exception.UnexpectedTaskStateError as e:
                ...
            except Exception:
                exc_info = sys.exc_info()
                #請求重新執行排程演算法
                self._reschedule_or_reraise(context, instance, exc_info, ...)
        expect Expection:
            ...
這個方法首先完成虛擬機器建立前的一些準備工作,然後呼叫_spawn方法做進一步的處理。

我們先來分析一下這所謂的建立前的一些準備工作,主要分下面四步進行

1. 檢查要建立的虛擬機器的uuid是否被佔用

2. 更新Nova資料庫中虛擬機器的狀態,主要是更新vm_state和task_state這兩個欄位的值

3. 檢查虛擬機器的映象檔案大小是否超出虛擬機器規格的限制

4. 選擇一個可用的計算節點作為執行虛擬機器的節點,併為虛擬機器預留硬體資源

_spawn方法涉及的內容較多,我們放在下篇文章來分析~~

相關推薦

OpenStackNova分析——建立虛擬機器

上篇兩篇文章分析了Nova Scheduler服務,這篇文章我們繼續來分析建立虛擬機器的過程。先來回顧一下。 class FilterScheduler(driver.Scheduler): def scheduler_run_instance(self, cont

OpenStackNova分析——建立虛擬機器——建立虛擬機器映象檔案

虛擬機器的映象檔案主要是指磁碟映象檔案,當然有的還包括ramdisk和kernel映象來配合磁碟映象檔案使用,這篇文章我們來重點分析一下建立虛擬機器磁碟映象的整個過程。 虛擬機器磁碟映象是虛擬機器正常執行不可缺少的映象檔案,它是虛擬機器的主磁碟。先來概述一下建立虛擬機器磁碟

OpenStacknova元件建立虛擬機器的原始碼流程

此處以OpenStack mitaka版本為例,實際最新的Ocata版本也差不多,以建立一個虛擬機器為例來分析nova原始碼中執行流程,該流程有助於二次開發,閱讀原始碼前最好先熟悉一下pastedeploy、webob、stevedore等openstack中的

Java程式設計師從笨鳥到菜鳥九十六深入java虛擬機器——java本地介面JNI詳解

        對於java程式設計師來說,java語言的好處和優點,我想不用我說了,大家自然會說出很多一套套的。但雖然我們作為java程式設計師,但我們不得不承認java語言也有一些它本身的缺點。比如在效能、和底層打交道方面都有它的缺點。所以java就提供了一些本地介面,他主要的作用就是提供一個標準的方式讓

如何使用指令碼批量建立虛擬機器

  上篇文章我們介紹瞭如何使用VMware來克隆虛擬機器,克隆雖然能夠使我們避免了繁瑣的建立過程、大大簡化我們的操作,但在需要建立數量巨大的虛擬機器的情況下其步驟依然較多,顯然並不能滿足我們這種高效化

深入拆解虛擬機器JVM是如何執行方法呼叫的?

虛方法呼叫 (1)Java中所有非私有例項方法呼叫都會被 編譯成invokevirtual指令,而介面方法呼叫會被編譯成invokevirtualface指令。這兩種指令,均屬於Java虛擬機器中的虛方法呼叫 (2)Java虛擬機器採用了一種用空間換時間的策略實現動態繫結。它為每個方

JAVA虛擬機器垃圾收集器與物件分配和回收策略

可達性分析演算法的效率 可達性分析中從GC Roots節點找引用鏈,可作為GC Roots的節點主要在全域性性的引用(常量或類靜態屬性)與執行上下文(棧幀中的本地變量表),如果要逐個檢查,必然會消耗很多時間。 另外,可達性分析對執行時間的敏感還體現在GC停頓上,

JAVA虛擬機器:Javac編譯原理

1、Javac編譯器的基本結構 Javac主要有4個模組:詞法分析、語法分析、語義分析、程式碼生成。 2、詞法分析 (1)功能:讀取原始檔的字元流,解析出符合Java語言規範的Token序列。 (2)關鍵類: com.sun.tools.javac.pars

OpenStack管理虛擬機器

OpenStack的三個元件(四個節點)已安全搭建完成,本篇博文為大家帶來基本管理,使平臺化管理更為方便、有效。 一、映象管理 1、掛載/上傳映象到控制節點 mkdir /abcmount.cifs //192.168.37.1/rhel7/KVM/CentOS-7-x86_64-DVD

Nova建立虛擬機器指定IP地址和生成節點

1. 背景需求  在openstack中,nova負責openstack虛擬機器的生命週期的管理,neutron則負責虛擬機器的網路管理工作,預設情況下,建立一臺虛擬機器,nova會根據nova-scheduler排程演算法,選擇一臺最合適的compute節點,同時會從neutr

OpenStack原始碼分析Nova-Compute服務啟動過程icehouse

學習OpenStack有半年多了,一直都停留在使用和trouble shooting的階段,最近有時間來好好研究了一下程式碼,因為以前是C++/Windows出生的,所以對Linux下面的Python開發不是很熟悉,本文適合一些已經使用過OpenStack並且想要初步瞭解程

Java程式設計師從笨鳥到菜鳥九十三深入java虛擬機器——類載入器詳解

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Java程式設計師從笨鳥到菜鳥九十四深入java虛擬機器——類的生命週期 下類的初始化

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

JAVA虛擬機器JVM劃重點 第二章 Java記憶體區域與記憶體溢位異常 虛擬機器物件

本部落格參考《深入理解Java虛擬機器》(第二版)一書,提取重點知識,再加以個人的理解編寫而成。轉載請標明來源。 JAVA虛擬機器(JVM)劃重點 第二章 Java記憶體區域與記憶體溢位異常 之 虛擬機器物件 Java物件的建立 1、類載入過程

JAVA虛擬機器JVM劃重點 第二章 Java記憶體區域與記憶體溢位異常 執行時資料區域

本部落格參考《深入理解Java虛擬機器》(第二版)一書,提取重點知識,再加以個人的理解編寫而成。轉載請標明來源。 JVM劃重點 第二章 Java記憶體區域與記憶體溢位異常 之 執行時資料區域 概述 執行時資料區域 程式計數器 Java虛擬機

Linux學習筆記Python3的安裝以及建立虛擬環境CentOS

body { background: #f4f4f4 } .title { width: 100%; background: #5cb85c; padding: 5px; font-size: 20px; margin: 5px } .sub_title { width: 99%; background: #

k8s搭建初始環境準備-vagrant部署虛擬機器

k8s搭建之初始環境準備-虛擬機器篇(一) 我相信很多搭建k8s 叢集的小夥伴最頭疼的一件事情就是,我沒有那麼多機器啊,別說高可用,就算是一個master一個node 用VM都煩的很,安裝的哪個圖形化就要點老半天,snapshot 快照要是沒有準備,環境搞得亂七

【PHP7原始碼分析】如何理解PHP虛擬機器

順風車運營研發團隊 李樂 1.從物理機說起 虛擬機器也是計算機,設計思想和物理機有很多相似之處; 1.1馮諾依曼體系結構 馮·諾依曼是當之無愧的數字計算機之父,當前計算機都採用的是馮諾依曼體系結構;設計思想主要包含以下幾個方面: 指令和資料不加區別混合儲存在同一個儲

Java程式設計師從笨鳥到菜鳥九十三深入java虛擬機器——類的生命週期類的載入和連線

         類載入器,顧名思義,類載入器(class loader)用來載入 Java 類到 Java 虛擬機器中。一般來說,Java 虛擬機器使用 Java 類的方式如下:Java 源程式(.java 檔案)在經過 Java 編譯器編譯之後就被轉換成 Java 位元組程式碼(.class 檔案)。類載

Java虛擬機器物件的建立與OOP-Klass模型

相關文章  Java虛擬機器系列 前言 在前一篇文章中我們學習了Java虛擬機器的結構原理與執行時資料區域,那麼我們大概知道了Java虛擬機器的記憶體的概況,那麼記憶體中的資料是如何建立和訪問的呢?這篇文章會給你答案。 1.物件的建立 物件的建立通常是通過new一個物件而