第 1 章 镜像服务

管理 Red Hat OpenStack Platform (RHOSP)中的镜像和存储。

虚拟机镜像是一个文件,其中包含安装了可引导操作系统的虚拟磁盘。虚拟机映像支持不同的格式。RHOSP 中提供了以下格式:

  • RAW - 不结构化的磁盘镜像格式。
  • QCOW2 - QEMU 模拟器支持的磁盘格式。此格式包括 QCOW2v3 (有时称为 QCOW3),这需要 QEMU 1.1 或更高版本。
  • ISO - 保存在磁盘上的数据的按扇区副本,存储在二进制文件中。
  • AKI - 表示 Amazon 内核镜像。
  • ami - 表示 Amazon Machine 镜像。
  • ARI - 表示 Amazon RAMDisk 镜像。
  • VDI - VirtualBox 虚拟机监控和 QEMU 模拟器支持的磁盘格式。
  • VHD - VMware、VirtualBox 等虚拟机监控器使用的通用磁盘格式。
  • PLOOP - Virtuozzo 支持和使用的磁盘格式来运行 OS 容器。
  • OVA - 表示镜像服务(glance)中存储的内容是 OVA tar 归档文件。
  • DOCKER - 表示镜像服务(glance)中存储的内容是容器文件系统的 Docker tar 存档。

虽然 ISO 通常不被视为虚拟机镜像格式,因为 ISO 包含安装的操作系统的可引导文件系统,但使用与其他虚拟机镜像文件相同的方式。

要下载官方 Red Hat Enterprise Linux 云镜像,您的帐户必须具有有效的 Red Hat Enterprise Linux 订阅:

如果您没有登录到客户门户网站,则会打开一个提示,其中必须输入您的红帽帐户凭证。

1.1. 了解镜像服务

Red Hat OpenStack Platform (RHOSP)镜像服务(glance)功能。

1.1.1. 支持的镜像服务后端

支持以下镜像服务(glance)后端场景:

  • 使用 Ceph 时,RBD 是默认后端。有关更多信息,请参阅高级 Overcloud 自定义指南中的 配置 Ceph 存储
  • RBD 多存储.如需更多信息,请参阅 存储边缘架构要求
  • Object Storage (swift)。有关更多信息,请参阅高级 Overcloud 自定义指南中的使用外部 Object Storage 集群

    镜像服务使用 Object Storage 类型和后端作为默认值。

  • Block Storage (cinder)。有关更多信息,请参阅高级 Overcloud 自定义指南中的为镜像服务配置 Cinder 后端
  • NFS.有关更多信息,请参阅高级 Overcloud 自定义指南中的 配置 NFS 存储

    重要的

    虽然 NFS 是支持的镜像服务部署选项,但提供了更强大的选项。

    NFS 不适用于镜像服务。当您在镜像服务上挂载 NFS 共享时,镜像服务不管理该操作。镜像服务将数据写入文件系统,但不知道后端是 NFS 共享。

    在这种部署中,如果共享失败,镜像服务无法重试请求。这意味着,当后端发生故障时,存储可能会进入只读模式,或者可能会继续将数据写入本地文件系统,在这种情况下,会面临数据丢失的风险。要从这种情况中恢复,您必须确保共享已挂载并同步,然后重启镜像服务。因此,红帽不推荐将 NFS 用作镜像服务后端。

    但是,如果您选择将 NFS 用作镜像服务后端,则以下一些最佳实践可帮助降低风险:

    • 使用可靠的生产级 NFS 后端。
    • 确保您在 Controller 节点和 NFS 后端之间有一个强大且可靠的连接:建议使用第 2 层(L2)网络连接。
    • 包括挂载的共享的监控和警报。
    • 设置底层文件系统权限。写入权限必须存在于用作存储的共享文件系统中。
    • 确保在其上运行 glance-api 进程的用户和组对本地文件系统没有写入权限。这意味着进程可以检测可能的挂载失败,并在写入尝试期间将存储置于只读模式。

1.1.2. 镜像签名和验证

镜像签名和验证通过启用部署程序为镜像签名并保存签名和公钥证书作为镜像属性来保护镜像的完整性和真实性。

通过利用此功能,您可以执行以下任务:

  • 使用您的私钥为镜像签名并上传镜像、签名以及对您的公钥证书(验证元数据)的引用。然后,镜像服务会验证签名是否有效。
  • 在 Compute 服务中创建镜像,使 Compute 服务为镜像签名,并上传镜像及其验证元数据。镜像服务再次验证签名是否有效。
  • 在 Compute 服务中请求签名的镜像。镜像服务提供镜像及其验证元数据,允许计算服务在引导镜像之前验证镜像。

