镜像和实例

虚拟机镜像包含一个虚拟磁盘,其中包含一个可启动的操作系统。磁盘镜像为虚拟机文件系统提供了模板。镜像服务控制镜像的存储和管理。

实例是在云内部的物理计算节点上运行的单个虚拟机。用户可以从同一个镜像启动任意数量的实例。每个启动的实例都从基础镜像的副本运行。对实例所做的任何更改都不会影响基础镜像。快照捕获实例运行磁盘的状态。用户可以创建快照,并基于这些快照构建新镜像。计算服务控制实例、镜像和快照的存储和管理。

启动实例时,您必须选择一个flavor,它代表一组虚拟资源。Flavor定义了虚拟CPU数量、可用RAM大小和临时磁盘大小。用户必须从云上定义的可用flavor集中进行选择。OpenStack提供了许多预定义的flavor,您可以编辑或添加它们。

注意

您可以从正在运行的实例中添加和删除额外资源,例如持久卷存储或公共IP地址。本章使用的示例是OpenStack云中典型的虚拟系统。它使用cinder-volume服务,该服务提供持久块存储,而不是所选实例flavor提供的临时存储。

此图显示了启动实例前的系统状态。镜像存储库中有许多预定义的镜像,由镜像服务支持。在云内部,计算节点包含可用的vCPU、内存和本地磁盘资源。此外,cinder-volume服务存储预定义卷。


没有运行实例的基础镜像状态

../_images/instance-life-1.png

实例启动

要启动实例,请选择一个镜像、flavor和任何可选属性。选定的flavor提供一个根卷(在此图中标记为vda)和额外的临时存储(标记为vdb)。在此示例中,cinder-volume存储映射到此实例上的第三个虚拟磁盘,即vdc


从镜像创建实例

../_images/instance-life-2.png

镜像服务将基础镜像从镜像存储库复制到本地磁盘。本地磁盘是实例访问的第一个磁盘,它是标记为vda的根卷。较小的实例启动更快。需要跨网络复制的数据更少。

还创建了新的空临时磁盘,标记为vdb。删除实例时,此磁盘将被删除。

计算节点使用iSCSI连接到已连接的cinder-volumecinder-volume映射到此图中标记为vdc的第三个磁盘。计算节点配置vCPU和内存资源后,实例从根卷vda启动。实例运行并更改磁盘上的数据(在图中以红色突出显示)。如果卷存储位于单独的网络上,则存储节点配置文件中指定的my_block_storage_ip选项会将镜像流量定向到计算节点。

注意

此示例场景中的某些细节在您的环境中可能有所不同。例如,您可能使用不同类型的后端存储或不同的网络协议。一个常见的变体是用于卷vdavdb的临时存储可以由网络存储而不是本地磁盘支持。

删除实例时,除持久卷外,状态将被回收。临时存储(无论是否加密)都将被清除。内存和vCPU资源将被释放。在此过程中,镜像保持不变。


实例退出后镜像和卷的最终状态

../_images/instance-life-3.png

镜像属性和属性保护

镜像属性是管理员或镜像所有者附加到OpenStack镜像服务镜像的键值对,如下所示

  • 管理员定义核心属性,例如镜像名称。

  • 管理员和镜像所有者可以定义附加属性,例如许可和计费信息。

管理员可以将任何属性配置为受保护,这限制了哪些策略或用户角色可以对该属性执行CRUD操作。受保护的属性通常是只有管理员才能访问的附加属性。此外,Glance本身保留以os_glance前缀命名的属性供其自身使用。

对于未受保护的镜像属性,管理员可以管理核心属性,镜像所有者可以管理附加属性。

配置属性保护

