`
lynnkong
  • 浏览: 303539 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

【openstack】Nova(Folsom)虚拟化层Driver分析

阅读更多

【转载】Nova(Folsom)虚拟化层Driver分析

本博客欢迎转发,但请保留原作者(@孔令贤HW)信息!内容系本人学习、研究和总结,如有雷同,实属荣幸! 
       本文是我一个同事的一篇分析,征求了同事的意见,获取同意后,在此转载。

  

       本文依据 Openstack 目前最新folsom版本中,从代码走读的角度,分析了Openstack异构不同hypervisor  virt部分的代码结构。同时,给出了当前不同hypervisor对于Openstack 定义的通用接口的支持情况。

 1. Folsom版本 virt代码重构

两个版本相比,virt部分的逻辑结构更加清晰。下面是两个版本virt代码中libvirt 的结构对比:



  2. Driver 类型

当前支持的虚拟化平台,主要有以下五种:

     

 

 

3. virt 继承关系

Folsom版本中,对应不同的hypervisor实现,所有插件类全部继承于一个基类/nova/virt/driver.py,文件中定义到了所有需要driver支持的接口(当然有少部分接口是选配的),文件中仅有接口定义。

各个driver的继承关系如下:




4. ComputeDriver 基类

接下来,我们来看下/nova/virt/driver.py 中的全部接口定义,它是整个virt部分的基础。详见文档中第一部分~

 

5. 基类接口在不同hypervisor 下的支持情况

上面那份表格第二部分,罗列出了不同hypervisor 对基类中全部接口的支持情况。从对比中可以看出,Openstack 对于 libvirt 的支持最好,XenAPI也基本都覆盖到了;这也和Openstack 设计时候的出发点有关。另外,对于VMWareAPIHyper-V,一些基本的功能也大致覆盖到了,但接口总体支持情况仅能算一般。

接下来,我们分别看一下不同hypervisor Driver情况~

6. 创vm 调用 virt

之前我在分析《创建vm》文档中写到过,经过调度的消息在compute模块中,会走到 /nova/compute/manager.py ComputeManager __init__() 方法。方法继续走到nova.virt.connection.get_connection 处:

 

    driver_name = known_drivers.get(FLAGS.connection_type)

    if driver_name is None:
        raise exception.VirtDriverNotFound(name=FLAGS.connection_type)

    conn = importutils.import_object_ns('nova.virt', driver_name,
                                        read_only=read_only)

    if conn is None:
        LOG.error(_('Failed to open connection to underlying virt platform'))
        sys.exit(1)
    return utils.check_isinstance(conn, driver.ComputeDriver)

 

 

原有essex版本中的基类connections.py,目前在folsom版本中已被简化,仅用来读取配置文件中的hypervisor类型,如:




并加载一个工具类 /nova/openstack/common/importutils.py,来返回一个nova.virt.libvirt 类。如下:




 

7. libvirt Driver

首先看一下libvirt的包结构,结构很简单,核心的方法都放在/nova/virt/libvirt/driver.py中,比起此前essex版本中放到connection.py的做法结构更加清晰了:




 

7.1 有关 libvirt

目前libvirt 下,一共支持 kvmlxcqemuumlxen 五种具体的libvirt_type,默认选用kvm

虚拟机的状态映射如下:

VIR 内部状态

对外呈现状态

说明

VIR_DOMAIN_NOSTATE

NOSTATE

 

VIR_DOMAIN_RUNNING

RUNNING

 

VIR_DOMAIN_BLOCKED

RUNNING

仅在Xen中存在Blocked状态

VIR_DOMAIN_PAUSED

PAUSED

 

VIR_DOMAIN_SHUTDOWN

SHUTDOWN

libvirt API文档中已指出,此时vm可能仍旧处于Running状态

VIR_DOMAIN_SHUTOFF

SHUTDOWN

 

VIR_DOMAIN_CRASHED

CRASHED

 

VIR_DOMAIN_PMSUSPENDED

SUSPENDED

 

 

7.2 libvirt 连接hypervisor

接下来开始看代码。整个libvritdriver.py文件 非常长(3000+python)。。。初始化部分,首先调用基类ComputerDriver类中的__init__(),之后主要由配置文件读取了一些基本的配置项。

libvrit 接口由_conn = property(_get_connection)来连接底层的hypervisor。而实际的连接工作,由内部的一个静态方法 _connect()进行调用,一种是只读方式,另一种是拥有读写权限的,后一种需要用root身份登录。代码如下:

 

@staticmethod
    def _connect(uri, read_only):
        def _connect_auth_cb(creds, opaque):
            if len(creds) == 0:
                return 0
            LOG.warning(
                _("Can not handle authentication request for %d credentials")
                % len(creds))
            raise exception.NovaException(
                _("Can not handle authentication request for %d credentials")
                % len(creds))

        auth = [[libvirt.VIR_CRED_AUTHNAME,
                 libvirt.VIR_CRED_ECHOPROMPT,
                 libvirt.VIR_CRED_REALM,
                 libvirt.VIR_CRED_PASSPHRASE,
                 libvirt.VIR_CRED_NOECHOPROMPT,
                 libvirt.VIR_CRED_EXTERNAL],
                _connect_auth_cb,
                None]

        if read_only:
            return libvirt.openReadOnly(uri)
        else:
            return libvirt.openAuth(uri, auth, 0)

 

 

      

7.3 libvirt 创建vm实例

我们接着来看下spawn()方法,这个是libvirt 对外的创建vm接口。传入参数,都是由Nova 处理过的虚拟机、镜像、网络、安全等方面的参数。

 

 

@exception.wrap_exception()
    def spawn(self, context, instance, image_meta, injected_files,
              admin_password, network_info=None, block_device_info=None):
        xml = self.to_xml(instance, network_info, image_meta,
                          block_device_info=block_device_info)
        self._create_image(context, instance, xml, network_info=network_info,
                           block_device_info=block_device_info,
                           files=injected_files,
                           admin_pass=admin_password)
        self._create_domain_and_network(xml, instance, network_info,
                                        block_device_info)
        LOG.debug(_("Instance is running"), instance=instance)

        def _wait_for_boot():
            """Called at an interval until the VM is running."""
            state = self.get_info(instance)['state']

            if state == power_state.RUNNING:
                LOG.info(_("Instance spawned successfully."),
                         instance=instance)
                raise utils.LoopingCallDone()

        timer = utils.LoopingCall(_wait_for_boot)
        timer.start(interval=0.5).wait()

 
 方法入口处的self.to_xml()方法,把之前传入的虚拟机、网络、镜像等信息,转化为创建vm时使用的xml描述文件。这个方法中,针对不同 libvrit_typexen/kvm/qemu/…)做了大量的分别处理。方法最终走到config.py中,调用基类LibvirtConfigObject to_xml()方法,生成描述文件,代码如下:

 

 

    def to_xml(self, pretty_print=True):
        root = self.format_dom()
        xml_str = etree.tostring(root, pretty_print=pretty_print)
        LOG.debug("Generated XML %s " % (xml_str,))
        return xml_str

 

             

回到spawn()中,_create_image() 方法略过。接下来看下_create_domain_and_network(),用来设置卷映射、构建网络参数,最后创建vm实例。以下是方法的简明分析:




 

其中,在底层创建vm的动作,是在_create_domain()中完成的。它根据上一步生成好的xml的内容,定义一个虚拟机,相当于创建了一个virDomain对象,注意这时还没有启动这个虚拟机。

另外,其他需要vm的动作都是通过组装+调用该方法实现的。

 

    def _create_domain(self, xml=None, domain=None, launch_flags=0):
        """Create a domain.

        Either domain or xml must be passed in. If both are passed, then
        the domain definition is overwritten from the xml.
        """
        if xml:
            domain = self._conn.defineXML(xml)
        domain.createWithFlags(launch_flags)
        self._enable_hairpin(domain.XMLDesc(0))
        return domain

 

      

       其余libvirt API分析,因时间关系暂略。

 

8. XenAPI Driver

还是先看下 XenAPI驱动部分的包结构。和libvirt的结构基本相同。




XenAPI Driver部分,一共分两个类,包括连接 XenServer或者 Xen CloudXenAPIDriver 部分,以及一个调用XenAPI XenAPISession 类。

连接的初始化部分如下,其中,所有Xen相关的配置,和其他配置项一起保存在nova.conf中,通过之前《创建vm》文档中提到的flags.py来读取。配置项太长了,这里就不贴了。

 

class XenAPIDriver(driver.ComputeDriver):
    """A connection to XenServer or Xen Cloud Platform"""

    def __init__(self, read_only=False):
        super(XenAPIDriver, self).__init__()

        url = FLAGS.xenapi_connection_url
        username = FLAGS.xenapi_connection_username
        password = FLAGS.xenapi_connection_password
        if not url or password is None:
            raise Exception(_('Must specify xenapi_connection_url, '
                              'xenapi_connection_username (optionally), and '
                              'xenapi_connection_password to use '
                              'compute_driver=xenapi.XenAPIDriver'))

        self._session = XenAPISession(url, username, password)
        self._volumeops = volumeops.VolumeOps(self._session)
        self._host_state = None
        self._host = host.Host(self._session)
        self._vmops = vmops.VMOps(self._session)
        self._initiator = None
        self._hypervisor_hostname = None
        self._pool = pool.ResourcePool(self._session)

 

之后对于Xen主机、卷、资源池的操作,都是通过上面初始化了的对象,通过XenAPISession发送消息。不细写了~

 

9. VMWareApi Driver

目前,Openstack对于VMWare虚拟化的支持,还是主要集中于对于 ESX的异构,暂时还无法覆盖到vCenter的层面。

 

依旧先来看下 VMwareAPI驱动的包结构:




还是先看下driver.py,文件开头的配置部分列出了连接ESX所需的一些基础配置项,包括主机地址、用户名、密码等常规内容。这些都可以在nova.conf 中进行配置。如下:

 

vmwareapi_opts = [
    cfg.StrOpt('vmwareapi_host_ip',
               default=None,
               help='URL for connection to VMWare ESX host.Required if '
                    'compute_driver is vmwareapi.VMWareESXDriver.'),
    cfg.StrOpt('vmwareapi_host_username',
               default=None,
               help='Username for connection to VMWare ESX host. '
                    'Used only if compute_driver is '
                    'vmwareapi.VMWareESXDriver.'),
    cfg.StrOpt('vmwareapi_host_password',
               default=None,
               help='Password for connection to VMWare ESX host. '
                    'Used only if compute_driver is '
                    'vmwareapi.VMWareESXDriver.'),
    cfg.FloatOpt('vmwareapi_task_poll_interval',
                 default=5.0,
                 help='The interval used for polling of remote tasks. '
                       'Used only if compute_driver is '
                       'vmwareapi.VMWareESXDriver.'),
    cfg.IntOpt('vmwareapi_api_retry_count',
               default=10,
               help='The number of times we retry on failures, e.g., '
                    'socket error, etc. '
                    'Used only if compute_driver is '
                    'vmwareapi.VMWareESXDriver.'),
    cfg.StrOpt('vmwareapi_vlan_interface',
               default='vmnic0',
               help='Physical ethernet adapter name for vlan networking'),
    ]

FLAGS = flags.FLAGS
FLAGS.register_opts(vmwareapi_opts)

 

以下是配置文件的sample,因未配置所以这几项目前是None

 


 

继续看driver.py的代码,可以发现VMWare Driver部分的代码结构,与XenAPI的非常相似。都是有两个类,包括一个作为ESX主机连接对象的VMWareESXDriver 部分 + 一个用于与ESX主机建立连接并处理全部请求调用的VMWareAPISession 类。代码不细写了~

      

10. Hyper-V Driver

essex版本规划中,本来计划要删掉的Hyper-V driver,由于微软积极投入开发人员更新代码,反而把功能补齐了。这里是Hyper-V driver的包结构:




Hyper-V Driver支持,主要是使用一个基于pythonWindows Management Instrumentation (WMI)来实现。这里有微软关于WMI的介绍:http://msdn.microsoft.com/en-us/library/cc723875%28v=VS.85%29.aspx

主要处理类都在HyperVDriver的初始化方法中定义了:

 

class HyperVDriver(driver.ComputeDriver):
    def __init__(self):
        super(HyperVDriver, self).__init__()

        self._volumeops = volumeops.VolumeOps()
        self._vmops = vmops.VMOps(self._volumeops)
        self._snapshotops = snapshotops.SnapshotOps()
        self._livemigrationops = livemigrationops.LiveMigrationOps(
            self._volumeops)

 

 

              其他基本相同,过程略。

 

 本博客欢迎转发,但请保留原作者(@孔令贤HW)信息!内容系本人学习、研究和总结,如有雷同,实属荣幸!

  • 大小: 14.2 KB
  • 大小: 14.6 KB
  • 大小: 2.2 KB
  • 大小: 56 KB
  • 大小: 1.4 KB
  • 大小: 46.4 KB
  • 大小: 6.5 KB
  • 大小: 87.8 KB
  • 大小: 8.9 KB
  • 大小: 8.5 KB
  • 大小: 26.9 KB
  • 大小: 9 KB
分享到:
评论

相关推荐

    openstack nova源码分析

    在进行OpenStack Nova源码分析时,我们需要深入了解其架构、核心模块以及关键流程。 首先,Nova的整体架构基于服务模型,包括以下主要服务: 1. **nova-api**:API服务,对外提供RESTful API接口,用于与其他...

    Openstack_Folsom_quantum网络虚拟化

    Openstack_Folsom_quantum网络虚拟化

    CCTC 2016 Intel徐贺杰:OpenStack Nova 变革及Mitaka 更新

    Intel作为全球知名的半导体公司,其工程师在CCTC(中国云计算技术大会)上发表的关于OpenStack Nova变革及Mitaka更新的主题演讲,为我们揭示了该领域最新的发展动态。 在演讲中,Intel的工程师首先探讨了OpenStack ...

    网络游戏-基于OpenStack的PowerVM虚拟化网络管理方法及装置.zip

    《网络游戏-基于OpenStack的PowerVM虚拟化网络管理方法及装置》 在当前的网络游戏行业中,虚拟化技术已经成为提升服务质量和资源利用率的关键手段。本文主要探讨了如何利用OpenStack平台结合PowerVM虚拟化技术,来...

    openstack gpu 虚拟化

    硬件上确保服务器平台支持GPU虚拟化技术,软件上需要修改和增强OpenStack的相关组件,如Nova、Glance等,以实现对虚拟GPU设备的管理和调度。随着技术的不断进步和应用场景的扩展,GPU虚拟化在云计算领域的应用将会...

    openstack(Folsom) ubuntu安装文档

    - **主要特性**:Folsom版增加了对网络虚拟化的支持,引入了Neutron(原Quantum)项目来管理网络资源,同时在身份认证服务(Keystone)、对象存储(Swift)、计算服务(Nova)等方面进行了优化。 #### 知识点二:...

    openstack nova源码分析.pdf

    openstack nova源码分析.pdf

    Openstack Nova实现与Hypervisor对接.docx

    - **VMware vSphere**:企业级虚拟化解决方案,通过适当的驱动程序与OpenStack集成。 - **Hyper-V**:微软的虚拟化技术,支持Windows Server环境。 - **LXC (Linux Containers)**:轻量级容器技术,适用于特定场景下...

    OpenStack组件之Nova

    OpenStack组件之Nova是OpenStack项目的核心组件之一,负责管理计算资源,网络和认证等,尽管它本身不提供虚拟化能力,但其作用在于对计算资源进行组织和调度。Nova是NASA主导开发的项目,最初是作为NASA内部的云计算...

    OPENSTACK 计算 (Compute) - Nova源码

    通过阅读和分析这些源码,开发者可以了解到OpenStack Nova如何处理请求、如何与数据库交互、如何进行资源调度,以及如何与底层虚拟化技术对接。这有助于理解OpenStack的分布式架构,以及如何扩展和定制Nova以满足...

    openstack-nova计算节点一键安装脚本_openstack-nova_openstack_

    2. **Libvirt**:作为hypervisor的接口,Nova-Compute通过libvirt与底层虚拟化技术进行交互,实现对虚拟机的管理。 3. **QEMU**:在KVM环境中,QEMU是一个模拟器,配合KVM提供硬件虚拟化功能。 4. **Neutron Agent**...

    PowerVC在OpenStack下的虚拟化管理.doc

    PowerVC 在 OpenStack 下的虚拟化管理 PowerVC 是 IBM 公司开发的一款虚拟化管理软件,旨在帮助企业更好地管理和优化其虚拟化环境。OpenStack 是一个开源的云计算平台,提供了一个基础设施即服务(IaaS)的解决方案...

    OpenStack源码分析-NOVA

    ### OpenStack源码分析—NOVA模块 #### 一、OpenStack与NOVA概述 OpenStack作为一款开源的云计算管理平台,提供了丰富的功能和服务来帮助用户构建和管理云基础设施。在其众多服务中,Nova(计算服务)是核心组成...

    OpenStack Nova安装手册

    ### OpenStack Nova安装手册知识点详解 #### 一、OpenStack与Nova概述 - **OpenStack**: 开源软件项目,旨在为公共云和私有云提供一套可扩展的云计算平台。 - **Nova**: OpenStack的核心组件之一,负责计算实例的...

    OpenStack Nova源码分析之基础环境配置eclipse+pydev

    ### OpenStack Nova源码分析之基础环境配置:Eclipse + PyDev #### 一、基础知识与背景介绍 OpenStack是一个开源的云计算管理平台项目,它提供了API和一系列服务来管理和控制大型计算集群中的虚拟服务器资源。Nova...

    openstack nova 部分原理

    1. 服务器(虚拟化层)管理:用户能够创建和管理自己的服务器实例。 2. 规格管理(云主机类型):定义了云主机的配置标准,比如内存、CPU核心数、存储空间等。Nova提供了多个预定义的规格,如m1.tiny、m1.small、m1....

    OpenStack组件Nova.zip

    Nova 是 OpenStack 组件,它提供一个云计算网络控制器,支持大量的虚拟机...Nova 主要由一组 Python 守护进程组成,尽管它还需要并集成了一些用于数据库的本地系统组件,以及消息传递和虚拟化功能。 标签:Nova

    详细讲解OpenStack最新版本Folsom架构

    OpenStack的Folsom版本是该开源云平台的第六个主要发行版,发布于2012年9月,标志着OpenStack向着更加成熟和全面的云计算解决方案迈出了重要的一步。Folsom版本引入了许多关键改进,尤其是对于网络功能的支持,这...

Global site tag (gtag.js) - Google Analytics