有关镜像签名和验证的更多信息,请参阅使用 OpenStack Key Manager 管理 Secret 中的 验证 Glance 镜像

1.1.3. 镜像转换

镜像转换通过在导入镜像时调用任务 API 转换镜像。

作为导入工作流的一部分,插件提供镜像转换。可根据部署器配置激活或取消激活此插件。因此,部署器需要指定部署的首选镜像格式。

在内部,镜像服务以特定格式接收镜像的位。这些位存储在临时位置。然后,会触发插件将镜像转换为目标格式,并移到最终目的地。任务完成后,临时位置会被删除。因此,镜像服务最初上传的格式不会被保留。

有关镜像转换的更多信息,请参阅启用镜像转换

注意

只有导入镜像时才能触发转换。上传镜像时不会运行它。例如:

$ glance image-create-via-import \
    --disk-format qcow2 \
    --container-format bare \
    --name NAME \
    --visibility public \
    --import-method web-download \
    --uri http://server/image.qcow2

1.1.4. 可互操作的镜像导入

可组合镜像导入工作流允许您以两种方式导入镜像:

  • 使用 web-download (默认)方法从 URI 导入镜像。
  • 使用 glance-direct 方法从本地文件系统导入镜像。

1.1.5. 使用镜像服务缓存提高可扩展性

使用 glance-api 缓存机制在镜像服务(glance) API 服务器上存储镜像副本,并自动检索它们以提高可扩展性。使用镜像服务缓存,glance-api 可以在多个主机上运行。这意味着不需要多次从后端存储检索同一镜像。镜像服务缓存不会影响任何镜像服务操作。

使用 Red Hat OpenStack Platform director (tripleo) heat 模板配置镜像服务缓存:

流程

  1. 在环境文件中,将 GlanceCacheEnabled 参数的值设置为 true,这会在 glance-api.conf heat 模板中自动将 flavor 值设置为 keystone+cachemanagement

    parameter_defaults:
        GlanceCacheEnabled: true
  2. 在重新部署 overcloud 时,将环境文件包含在 openstack overcloud deploy 命令中。
  3. 可选:在重新部署 overcloud 时将 glance_cache_pruner 识别为替代频率。以下示例显示了 5 分钟的频率:

    parameter_defaults:
      ControllerExtraConfig:
        glance::cache::pruner::minute: '*/5'

    根据您的需要调整频率,以避免文件系统完全场景。选择替代频率时包含以下元素:

    • 要在环境中缓存的文件大小。
    • 可用空间量。
    • 环境缓存镜像的频率。

1.1.6. 镜像预缓存

该功能在此发行版本中作为技术预览提供,因此不享有红帽的全面支持。它只应用于测试,不应部署在生产环境中。有关技术预览功能的更多信息,请参阅覆盖范围详细信息

1.1.6.1. 为定期镜像预缓存配置默认间隔

Red Hat OpenStack Platform (RHOSP) director 可以预缓存镜像作为 glance-api 服务的一部分。默认的定期间隔为 300 秒。您可以根据您的要求增加或减少默认间隔。

流程

  1. 根据您的要求,在 undercloud 上的环境文件中添加带有 ExtraConfig 参数的新间隔:

    parameter_defaults:
      ControllerExtraConfig:
        glance::config::glance_api_config:
          DEFAULT/cache_prefetcher_interval:
            value: '<300>'

    将 <300> 替换为您要作为预缓存镜像间隔的秒数。

  2. 在调整 /home/stack/templates/ 中环境文件中的间隔后,以 stack 用户身份登录并部署配置:

    $ openstack overcloud deploy --templates \
    -e /home/stack/templates/<ENV_FILE>.yaml

    将 <ENV_FILE> 替换为包含您添加的 ExtraConfig 设置的环境文件名称。

重要

如果您在创建 overcloud 时传递任何额外的环境文件,请使用 -e 选项再次传递它们,以避免对 overcloud 进行不必要的更改。

有关 openstack overcloud deploy 命令的更多信息 请参阅 Director 安装和使用指南中的部署命令

1.1.6.2. 使用定期作业预缓存镜像

先决条件

要使用定期作业预缓存镜像,您必须使用 glance-cache-manage 命令直接连接到运行 glance_api 服务的节点。不要使用代理,它会隐藏回答服务请求的节点。由于 undercloud 可能无法访问运行 glance_api 服务的网络,因此在第一个 overcloud 节点上运行命令,默认为 controller-0

完成以下前提条件步骤,以确保从正确的主机运行命令,具有必要的凭据,并且也从 glance-api 容器内运行 glance-cache-manage 命令。