要配置属性保护,请编辑policy.yaml文件。此文件还可用于设置镜像服务操作的策略。

  1. policy.yaml文件中定义角色或策略

    {
        "context_is_admin":  "role:admin",
        "default": "",
    
        "add_image": "",
        "delete_image": "",
        "get_image": "",
        "get_images": "",
        "modify_image": "",
        "publicize_image": "role:admin",
        "copy_from": "",
    
        "download_image": "",
        "upload_image": "",
    
        "delete_image_location": "",
        "get_image_location": "",
        "set_image_location": "",
    
        "add_member": "",
        "delete_member": "",
        "get_member": "",
        "get_members": "",
        "modify_member": "",
    
        "manage_image_cache": "role:admin",
    
        "get_task": "",
        "get_tasks": "",
        "add_task": "",
        "modify_task": "",
    
        "deactivate": "",
        "reactivate": "",
    
        "get_metadef_namespace": "",
        "get_metadef_namespaces":"",
        "modify_metadef_namespace":"",
        "add_metadef_namespace":"",
        "delete_metadef_namespace":"",
    
        "get_metadef_object":"",
        "get_metadef_objects":"",
        "modify_metadef_object":"",
        "add_metadef_object":"",
        "delete_metadef_object":"",
    
        "list_metadef_resource_types":"",
        "get_metadef_resource_type":"",
        "add_metadef_resource_type_association":"",
        "remove_metadef_resource_type_association":"",
    
        "get_metadef_property":"",
        "get_metadef_properties":"",
        "modify_metadef_property":"",
        "add_metadef_property":"",
        "remove_metadef_property":"",
    
        "get_metadef_tag":"",
        "get_metadef_tags":"",
        "modify_metadef_tag":"",
        "add_metadef_tag":"",
        "add_metadef_tags":"",
        "delete_metadef_tag":"",
        "delete_metadef_tags":""
     }
    

    对于每个参数,使用"rule:restricted"限制所有用户访问,或使用"role:admin"将访问限制为管理员角色。例如

    {
        "download_image":
        "upload_image":
    }
    
  2. 在属性保护配置文件中定义哪些角色或策略可以管理哪些属性。例如

    [x_none_read]
    create = context_is_admin
    read = !
    update = !
    delete = !
    
    [x_none_update]
    create = context_is_admin
    read = context_is_admin
    update = !
    delete = context_is_admin
    
    [x_none_delete]
    create = context_is_admin
    read = context_is_admin
    update = context_is_admin
    delete = !
    
    • @值允许对属性执行相应的操作。

    • !值不允许对属性执行相应的操作。

  3. glance-api.conf文件中,定义属性保护配置文件的位置。

    property_protection_file = {file_name}
    

    此文件包含属性保护的规则以及与之关联的角色和策略。

    默认情况下,不强制执行属性保护。

    如果您指定了文件名值且未找到文件,则glance-api服务将不会启动。

    要查看示例配置文件,请参阅glance-api.conf

  4. 可选地,在glance-api.conf文件中,指定在属性保护配置文件中是否使用角色或策略

    property_protection_rule_format = roles
    

    默认值为roles

    要查看示例配置文件,请参阅glance-api.conf

镜像下载:工作原理

在启动虚拟机之前,将虚拟机镜像从镜像服务传输到计算节点。其工作方式可能因计算节点和镜像服务的设置而异。

通常,计算服务将使用调度服务传递给它的镜像标识符,并从镜像API请求镜像。尽管镜像不存储在Glance中,而是存储在后端(可以是对象存储、文件系统或任何其他受支持的方法),但连接是从计算节点到镜像服务建立的,镜像通过此连接传输。镜像服务将镜像从后端流式传输到计算节点。

可以将对象存储节点设置在单独的网络上,并且仍然允许镜像流量在计算节点和对象存储节点之间流动。在存储节点配置文件中配置my_block_storage_ip选项,以允许块存储流量到达计算节点。

某些后端支持更直接的方法,即在请求时,镜像服务将返回一个直接链接到后端存储的URL。您可以使用此方法下载镜像。目前,唯一支持直接下载方法的存储是文件系统存储。在计算节点上的nova.conf文件的image_file_url部分中,使用filesystems选项配置该方法。

计算节点还实现了镜像缓存,这意味着如果镜像之前已使用过,则不一定会每次都下载。有关计算节点上缓存配置选项的信息可以在配置参考中找到。

实例构建块

在OpenStack中,基本操作系统通常从OpenStack镜像服务中存储的镜像复制。这会产生一个临时实例,该实例从已知的模板状态启动,并在关闭时丢失所有累积状态。