流程

  1. 以 stack 用户身份登录 undercloud,再识别 controller-0 的调配 IP 地址:

    (undercloud) [stack@site-undercloud-0 ~]$ openstack server list -f value -c Name -c Networks | grep controller
    overcloud-controller-1 ctlplane=192.168.24.40
    overcloud-controller-2 ctlplane=192.168.24.13
    overcloud-controller-0 ctlplane=192.168.24.71
    (undercloud) [stack@site-undercloud-0 ~]$
  2. 要向 overcloud 进行身份验证,请将存储在 /home/stack/overcloudrc 中的凭证复制到 controller-0

    $ scp ~/overcloudrc heat-admin@192.168.24.71:/home/heat-admin/
  3. 连接到 controller-0

    $ ssh heat-admin@192.168.24.71
  4. controller-0 上,以 heat-admin 用户身份识别 glance_api 服务的 IP 地址。在以下示例中,IP 地址为 iwl 1.105

    (overcloud) [root@controller-0 ~]# grep -A 10 '^listen glance_api' /var/lib/config-data/puppet-generated/haproxy/etc/haproxy/haproxy.cfg
    listen glance_api
     server central-controller0-0.internalapi.redhat.local 172.25.1.105:9292 check fall 5 inter 2000 rise 2
  5. 由于 glance-cache-manage 命令仅在 glance_api 容器中可用,因此创建一个脚本,该脚本将执行到该容器中,以向 overcloud 进行身份验证的环境变量已经设置。在 controller-0 上的 /home/heat-admin 中创建一个名为 glance_pod.sh 的脚本,其内容如下:

    sudo podman exec -ti \
     -e NOVA_VERSION=$NOVA_VERSION \
     -e COMPUTE_API_VERSION=$COMPUTE_API_VERSION \
     -e OS_USERNAME=$OS_USERNAME \
     -e OS_PROJECT_NAME=$OS_PROJECT_NAME \
     -e OS_USER_DOMAIN_NAME=$OS_USER_DOMAIN_NAME \
     -e OS_PROJECT_DOMAIN_NAME=$OS_PROJECT_DOMAIN_NAME \
     -e OS_NO_CACHE=$OS_NO_CACHE \
     -e OS_CLOUDNAME=$OS_CLOUDNAME \
     -e no_proxy=$no_proxy \
     -e OS_AUTH_TYPE=$OS_AUTH_TYPE \
     -e OS_PASSWORD=$OS_PASSWORD \
     -e OS_AUTH_URL=$OS_AUTH_URL \
     -e OS_IDENTITY_API_VERSION=$OS_IDENTITY_API_VERSION \
     -e OS_COMPUTE_API_VERSION=$OS_COMPUTE_API_VERSION \
     -e OS_IMAGE_API_VERSION=$OS_IMAGE_API_VERSION \
     -e OS_VOLUME_API_VERSION=$OS_VOLUME_API_VERSION \
     -e OS_REGION_NAME=$OS_REGION_NAME \
    glance_api /bin/bash
  6. Source overcloudrc 文件,运行 glance_pod.sh 脚本,以使用必要的环境变量在 glance_api 中执行以在 overcloud Controller 节点中进行身份验证。

    [heat-admin@controller-0 ~]$ source overcloudrc
    (overcloudrc) [heat-admin@central-controller-0 ~]$ bash glance_pod.sh
    ()[glance@controller-0 /]$
  7. 使用 glance image-list 等命令来验证容器是否可以对 overcloud 运行经过身份验证的用户。

    ()[glance@controller-0 /]$ glance image-list
    +--------------------------------------+----------------------------------+
    | ID                                   | Name                             |
    +--------------------------------------+----------------------------------+
    | ad2f8daf-56f3-4e10-b5dc-d28d3a81f659 | cirros-0.4.0-x86_64-disk.img       |
    +--------------------------------------+----------------------------------+
    ()[glance@controller-0 /]$

流程

  1. 以 admin 用户身份,将镜像排队为缓存:

    $ glance-cache-manage --host=<host_ip> queue-image <image_id>
    • 将 <host_ip> 替换为运行 glance-api 容器的 Controller 节点的 IP 地址。
    • 将 <image_id> 替换为您要队列的镜像 ID。

      当您将要预缓存的镜像排队后,cache_images 定期作业会同时获取所有排队的镜像。

      注意

      由于镜像缓存对每个节点而言是本地的,如果您的 Red Hat OpenStack Platform 使用 HA (3、5 或 7 Controller)部署,那么在运行 glance-cache-manage 命令时,您必须使用 --host 选项指定主机地址。

  2. 运行以下命令,以查看镜像缓存中的镜像:

    $ glance-cache-manage --host=<host_ip> list-cached

    将 <host_ip> 替换为您环境中主机的 IP 地址。

相关信息

您可以使用额外的 glance-cache-manage 命令来实现以下目的:

  • list-cached,列出当前缓存的所有镜像。
  • list-queued,列出当前排队以缓存的所有镜像。
  • queue-image 以排队镜像以进行缓存。
  • delete-cached-image 从缓存中清除镜像。
  • delete-all-cached-images 从缓存中删除所有镜像。
  • delete-queued-image 从缓存队列中删除镜像。
  • delete-all-queued-images 从缓存队列中删除所有镜像。

1.1.7. 安全 metadef API

在 Red Hat OpenStack Platform (RHOSP)中,用户可以使用元数据定义(metadef) API 定义键值对和标签元数据。目前,用户可以创建的 metadef 命名空间、对象、属性、资源或标签的数量没有限制。

metadef API 可能会向未授权用户泄漏信息。恶意用户可以利用缺少限制,并使用无限的资源填充镜像服务(glance)数据库,这可以创建拒绝服务(DoS)攻击。

镜像服务策略控制 metadef API。但是,metadef API 的默认策略设置允许所有用户创建或读取 metadef 信息。因为 metadef 资源不是所有者的,所以具有可能敏感名称的 metadef 资源(如内部基础架构详情或客户名称)可以将这些信息公开给恶意用户。

1.1.7.1. 配置策略来限制 metadef API

要使镜像服务(glance)更安全,请在 Red Hat OpenStack Platform (RHOSP)部署中默认将 metadef 修改 API 限制为默认 admin 访问。

流程

  1. 作为云管理员,创建单独的 heat 模板环境文件,如 lock-down-glance-metadef-api.yaml,使其包含 Image 服务 metadef API 的策略覆盖:

    ...
    parameter_defaults:
      GlanceApiPolicies: {
    	glance-metadef_default: { key: 'metadef_default', value: '' },
    	glance-metadef_admin: { key: 'metadef_admin', value: 'role:admin' },
    	glance-get_metadef_namespace: { key: 'get_metadef_namespace', value: 'rule:metadef_default' },
    	glance-get_metadef_namespaces: { key: 'get_metadef_namespaces', value: 'rule:metadef_default' },
    	glance-modify_metadef_namespace: { key: 'modify_metadef_namespace', value: 'rule:metadef_admin' },
    	glance-add_metadef_namespace: { key: 'add_metadef_namespace', value: 'rule:metadef_admin' },
    	glance-delete_metadef_namespace: { key: 'delete_metadef_namespace', value: 'rule:metadef_admin' },
    	glance-get_metadef_object: { key: 'get_metadef_object', value: 'rule:metadef_default' },
    	glance-get_metadef_objects: { key: 'get_metadef_objects', value: 'rule:metadef_default' },
    	glance-modify_metadef_object: { key: 'modify_metadef_object', value: 'rule:metadef_admin' },
    	glance-add_metadef_object: { key: 'add_metadef_object', value: 'rule:metadef_admin' },
    	glance-delete_metadef_object: { key: 'delete_metadef_object', value: 'rule:metadef_admin' },
    	glance-list_metadef_resource_types: { key: 'list_metadef_resource_types', value: 'rule:metadef_default' },
    	glance-get_metadef_resource_type: { key: 'get_metadef_resource_type', value: 'rule:metadef_default' },
    	glance-add_metadef_resource_type_association: { key: 'add_metadef_resource_type_association', value: 'rule:metadef_admin' },
    	glance-remove_metadef_resource_type_association: { key: 'remove_metadef_resource_type_association', value: 'rule:metadef_admin' },
    	glance-get_metadef_property: { key: 'get_metadef_property', value: 'rule:metadef_default' },
    	glance-get_metadef_properties: { key: 'get_metadef_properties', value: 'rule:metadef_default' },
    	glance-modify_metadef_property: { key: 'modify_metadef_property', value: 'rule:metadef_admin' },
    	glance-add_metadef_property: { key: 'add_metadef_property', value: 'rule:metadef_admin' },
    	glance-remove_metadef_property: { key: 'remove_metadef_property', value: 'rule:metadef_admin' },
    	glance-get_metadef_tag: { key: 'get_metadef_tag', value: 'rule:metadef_default' },
    	glance-get_metadef_tags: { key: 'get_metadef_tags', value: 'rule:metadef_default' },
    	glance-modify_metadef_tag: { key: 'modify_metadef_tag', value: 'rule:metadef_admin' },
    	glance-add_metadef_tag: { key: 'add_metadef_tag', value: 'rule:metadef_admin' },
    	glance-add_metadef_tags: { key: 'add_metadef_tags', value: 'rule:metadef_admin' },
    	glance-delete_metadef_tag: { key: 'delete_metadef_tag', value: 'rule:metadef_admin' },
    	glance-delete_metadef_tags: { key: 'delete_metadef_tags', value: 'rule:metadef_admin' }
      }
    
    …
  2. 在部署 overcloud 时,使用 -e 选项包括部署命令中包含策略覆盖的环境文件:

    $ openstack overcloud deploy -e lock-down-glance-metadef-api.yaml