您还可以将操作系统放在计算或块存储卷系统中的持久卷上。这提供了一个更传统的持久系统,该系统累积的状态在重新启动时得到保留。要获取系统上可用镜像的列表,请运行

$ glance image-list
+--------------------------------------+-----------------------------+
| ID                                   | Name                        |
+--------------------------------------+-----------------------------+
| aee1d242-730f-431f-88c1-87630c0f07ba | Ubuntu 14.04 cloudimg amd64 |
+--------------------------------------+-----------------------------+
| 0b27baa1-0ca6-49a7-b3f4-48388e440245 | Ubuntu 14.10 cloudimg amd64 |
+--------------------------------------+-----------------------------+
| df8d56fc-9cea-4dfd-a8d3-28764de3cb08 | jenkins                     |
+--------------------------------------+-----------------------------+

显示的镜像属性是

ID

自动生成或用户提供的镜像UUID。

名称

镜像的自由格式、人类可读名称。

虚拟硬件模板称为flavors,由管理员定义。在Newton发布之前,默认安装还包括五个预定义flavor。

要获取系统上可用flavor的列表,请运行

$ openstack flavor list
+-----+-----------+-------+------+-----------+-------+-----------+
| ID  | Name      |   RAM | Disk | Ephemeral | VCPUs | Is_Public |
+-----+-----------+-------+------+-----------+-------+-----------+
| 1   | m1.tiny   |   512 |    1 |         0 |     1 | True      |
| 2   | m1.small  |  2048 |   20 |         0 |     1 | True      |
| 3   | m1.medium |  4096 |   40 |         0 |     2 | True      |
| 4   | m1.large  |  8192 |   80 |         0 |     4 | True      |
| 5   | m1.xlarge | 16384 |  160 |         0 |     8 | True      |
+-----+-----------+-------+------+-----------+-------+-----------+

默认情况下,管理员用户可以配置flavor。您可以通过重新定义compute-api服务器上/etc/nova/policy.yamlcompute_extension:flavormanage的访问控制来更改此行为。

实例管理工具

OpenStack提供命令行、Web界面和基于API的实例管理工具。第三方管理工具也可用,它们使用本机API或提供的EC2兼容API。

OpenStack python-openstackclient包提供了一个基本的命令行工具,它使用openstack命令。它作为大多数Linux发行版的原生包提供,或者您可以使用pip python包安装程序安装最新版本

# pip install python-openstackclient

有关python-openstackclient和其他命令行工具的更多信息,请参阅OpenStack终端用户指南

最新的镜像管理工具可以使用pip包管理器安装

# pip install python-glanceclient

此包为您提供了glance用于管理所有镜像。

控制实例运行位置

OpenStack配置参考的调度部分提供了有关控制实例运行位置的详细信息,包括确保一组实例在不同的计算节点上运行以实现服务弹性,或在同一节点上运行以实现高性能的实例间通信。

管理员用户可以指定其实例运行在哪个计算节点上。为此,请指定--availability-zone AVAILABILITY_ZONE:COMPUTE_HOST参数。

使用UEFI启动实例

统一可扩展固件接口(UEFI)是一种旨在替代传统BIOS的标准固件。操作系统正在缓慢但稳步地转向UEFI格式,在某些情况下,使其成为唯一格式。

配置UEFI环境

要在QEMU/KVM环境中成功从UEFI镜像启动实例,管理员必须在计算节点上安装以下软件包

  • OVMF,Intel tianocore固件到QEMU虚拟机的移植。

  • libvirt,自1.2.9版本以来一直支持UEFI引导。

由于默认UEFI加载器路径是/usr/share/OVMF/OVMF_CODE.fd,因此管理员在安装UEFI软件包后必须在此位置创建一个链接。

上传UEFI镜像

要从UEFI镜像启动实例,管理员必须首先上传一个UEFI镜像。为此,在创建镜像时必须将hw_firmware_type属性设置为uefi。例如

$ glance image-create-via-import --container-format bare \
  --disk-format qcow2 --property hw_firmware_type=uefi \
  --file /tmp/cloud-uefi.qcow --name uefi

之后,您可以从这个UEFI镜像启动实例。