1.1.7.2. 启用 metadef API

如果您之前限制了元数据定义(metadef) API 或希望放宽新默认值,您可以覆盖 metadef 修改策略,允许用户更新其相应的资源。

重要

如果云管理员依赖于对 metadef API 的写入访问权限,则让所有用户都可以访问这些 API。但是,在这种配置中,可能会意外泄漏敏感资源名称,如客户名称和内部项目。管理员必须审核其系统,以识别之前创建的资源,这些资源可能容易受到攻击,即使所有用户只启用了读取访问权限。

流程

  1. 作为云管理员,登录 undercloud 并为策略覆盖创建一个文件。例如:

    $ cat open-up-glance-api-metadef.yaml
  2. 配置策略覆盖文件,以允许对所有用户进行 metadef API 读写访问:

    GlanceApiPolicies: {
        glance-metadef_default: { key: 'metadef_default', value: '' },
        glance-get_metadef_namespace: { key: 'get_metadef_namespace', value: 'rule:metadef_default' },
        glance-get_metadef_namespaces: { key: 'get_metadef_namespaces', value: 'rule:metadef_default' },
        glance-modify_metadef_namespace: { key: 'modify_metadef_namespace', value: 'rule:metadef_default' },
        glance-add_metadef_namespace: { key: 'add_metadef_namespace', value: 'rule:metadef_default' },
        glance-delete_metadef_namespace: { key: 'delete_metadef_namespace', value: 'rule:metadef_default' },
        glance-get_metadef_object: { key: 'get_metadef_object', value: 'rule:metadef_default' },
        glance-get_metadef_objects: { key: 'get_metadef_objects', value: 'rule:metadef_default' },
        glance-modify_metadef_object: { key: 'modify_metadef_object', value: 'rule:metadef_default' },
        glance-add_metadef_object: { key: 'add_metadef_object', value: 'rule:metadef_default' },
        glance-delete_metadef_object: { key: 'delete_metadef_object', value: 'rule:metadef_default' },
        glance-list_metadef_resource_types: { key: 'list_metadef_resource_types', value: 'rule:metadef_default' },
        glance-get_metadef_resource_type: { key: 'get_metadef_resource_type', value: 'rule:metadef_default' },
        glance-add_metadef_resource_type_association: { key: 'add_metadef_resource_type_association', value: 'rule:metadef_default' },
        glance-remove_metadef_resource_type_association: { key: 'remove_metadef_resource_type_association', value: 'rule:metadef_default' },
        glance-get_metadef_property: { key: 'get_metadef_property', value: 'rule:metadef_default' },
        glance-get_metadef_properties: { key: 'get_metadef_properties', value: 'rule:metadef_default' },
        glance-modify_metadef_property: { key: 'modify_metadef_property', value: 'rule:metadef_default' },
        glance-add_metadef_property: { key: 'add_metadef_property', value: 'rule:metadef_default' },
        glance-remove_metadef_property: { key: 'remove_metadef_property', value: 'rule:metadef_default' },
        glance-get_metadef_tag: { key: 'get_metadef_tag', value: 'rule:metadef_default' },
        glance-get_metadef_tags: { key: 'get_metadef_tags', value: 'rule:metadef_default' },
        glance-modify_metadef_tag: { key: 'modify_metadef_tag', value: 'rule:metadef_default' },
        glance-add_metadef_tag: { key: 'add_metadef_tag', value: 'rule:metadef_default' },
        glance-add_metadef_tags: { key: 'add_metadef_tags', value: 'rule:metadef_default' },
        glance-delete_metadef_tag: { key: 'delete_metadef_tag', value: 'rule:metadef_default' },
        glance-delete_metadef_tags: { key: 'delete_metadef_tags', value: 'rule:metadef_default' }
      }
    注意

    您必须将所有 metadef 策略配置为使用 rule:metadeta_default

  3. 在部署 overcloud 时,请使用 -e 选项将新的策略文件包含在部署命令中:

    $ openstack overcloud deploy -e open-up-glance-api-metadef.yaml