创建和管理镜像

Red Hat OpenStack Platform 16.1

创建和管理镜像

OpenStack Documentation Team

摘要

本指南提供了创建和管理镜像的步骤,以及配置镜像服务的步骤。

使开源包含更多

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。我们从这四个术语开始:master、slave、黑名单和白名单。由于此项工作十分艰巨,这些更改将在即将推出的几个发行版本中逐步实施。详情请查看 CTO Chris Wright 的信息

对红帽文档提供反馈

我们感谢您对文档提供反馈信息。与我们分享您的成功秘诀。

使用直接文档反馈(DDF)功能

使用 添加反馈 DDF 功能,用于特定句子、段落或代码块上的直接注释。

  1. Multi-page HTML 格式查看文档。
  2. 请确定您看到文档右上角的 反馈 按钮。
  3. 用鼠标指针高亮显示您想评论的文本部分。
  4. 添加反馈
  5. 添加反馈项中输入您的意见。
  6. 可选:添加您的电子邮件地址,以便文档团队可以联系您以讨论您的问题。
  7. Submit

第 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

1.2. 管理镜像

镜像服务(glance)为磁盘和服务器镜像提供发现、注册和交付服务。它提供了复制或快照服务器镜像的功能,并立即存储它。您可以将存储的镜像用作模板,比安装服务器操作系统和单独配置服务,快速、一致地委托新的服务器。

1.2.1. 创建镜像

使用 Red Hat Enterprise Linux 7 ISO 文件、Red Hat Enterprise Linux 6 ISO 文件或 Windows ISO 文件手动创建 QCOW2 格式的 Red Hat OpenStack Platform (RHOSP)兼容镜像。

1.2.1.1. 在 Red Hat OpenStack Platform 中使用 KVM 客户机镜像

您可以使用可用的 RHEL KVM 客户机 QCOW2 镜像:

这些镜像配置有 cloud-init,且必须利用 ec2 兼容元数据服务来置备 SSH 密钥才能正常工作。

就绪的 Windows KVM 客户机 QCOW2 镜像不可用。

注意

对于 KVM 客户机镜像:

  • 镜像中的 root 帐户被禁用,但 sudo 访问权限被授予一个名为 cloud-user 的特殊用户。
  • 此镜像没有设置 root 密码。

通过将 !! 放置到第二个字段中,将 root 密码锁定在 /etc/shadow 中。

对于 RHOSP 实例,从 RHOSP 仪表板或命令行生成 ssh 密钥对,并使用该组合键以 root 用户身份对实例执行 SSH 公共身份验证。

实例启动后,此公钥会注入到其中。然后,您可以使用您在创建密钥对时下载的私钥进行身份验证。

如果要创建自定义 Red Hat Enterprise Linux 或 Windows 镜像,请参阅创建 Red Hat Enterprise Linux 7 镜像、创建 Red Hat Enterprise Linux 6 镜像 或 创建 Windows 镜像。

1.2.1.2. 创建自定义 Red Hat Enterprise Linux 或 Windows 镜像

先决条件

  • 创建镜像的 Linux 主机机器。这可以是您可以在其上安装和运行 Linux 软件包( undercloud 或 overcloud 除外)的任何计算机。
  • advanced-virt 存储库已启用:

    $ sudo subscription-manager repos --enable=advanced-virt-for-rhel-8-x86_64-rpms
  • libvirt,virt-manager 会安装创建客户机操作系统所需的所有软件包:

    $ sudo dnf module install -y virt
  • libguestfs 工具用于安装一组访问和修改虚拟机镜像的工具:

    $ sudo dnf install -y libguestfs-tools-c
  • Red Hat Enterprise Linux 7 或 6 ISO 文件。如需更多信息,请参阅 RHEL 7.2 Binary DVD 或者 RHEL 6.8 Binary DVD 或者 Windows ISO 文件。如果您没有 Windows ISO 文件,请参阅 Microsoft TechNet 评估中心 下载评估镜像。
  • 文本编辑器,如果您要更改 kickstart 文件(仅限 RHEL)。
重要

如果在 undercloud 上安装 libguestfs-tools 软件包,请禁用 iscsid.socket,以避免在 undercloud 上与 tripleo_iscsid 服务冲突:

$ sudo systemctl disable --now iscsid.socket
1.2.1.2.1. 创建 Red Hat Enterprise Linux 7 镜像

使用 Red Hat Enterprise Linux 7 ISO 文件手动创建 QCOW2 格式的 Red Hat OpenStack Platform (RHOSP)兼容镜像。

注意

您必须在主机机器上使用 [root@host]# 运行所有命令。

  1. 使用 virt-install 开始安装:

    [root@host]# qemu-img create -f qcow2 rhel7.qcow2 8G
    [root@host]# virt-install --virt-type kvm --name rhel7 --ram 2048 \
    --cdrom /tmp/rhel-server-7.2-x86_64-dvd.iso \
    --disk rhel7.qcow2,format=qcow2 \
    --network=bridge:virbr0 --graphics vnc,listen=0.0.0.0 \
    --noautoconsole --os-type=linux --os-variant=rhel7

    这会启动实例并启动安装过程。

    注意

    如果实例没有自动启动,请运行 virt-viewer 命令来查看控制台:

    [root@host]# virt-viewer rhel7
  2. 配置实例:

    1. 在初始安装程序引导菜单中,选择 Install Red Hat Enterprise Linux 7
    2. 选择相应的 LanguageKeyboard 选项。
    3. 当系统提示安装所使用的设备类型时,请选择 Auto-detected installation media
    4. 当提示安装目的地类型时,请选择 Local Standard Disks。对于其他存储选项,请选择 Automatically configure partitioning
    5. 对于软件选择,请选择 Minimal Install
    6. 对于网络和主机名,请选择 eth0 作为网络,然后选择您的设备的主机名。默认主机名是 localhost.localdomain
    7. Root Password 字段中输入密码,然后在 Confirm 字段中输入同一密码。

      结果
      安装过程完成并显示 Complete! 屏幕。
  3. 安装完成后,重启实例并以 root 用户身份登录。
  4. 更新 /etc/sysconfig/network-scripts/ifcfg-eth0 文件,使其只包含以下值:

    TYPE=Ethernet
    DEVICE=eth0
    ONBOOT=yes
    BOOTPROTO=dhcp
    NM_CONTROLLED=no
  5. 重启机器。
  6. 使用 Content Delivery Network 注册机器。

    # sudo subscription-manager register
    # sudo subscription-manager attach --pool=Valid-Pool-Number-123456
    # sudo subscription-manager repos --enable=rhel-7-server-rpms
  7. 更新系统:

    # dnf -y update
  8. 安装 cloud-init 软件包:

    # dnf install -y cloud-utils-growpart cloud-init
  9. 编辑 /etc/cloud/cloud.cfg 配置文件以及 cloud_init_modules add 下:

    - resolv-conf

    resolv-conf 选项会在实例第一次引导时自动配置 resolv.conf。此文件包含与实例相关的信息,如 名称服务器 和其他选项。

  10. /etc/sysconfig/network 中添加以下行以避免访问 EC2 元数据服务出现问题:

    NOZEROCONF=yes
  11. 要确保控制台信息会在仪表板的 Log 标签页和 nova console-log 输出中显示,请在 /etc/default/grub 文件中添加以下引导选项:

    GRUB_CMDLINE_LINUX_DEFAULT="console=tty0 console=ttyS0,115200n8"
  12. 运行 grub2-mkconfig 命令:

    # grub2-mkconfig -o /boot/grub2/grub.cfg

    输出如下:

    Generating grub configuration file ...
    Found linux image: /boot/vmlinuz-3.10.0-229.7.2.el7.x86_64
    Found initrd image: /boot/initramfs-3.10.0-229.7.2.el7.x86_64.img
    Found linux image: /boot/vmlinuz-3.10.0-121.el7.x86_64
    Found initrd image: /boot/initramfs-3.10.0-121.el7.x86_64.img
    Found linux image: /boot/vmlinuz-0-rescue-b82a3044fb384a3f9aeacf883474428b
    Found initrd image: /boot/initramfs-0-rescue-b82a3044fb384a3f9aeacf883474428b.img
    done
  13. 取消注册实例,以便生成的镜像不包含此实例的订阅详情:

    # subscription-manager repos --disable=*
    # subscription-manager unregister
    # dnf clean all
  14. 关闭实例:

    # poweroff
  15. 使用 virt-sysprep 命令重置并清理镜像,以便它可用于在没有问题的情况下创建实例:

    [root@host]# virt-sysprep -d rhel7
  16. 通过将磁盘镜像中的任何可用空间转换为主机中的可用空间来减小镜像大小:

    [root@host]# virt-sparsify --compress /tmp/rhel7.qcow2 rhel7-cloud.qcow2

    这会在运行命令的位置中创建一个新的 rhel7-cloud.qcow2 文件。

rhel7-cloud.qcow2 镜像文件已准备好上传到镜像服务。有关使用仪表板将此镜像上传到 RHOSP 部署的更多信息,请参阅 上传镜像

1.2.1.2.2. 创建 Red Hat Enterprise Linux 6 镜像

使用 Red Hat Enterprise Linux 6 ISO 文件手动创建 QCOW2 格式的 Red Hat OpenStack Platform (RHOSP)兼容镜像。

注意

您必须在主机机器上使用 [root@host]# 运行所有命令。

  1. 使用 virt-install 开始安装:

    [root@host]# qemu-img create -f qcow2 rhel6.qcow2 4G
    [root@host]# virt-install --connect=qemu:///system --network=bridge:virbr0 \
    --name=rhel6 --os-type linux --os-variant rhel6 \
    --disk path=rhel6.qcow2,format=qcow2,size=10,cache=none \
    --ram 4096 --vcpus=2 --check-cpu --accelerate \
    --hvm --cdrom=rhel-server-6.8-x86_64-dvd.iso

    这会启动实例并启动安装过程。

    注意

    如果实例没有自动启动,请运行 virt-viewer 命令来查看控制台:

    [root@host]# virt-viewer rhel6
  2. 配置实例:

    1. 在初始安装程序引导菜单中,选择 Install or upgrade an existing system,并按照安装提示进行操作。接受默认值。

      磁盘安装程序提供在安装前测试安装介质的选项。选择 OK 以运行测试或 跳过 以在没有测试的情况下继续。

    2. 选择相应的 LanguageKeyboard 选项。
    3. 当系统提示安装所使用的设备类型时,请选择 基本存储设备
    4. 为您的设备选择一个主机名。默认主机名是 localhost.localdomain
    5. 设置 时区和 root 密码。
    6. 根据磁盘上的空间,从哪个安装类型中选择您想要的 安装类型? 窗口。
    7. 选择 Basic Server 安装,它将安装 SSH 服务器。
    8. 安装过程完成,并会显示 Congratulations,您的 Red Hat Enterprise Linux 安装已完成 屏幕。
  3. 重启实例,并以 root 用户身份登录。
  4. 更新 /etc/sysconfig/network-scripts/ifcfg-eth0 文件,使其只包含以下值:

    TYPE=Ethernet
    DEVICE=eth0
    ONBOOT=yes
    BOOTPROTO=dhcp
    NM_CONTROLLED=no
  5. 重启机器。
  6. 使用 Content Delivery Network 注册机器:

    # sudo subscription-manager register
    # sudo subscription-manager attach --pool=Valid-Pool-Number-123456
    # sudo subscription-manager repos --enable=rhel-6-server-rpms
  7. 更新系统:

    # dnf -y update
  8. 安装 cloud-init 软件包:

    # dnf install -y cloud-utils-growpart cloud-init
  9. 编辑 /etc/cloud/cloud.cfg 配置文件,并在 cloud_init_modules 下添加以下内容。

    - resolv-conf

    resolv-conf 选项会在实例第一次引导时自动配置 resolv.conf 配置文件。此文件包含与实例相关的信息,如 名称服务器 和其他选项。

  10. 要防止网络问题,请创建 /etc/udev/rules.d/75-persistent-net-generator.rules

    # echo "#" > /etc/udev/rules.d/75-persistent-net-generator.rules

    这可防止创建 /etc/udev/rules.d/70-persistent-net.rules 文件。如果创建了 /etc/udev/rules.d/70-persistent-net.rules,则网络在从快照引导时可能无法正常工作,则网络接口将创建为 eth1 而不是 eth0,IP 地址没有被分配。

  11. /etc/sysconfig/network 中添加以下行以避免访问 EC2 元数据服务出现问题:

    NOZEROCONF=yes
  12. 要确保控制台信息会在仪表板的 Log 标签页和 nova console-log 输出中显示,请在 /etc/grub.conf 文件中添加以下引导选项:

    console=tty0 console=ttyS0,115200n8
  13. 取消注册虚拟机,以便生成的镜像不包含此实例的相同订阅详情:

    # subscription-manager repos --disable=*
    # subscription-manager unregister
    # dnf clean all
  14. 关闭实例:

    # poweroff
  15. 使用 virt-sysprep 命令重置并清理镜像,以便它可用于在没有问题的情况下创建实例:

    [root@host]# virt-sysprep -d rhel6
  16. 使用 virt-sparsify 命令减小镜像大小。这个命令将磁盘镜像中的任何可用空间转换为主机中的可用空间:

    [root@host]# virt-sparsify --compress rhel6.qcow2 rhel6-cloud.qcow2

    这会在运行命令的位置中创建一个新的 rhel6-cloud.qcow2 文件。

    注意

    您必须根据应用到实例的类别中的磁盘空间手动调整实例的分区大小。

rhel6-cloud.qcow2 镜像文件已准备好上传到镜像服务。有关使用仪表板将此镜像上传到 RHOSP 部署的更多信息,请参阅 上传镜像

1.2.1.2.3. 创建 Windows 镜像

使用 Windows ISO 文件手动创建 QCOW2 格式的 Red Hat OpenStack Platform (RHOSP)兼容镜像。

注意

您必须在主机机器上使用 [root@host]# 运行所有命令。

流程

  1. 使用 virt-install 开始安装:

    [root@host]# virt-install --name=<name> \
    --disk size=<size> \
    --cdrom=<path> \
    --os-type=windows \
    --network=bridge:virbr0 \
    --graphics spice \
    --ram=<ram>

    替换 virt-install 参数的以下值:

    • <name> iwl-DESTINATIONthe Windows 实例具有的名称。
    • 以 GB 为单位的 <size> iwl-wagondisk 大小。
    • <path> iwl-wagonthe 到 Windows 安装 ISO 文件的路径。
    • <RAM> iwl-wagonthe 请求的 RAM 量(以 MB 为单位)。

      注意

      --os-type=windows 参数确保为 Windows 客户机正确配置了时钟,并启用其 Hyper-V enlightenment 功能。在将镜像上传到镜像服务前,还必须在镜像元数据中设置 os_type=windows

  2. virt-install 默认将客户机镜像保存为 /var/lib/libvirt/images/&lt;name& gt; .qcow2。如果要在其他位置保留客户机镜像,请更改 --disk 选项的参数:

    --disk path=<filename>,size=<size>

    将 <filename> 替换为存储实例镜像的文件名称,以及其路径(可选)。例如,path=win8.qcow2,size=8 在当前工作目录中创建一个名为 win8.qcow2 的 8 GB 文件。

    提示

    如果客户机没有自动启动,请运行 virt-viewer 命令来查看控制台:

    [root@host]# virt-viewer <name>

    有关如何安装 Windows 的更多信息,请参阅相关的 Microsoft 文档。

  3. 要允许新安装的 Windows 系统使用虚拟化硬件,您可能需要安装 virtio 驱动程序。为此,首先要安装镜像,该镜像必须作为 CD-ROM 驱动器附加到 Windows 实例。要安装 virtio-win 软件包,您必须将 virtio ISO 镜像添加到实例中,并安装 virtio 驱动程序。如需更多信息,请参阅 配置和管理虚拟化 指南中的 为 Windows 虚拟机安装 KVM 半虚拟驱动程序
  4. 要完成配置,请在 Windows 系统上下载并执行 Cloudbase-Init。在安装 Cloudbase-Init 的末尾,选择 Run SysprepShutdown 复选框。Sysprep 工具通过生成操作系统 ID (供某些 Microsoft 服务使用)使客户机唯一。

    重要

    红帽不提供对 Cloudbase-Init 的技术支持。如果您遇到问题,请联系 Cloudbase Solutions

当 Windows 系统关闭时,&lt ;name>.qcow2 镜像文件可以上传到镜像服务。有关使用仪表板或命令行将此镜像上传到 RHOSP 部署的更多信息,请参阅 上传镜像

注意

libosinfo data

Compute Service 已弃用了对使用 libosinfo 数据来设置默认设备模型的支持。反之,使用以下镜像元数据属性为实例配置最佳虚拟硬件:

  • os_distro
  • os_version
  • hw_cdrom_bus
  • hw_disk_bus
  • hw_scsi_model
  • hw_vif_model
  • hw_video_model
  • hypervisor_type

有关这些元数据属性的详情,请参考 附录 A, 镜像配置参数

1.2.2. 上传镜像

  1. 在控制面板中,选择 Project > Compute > Images
  2. Create Image
  3. 填写值,再单击 Create Image

表 1.1. 镜像选项

字段备注

Name

镜像的名称。该名称在项目内必须是唯一的。

描述

用于标识镜像的简短描述。

镜像源

镜像源:镜像位置镜像文件.根据您的选择,会显示下一个字段。

镜像位置或镜像文件

  • 选择 Image Location 选项指定镜像位置 URL。
  • 选择 Image File 选项,从本地磁盘上传镜像。

格式

镜像格式(如 qcow2)。

架构

镜像架构。例如,使用 i686 作为 32 位构架,或将 x86_64 用于 64 位架构。

最小磁盘(GB)

引导镜像所需的最小磁盘大小。如果没有指定此字段,则默认值为 0 (无最小值)。

最小 RAM (MB)

引导镜像所需的最小内存大小。如果没有指定此字段,则默认值为 0 (无最小值)。

公开

如果选中,将镜像变为所有有权访问项目的用户。

protected

如果选中,则确保只有具有特定权限的用户才能删除此镜像。

成功上传镜像后,其状态为 active,这表示该镜像可供使用。请注意,镜像服务甚至可以处理大型镜像,这些镜像需要很长时间才能上传为 uploads 时使用的身份服务令牌的生命周期。这是因为镜像服务首先创建与身份服务的信任,以便在上传完成后获取和使用新令牌,并更新镜像的状态。

注意

您还可以使用 glance image-create 命令和 property 选项来上传镜像。命令行中提供了更多值。有关完整的列表,请参阅 镜像配置参数

1.2.3. 更新镜像

  1. 在控制面板中,选择 Project > Compute > Images
  2. 点列表中的 Edit Image

    注意

    只有以 admin 用户身份登录时,才可使用 Edit Image 选项。当您以 demo 用户身份登录时,您可以选择 启动实例创建卷

  3. 更新字段并点 Update Image。您可以更新以下值 - name, description, kernel ID, ramdisk ID, architecture, format, minimum disk, minimum RAM, public, protected。
  4. 点下拉菜单并选择 Update Metadata 选项。
  5. 通过在右列中添加项来指定元数据。在左列中,镜像服务元数据目录中有元数据定义。选择 Other 添加带有您选择的密钥的元数据,完成后点 Save
注意

您还可以使用 glance image-update 命令和 property 选项来更新镜像。命令行中提供了更多值;有关完整列表,请参阅 镜像配置参数

1.2.4. 导入镜像

您可以使用以下两种方法之一将镜像导入到镜像服务(glance):

  • 使用 web-download 从 URI 导入镜像。
  • 使用 glance-direct 从本地文件系统导入镜像。

web-download 方法默认为启用。云管理员配置导入方法。您可以运行 glance import-info 命令来列出可用的导入选项。

1.2.4.1. 从远程 URI 导入镜像

您可以使用 web-download 方法从远程 URI 复制镜像。

  1. 创建镜像并指定要导入的镜像的 URI:

    $ glance image-create-via-import \
        --container-format <CONTAINER FORMAT> \
        --disk-format <DISK-FORMAT> \
        --name <NAME> \
        --import-method web-download \
        --uri <URI>
    • <CONTAINER FORMAT > 替换为您要为镜像设置的容器格式(None, ami, ari, aki, bare, ovf, ova, docker)。
    • <DISK-FORMAT > 替换为您要为镜像设置的磁盘格式(None, ami, ari, aki, vhd, vhdx, vmdk, raw, qcow2, vdi, iso, ploop)。
    • <NAME > 替换为您的镜像的描述性名称。
    • <URI > 替换为您的镜像的 URI。
  2. 您可以使用 glance image-show <IMAGE_ID&gt; 命令检查镜像的可用性。

    • <IMAGE_ID > 替换为您在创建镜像过程中提供的 ID。

镜像服务 Web 下载 方法使用两阶段进程来执行导入:

  1. Web 下载 方法创建一个镜像记录。
  2. Web 下载 方法从指定的 URI 检索镜像。

URI 受可选的 denylist 和 allowlist 过滤的影响。

Image Property Injection 插件可能会向镜像注入元数据属性。这些注入的属性决定了镜像实例在其上启动哪些计算节点。

1.2.4.2. 从本地卷导入镜像

glance-direct 方法创建一个镜像记录,它会生成一个镜像 ID。镜像从本地卷上传到镜像服务后,它会存储在暂存区域中,并在通过任何配置的检查后激活。在高可用性(HA)配置中使用时,glance-direct 方法需要一个共享暂存区域。

注意

如果不存在通用暂存区域,使用 glance-direct 方法的镜像上传可能会在 HA 环境中失败。在 HA 主动环境中,API 调用被分发到镜像服务控制器。下载 API 调用可以发送到与 API 调用不同的控制器,以上传镜像。

glance-direct 方法使用三个不同的调用来导入镜像:

  • glance image-create
  • glance image-stage
  • glance image-import

您可以使用 glance image-create-via-import 命令在一个命令中执行所有三个调用:

$ glance image-create-via-import --container-format <CONTAINER FORMAT> --disk-format <DISK-FORMAT> --name <NAME> --file </PATH/TO/IMAGE>
  • 将 & lt;CONTAINER FORMAT&gt; , <DISK-FORMAT & gt; , <NAME > , 和 </PATH/TO/IMAGE > 替换为您的镜像的相关值。

镜像从暂存区域移到后端位置后,会列出该镜像。但是,可能需要过些时间,镜像才会变为活动状态。

您可以使用 glance image-show <IMAGE_ID&gt; 命令检查镜像的可用性。

  • <IMAGE_ID 替换为您在创建镜像过程中提供的 ID。

1.2.5. 删除镜像

  1. 在控制面板中,选择 Project > Compute > Images
  2. 选择您要删除的镜像,然后点 Delete Images

1.2.6. 隐藏或取消隐藏镜像

您可以从向用户呈现的普通列表中隐藏公共镜像。例如,您可以隐藏过时的 CentOS 7 镜像,并只显示最新版本来简化用户体验。用户可以发现和使用隐藏的镜像。

隐藏镜像:

glance image-update <image_id> --hidden 'true'

要创建隐藏的镜像,请将 --hidden 参数添加到 glance image-create 命令。

解译镜像:

glance image-update <image_id> --hidden 'false'

1.2.7. 显示隐藏的镜像

列出隐藏的镜像:

glance image-list --hidden 'true'

1.2.8. 启用镜像转换

启用 GlanceImageImportPlugins 参数后,您可以上传 QCOW2 镜像,镜像服务会将它转换为 RAW。

注意

当使用 Red Hat Ceph Storage RBD 来存储镜像和引导 Nova 实例时,会自动启用镜像转换。

要启用镜像转换,请创建一个包含以下参数值的环境文件,并在 openstack overcloud deploy 命令中使用 -e 选项包括新的环境文件:

parameter_defaults:
  GlanceImageImportPlugins:'image_conversion'

1.2.9. 将镜像转换为 RAW 格式

Red Hat Ceph Storage 可以存储,但不支持使用 QCOW2 镜像来托管虚拟机(VM)磁盘。

当您上传 QCOW2 镜像并从中创建虚拟机时,计算节点会下载镜像,将镜像转换为 RAW,然后将其上传到 Ceph,然后使用它。这个过程会影响创建虚拟机所需的时间,特别是在并行虚拟机创建过程中。

例如,当您同时创建多个虚拟机时,上传转换的镜像到 Ceph 集群可能会影响已在运行的工作负载。上传过程可能会使 IOPS 的工作负载以及存储响应速度导致。

要在 Ceph 中更有效地引导虚拟机(临时后端或从卷引导),glance 镜像格式必须是 RAW。

流程

  1. 将镜像转换为 RAW 可能会产生大于原始 QCOW2 镜像文件的镜像。在转换前运行以下命令,以确定最终 RAW 镜像大小:

    qemu-img info <image>.qcow2
  2. 将镜像从 QCOW2 转换为 RAW 格式:

    qemu-img convert -p -f qcow2 -O raw <original qcow2 image>.qcow2 <new raw image>.raw

1.2.9.1. 在 Image 服务(glance)中配置磁盘格式.

您可以使用 GlanceDiskFormats 参数配置镜像服务(glance)以启用或禁用磁盘格式。

流程

  1. stack 用户身份登录 undercloud 主机。
  2. 提供 undercloud 凭证文件:

    $ source ~/stackrc
  3. 在环境文件中包含 GlanceDiskFormats 参数,如 glance_disk_formats.yaml

    parameter_defaults:
      GlanceDiskFormats:
        - <disk_format>
    • 例如,使用以下配置只启用 RAW 和 ISO 磁盘格式:

      parameter_defaults:
        GlanceDiskFormats:
        - raw
        - iso
    • 使用以下示例配置拒绝 QCOW2 磁盘镜像:

      parameter_defaults:
        GlanceDiskFormats:
        - raw
        - iso
        - aki
        - ari
        - ami
  4. openstack overcloud deploy 命令中包含新配置的环境文件以及与您环境相关的任何其他环境文件:

    $ openstack overcloud deploy --templates \
      -e <overcloud_environment_files> \
      -e <new_environment_file> \
      …
    • <overcloud_environment_files > 替换为属于部署的环境文件列表。
    • <new_environment_file > 替换为包含新配置的环境文件。

有关 RHOSP 中可用磁盘格式的更多信息,请参阅 镜像服务

1.2.10. 以 RAW 格式存储镜像

启用 GlanceImageImportPlugins 参数后,运行以下命令以 RAW 格式存储之前创建的镜像:

$ glance image-create-via-import \
    --disk-format qcow2 \
    --container-format bare \
    --name NAME \
    --visibility public \
    --import-method web-download \
    --uri http://server/image.qcow2
  • 对于 --name,将 NAME 替换为映像的名称;这是 Glance image-list 中将显示的名称
  • 对于 --uri,将 http://server/image.qcow2 替换为 QCOW2 镜像的位置和文件名。
注意

此命令示例创建镜像记录并使用 web-download 方法导入它。glance-api 在导入过程中从 --uri 位置下载镜像。如果 web-download 不可用,glanceclient 无法自动下载镜像数据。运行 glance import-info 命令来列出可用的镜像导入方法。

第 2 章 具有多个存储的镜像服务

Red Hat OpenStack Platform Image 服务(glance)支持使用带有分布式边缘架构的多个存储,以便您可以在每个边缘站点上有一个镜像池。您可以在中央站点(也称为 hub 站点)和边缘站点之间复制镜像。

镜像元数据包含每个副本的位置。例如,两个边缘站点上的镜像公开为具有三个位置的单一 UUID:中央站点加上两个边缘站点。这意味着,您可以在多个存储上共享单个 UUID 的镜像数据副本。有关位置的更多信息 ,请参阅了解镜像的位置

利用每个边缘站点的 RBD 镜像池,您可以使用 Ceph RBD 写时复制(COW)和快照分层技术快速引导虚拟机。这意味着,您可以从卷引导虚拟机并具有实时迁移。有关使用 Ceph RBD 分层的更多信息,请参阅块设备指南中的 Ceph 块设备层

2.1. 存储边缘架构的要求

  • 每个镜像的副本必须存在于镜像服务中的中央位置。
  • 在边缘站点创建实例之前,您必须在该边缘站点上具有镜像的本地副本。
  • 上传到边缘站点的镜像必须复制到中央位置,然后才能将它们复制到其他边缘站点。
  • 将镜像服务 RBD 驱动程序用于所有边缘站点。不支持混合架构。
  • RBD 必须是镜像、计算和块存储服务的存储驱动程序。
  • 对于每个站点,您必须将相同的值分配给 NovaComputeAvailabilityZoneCinderStorageAvailabilityZone 参数。

2.2. 将镜像导入到多个存储

使用可组合镜像导入工作流,将镜像数据导入到多个 Ceph Storage 集群中。您可以将镜像导入到本地文件系统上或通过 Web 服务器可用的镜像服务。

如果从 web 服务器导入镜像,则可以一次将镜像导入到多个存储中。如果 web 服务器上没有镜像,您可以将镜像从本地文件系统导入到中央存储中,然后将其复制到其他存储中。如需更多信息,请参阅 将现有镜像复制到多个存储

重要

始终在中央站点上存储镜像副本,即使中央位置上没有使用该镜像的实例。有关将镜像导入到镜像服务的更多信息,请参阅 分布式计算节点和存储部署指南

2.2.1. 管理镜像导入失败

您可以使用 --allow-failure 参数管理镜像导入操作的失败:

  • 如果 --allow-failure 参数的值为 true,则第一次存储成功导入数据后镜像状态将 变为活动状态。这是默认设置。您可以使用 os_glance_failed_import 镜像属性查看无法导入镜像数据的存储列表。
  • 如果将 --allow-failure 参数的值设置为 false,则镜像状态仅在所有指定存储成功导入数据后 变为活动状态。导入镜像数据的任何存储失败会导致镜像状态 失败。镜像没有导入到任何指定存储中。

2.2.2. 将镜像数据导入到多个存储

由于 --allow-failure 参数的默认设置是 true,因此如果某些存储可以接受,则不需要在命令中包含该参数,无法导入镜像数据。

注意

此流程不需要所有存储才能成功导入镜像数据。

流程

  1. 将镜像数据导入多个指定的存储:

    $ glance image-create-via-import \
    --container-format bare \
    --name IMAGE-NAME \
    --import-method web-download \
    --uri URI \
    --stores STORE1,STORE2,STORE3
    • IMAGE-NAME 替换为您要导入的镜像的名称。
    • 使用镜像的 URI 替换 URI。
    • STORE1STORE2STORE3 替换为您要导入镜像数据的存储名称。
    • 或者,将 --stores 替换为 --all-stores true,以将镜像上传到所有存储。
注意

glance image-create-via-import 命令会自动将 QCOW2 镜像转换为 RAW 格式,仅适用于 web-download 方法。glance-direct 方法可用,但仅适用于带有配置的共享文件系统的部署。如需更多信息,请参阅 以 RAW 格式存储镜像

2.2.3. 在不失败的情况下将镜像数据导入到多个存储中

此流程要求所有存储成功导入镜像数据。

流程

  1. 将镜像数据导入多个指定的存储:

    $ glance image-create-via-import \
    --container-format bare \
    --name IMAGE-NAME \
    --import-method web-download \
    --uri URI \
    --stores STORE1,STORE2
    • IMAGE-NAME 替换为您要导入的镜像的名称。
    • 使用镜像的 URI 替换 URI。
    • STORE1STORE2STORE3 替换为您要复制镜像数据的存储名称。
    • 或者,将 --stores 替换为 --all-stores true,以将镜像上传到所有存储。

      注意

      --allow-failure 参数设置为 false 时,镜像服务不会忽略无法导入镜像数据的存储。您可以使用镜像属性 os_glance_failed_import 来查看失败的存储列表。如需更多信息,请参阅 检查镜像导入操作的进度

  2. 验证镜像数据是否已添加到特定存储中:

    $ glance image-show IMAGE-ID | grep stores

    使用原始现有镜像的 ID 替换 IMAGE-ID

    输出显示以逗号分隔的存储列表。

2.2.4. 将镜像数据导入到单个存储中

您可以将镜像数据导入到单个存储中。

流程

  1. 将镜像数据导入到单个存储中:

    $ glance image-create-via-import \
    --container-format bare \
    --name IMAGE-NAME \
    --import-method web-download \
    --uri URI \
    --store STORE
    • IMAGE-NAME 替换为您要导入的镜像的名称。
    • 使用镜像的 URI 替换 URI。
    • STORE 替换为您要将镜像数据复制到的存储名称。

      注意

      如果您没有在命令中包括 --stores--all-stores--store 的选项,则镜像服务会在中央存储中创建镜像。

  2. 验证镜像数据是否已添加到特定的存储中:

    $ glance image-show IMAGE-ID | grep stores

    使用原始现有镜像的 ID 替换 IMAGE-ID

    输出显示以逗号分隔的存储列表。

2.2.5. 检查镜像导入操作的进度

可组合镜像导入工作流将镜像数据按顺序导入存储。镜像的大小、存储数量以及中央站点和边缘站点之间的网络速度会影响镜像导入操作所需的时间。

您可以通过查看两个镜像属性来跟踪镜像导入的进度,这些属性会出现在镜像导入操作过程中发送的通知中:

  • os_glance_importing_to_stores 属性列出了尚未导入镜像数据的存储。在导入开始时,所有请求的存储都显示在列表中。每次存储成功导入镜像数据时,镜像服务会从列表中删除存储。
  • os_glance_failed_import 属性列出了无法导入镜像数据的存储。此列表在镜像导入操作开始时为空。
注意

在以下步骤中,环境有三个 Ceph 存储集群: 中央存储 和两个存储在边缘、dcn0dcn1

流程

  1. 验证镜像数据是否已添加到特定存储中:

    $ glance image-show IMAGE-ID

    使用原始现有镜像的 ID 替换 IMAGE-ID

    输出显示以逗号分隔的存储列表,类似以下示例片断:

    | os_glance_failed_import       |
    | os_glance_importing_to_stores | central,dcn0,dcn1
    | status                        | importing
  2. 监控镜像导入操作的状态。当您使用 watch 命令前有一个命令时,命令输出每两秒钟刷新一次。

    $ watch glance image-show IMAGE-ID

    使用原始现有镜像的 ID 替换 IMAGE-ID

    当镜像导入操作进行时,操作的状态会改变:

    | os_glance_failed_import       |
    | os_glance_importing_to_stores | dcn0,dcn1
    | status                        | importing

    显示镜像无法导入的输出结果类似以下示例:

    | os_glance_failed_import       | dcn0
    | os_glance_importing_to_stores | dcn1
    | status                        | importing

    操作完成后,状态会变为 active :

    | os_glance_failed_import       | dcn0
    | os_glance_importing_to_stores |
    | status                        | active

2.3. 将现有镜像复制到多个存储中

通过此功能,您可以使用 Red Hat OpenStack Image 服务(glance)镜像数据将现有镜像复制到边缘的多个 Ceph Storage 存储中,方法是使用可组合的镜像导入工作流。

注意

镜像必须在中央站点上存在,然后才能将其复制到任何边缘站点。只有镜像所有者或管理员可以将现有镜像复制到新添加的存储中。

您可以通过将 --all-stores 设置为 true 或指定要接收镜像数据的特定存储来复制现有镜像数据。

  • --all-stores 选项的默认设置是 false。如果 --all-storesfalse,则必须使用 --stores STORE1,STORE2 指定哪些存储接收镜像数据。如果任何指定存储中已存在镜像数据,则请求会失败。
  • 如果将 all-stores 设置为 true,并且某些存储中已存在镜像数据,则这些存储将不包括在列表中。

指定存储接收镜像数据后,镜像服务会将数据从中央站点复制到暂存区域。然后,镜像服务使用可组合的镜像导入工作流导入镜像数据。如需更多信息,请参阅 将镜像导入到多个存储

重要

红帽建议管理员要仔细避免时间非常接近的镜像复制请求。对同一镜像进行两个密切的 copy-image 操作会导致竞争条件和意外的结果。现有镜像数据会保持原样,但将数据复制到新存储中会失败。

2.3.1. 将镜像复制到所有存储中

使用以下步骤将镜像数据复制到所有可用存储中。

流程

  1. 将镜像数据复制到所有可用存储中:

    $ glance image-import IMAGE-ID \
    --all-stores true \
    --import-method copy-image

    使用您要复制的镜像的名称替换 IMAGE-ID

  2. 确认镜像数据成功复制到所有可用存储:

    $ glance image-list --include-stores

    有关如何检查镜像导入操作的状态的详情,请参阅 检查镜像导入操作的进度

2.3.2. 将镜像复制到特定存储中

使用以下步骤将镜像数据复制到特定的存储中。

流程

  1. 将镜像数据复制到特定的存储中:

    $ glance image-import IMAGE-ID \
    --stores STORE1,STORE2 \
    --import-method copy-image
    • 使用您要复制的镜像的名称替换 IMAGE-ID
    • STORE1STORE2 替换为您要复制镜像数据的存储名称。
  2. 确认镜像数据成功复制到指定的存储中:

    $ glance image-list --include-stores

    有关如何检查镜像导入操作的状态的详情,请参阅 检查镜像导入操作的进度

2.4. 从特定存储中删除镜像

通过此功能,您可以使用 OpenStack Image 服务(glance)删除特定存储上的现有镜像副本。

流程

从特定存储中删除镜像:

$ glance stores-delete --store _STORE_ID_ _IMAGE_ID_
  • 将 _STORE_ID 替换为应删除镜像副本的存储名称。
  • 使用您要删除的镜像的 ID 替换 IMAGE_ID
警告

使用 glance image-delete 将在所有站点间永久删除镜像。所有镜像副本都将被删除,以及镜像实例和元数据。

2.5. 了解镜像的位置

虽然镜像可以存在于多个站点上,但给定镜像只有一个 UUID。镜像元数据包含每个副本的位置。例如,两个边缘站点上的镜像公开为具有三个位置的单一 UUID:中央站点加上两个边缘站点。

流程

  1. 显示存在镜像副本的站点:

    $ glance image-show ID | grep "stores"
    
    | stores |  default_backend,dcn1,dcn2

    在示例中,镜像存在于中央站点、default_backend,以及两个边缘站点 dcn1dcn2 上。

  2. 或者,您可以使用 --include-stores 选项运行 glance image-list 命令,以查看镜像所在的站点:

    $ glance image-list --include-stores
    
    | ID                                   | Name    | Stores
    
    | 2bd882e7-1da0-4078-97fe-f1bb81f61b00 | cirros | default_backend,dcn1,dcn2
  3. 列出镜像位置属性以显示每个位置的详情:

    $ openstack image show ID -c properties
    
    | properties |
    
    (--- cut ---)
    locations='[{'url': 'rbd://79b70c32-df46-4741-93c0-8118ae2ae284/images/2bd882e7-1da0-4078-97fe-f1bb81f61b00/snap', 'metadata': {'store': 'default_backend'}}, {'url': 'rbd://63df2767-8ddb-4e06-8186-8c155334f487/images/2bd882e7-1da0-4078-97fe-f1bb81f61b00/snap', 'metadata': {'store': 'dcn1'}}, {'url': 'rbd://1b324138-2ef9-4ef9-bd9e-aa7e6d6ead78/images/2bd882e7-1da0-4078-97fe-f1bb81f61b00/snap', 'metadata': {'store': 'dcn2'}}]',
    (--- cut --)

    image 属性显示各个镜像位置的不同 Ceph RBD URI。

    在示例中,中央镜像位置 URI 是:

    rbd://79b70c32-df46-4741-93c0-8118ae2ae284/images/2bd882e7-1da0-4078-97fe-f1bb81f61b00/snap', 'metadata': {'store': 'default_backend'}}

    URI 由以下数据组成:

    • 79b70c32-df46-4741-93c0-8118ae2ae284 对应于中央 Ceph FSID。每个 Ceph 集群都有唯一的 FSID。
    • 所有站点的默认值为 images,对应于存储镜像的 Ceph 池。
    • 2bd882e7-1da0-4078-97fe-f1bb81f61b00 对应于镜像 UUID。给定镜像的 UUID 相同,无论其位置如何。
    • 元数据显示此位置映射的 glance 存储。在本例中,它映射到 default_backend,这是中央 hub 站点。

附录 A. 镜像配置参数

以下键可用于 glance image-updateglance image-create 命令的 property 选项。

$ glance image-update IMG-UUID --property architecture=x86_64

表 A.1. 属性键

特定于描述支持的值

All

架构

管理程序必须支持的 CPU 架构。例如,x86_64armppc64。运行 uname -m 以获取计算机架构。

  • alpha - DEC 64 位 RISC
  • armv7l - ARM Cortex-A7 MPCore
  • CRIS- Ethernet, Token Ring, AXis-Code Reduced instructions Set
  • i686 - Intel 6th-generation x86(P6 微架构)
  • ia64 - Itanium
  • lm32 - Lattice Micro32
  • m68k - Motorola 68000
  • microblaze - Xilinx 32 位 FPGA (Big Endian)
  • microblazeel - Xilinx 32 位 FPGA (Little Endian)
  • M IPS - MIPS 32 位 RISC (Big Endian)
  • mipsel - MIPS 32 位 RISC (Little Endian)
  • mips64 - MIPS 64 位 RISC (Big Endian)
  • mips64el - MIPS 64 位 RISC (Little Endian)
  • openrisc - OpenCores RISC
  • Parisc - HP Precision Architecture RISC
  • parisc64 - HP Precision Architecture 64-bit RISC
  • ppc - PowerPC 32-bit
  • ppc64 - PowerPC 64-bit
  • ppcemb - PowerPC (嵌入式 32 位)
  • s390 - IBM Enterprise Systems Architecture/390
  • s390x - S/390 64 位
  • sh4 - SuperH SH-4 (Little Endian)
  • sh4eb - SuperH SH-4 (Big Endian)
  • SPARC - 可扩展处理器架构, 32 位
  • sparc64 - 可扩展处理器架构, 64 位
  • unicore32 - Microprocessor research and Development Center RISC Unicore32
  • x86_64 - IA-32 的 64 位扩展
  • xtensa - Tensilica Xtensa 可配置微处理器内核
  • xtensaeb - Tensilica Xtensa 可配置微处理器内核(Big Endian)

All

hypervisor_type

管理程序类型。

kvm, vmware

All

instance_uuid

对于快照镜像,这是用于创建此镜像的服务器的 UUID。

有效的服务器 UUID

All

kernel_id

镜像服务中存储的镜像的 ID,在引导 AMI 风格的镜像时应用作内核。

有效的镜像 ID

All

os_distro

操作系统分发的通用名称(小写)。

  • arch - Arch Linux.不要使用 archlinuxorg.archlinux
  • CentOS - 社区企业操作系统.不要使用 org.centosCentOS
  • Debian - Debian.不要使用 Debianorg.debian
  • Fedora - Fedora.不要使用 Fedoraorg.fedoraorg.fedoraproject
  • FreeBSD - FreeBSD.不要使用 org.freebsdfreeBSDFreeBSD
  • gentoo - Gentoo Linux.不要使用 Gentooorg.gentoo
  • mandrake - Mandrakelinux (MandrakeSoft) distribution.不要使用 mandrakelinuxMandrakeLinux
  • mandriva - Mandriva Linux.不要使用 mandrivalinux
  • mes - Mandriva Enterprise Server.不要使用 mandrivaentmandrivaES
  • msdos - Microsoft Disc 操作系统.不要使用 ms-dos
  • NetBSD - NetBSD.不要使用 NetBSDorg.netbsd
  • Netware - Novell NetWare.不要使用 novellNetWare
  • openbsd - OpenBSD.不要使用 OpenBSDorg.openbsd
  • OpenSolaris - OpenSolaris.不要使用 OpenSolarisorg.open activities
  • OpenSUSE - OpenSUSE.不要使用 suseSuSEorg.opensuse
  • rhel - Red Hat Enterprise Linux.不要使用 redhat、RedHatcom.redhat
  • SLED - SUSE Linux Enterprise Desktop.不要使用 com.suse
  • Ubuntu - Ubuntu.不要使用 Ubuntucom.ubuntuorg.ubuntu规范
  • Windows - Microsoft Windows.不要使用 com.microsoft.server

All

os_version

由经销商指定的操作系统版本。

版本号(例如:"11.10")

All

ramdisk_id

镜像服务中存储的镜像的 ID,在引导 AMI 风格的镜像时应用作 ramdisk。

有效的镜像 ID

All

vm_mode

虚拟机模式。这代表了用于虚拟机的主机/客户机 ABI (应用程序二进制接口)。

HVM- 完全虚拟化.这是 QEMU 和 KVM 使用的模式。

libvirt API 驱动程序

hw_disk_bus

指定要将磁盘设备附加到的磁盘控制器类型。

SCSIvirtioideusb。请注意,如果使用 iscsi,则需要将 hw_scsi_model 设置为 virtio-scsi

libvirt API 驱动程序

hw_cdrom_bus

指定要将 CD-ROM 设备附加到的磁盘控制器类型。

SCSIvirtioideusb。如果指定了 iscsi,您必须将 hw_scsi_model 参数设置为 virtio-scsi

libvirt API 驱动程序

hw_numa_nodes

要公开给实例的 NUMA 节点数(不覆盖类别定义)。

整数.

libvirt API 驱动程序

hw_numa_cpus.0

vCPU N-M 映射到 NUMA 节点 0 (不覆盖类别定义)。

以逗号分隔的整数列表。

libvirt API 驱动程序

hw_numa_cpus.1

vCPU N-M 映射到 NUMA 节点 1 (不覆盖类别定义)。

以逗号分隔的整数列表。

libvirt API 驱动程序

hw_numa_mem.0

将 N MB RAM 映射到 NUMA 节点 0 (不覆盖类别定义)。

整数

libvirt API 驱动程序

hw_numa_mem.1

将 N MB RAM 映射到 NUMA 节点 1 (不覆盖类别定义)。

整数

libvirt API 驱动程序

hw_qemu_guest_agent

客户机代理支持。如果设置为 yes,并且安装了 qemu-ga,则可以静止(frozen)和快照自动创建。

是 / no

libvirt API 驱动程序

hw_rng_model

在镜像的实例中添加一个随机数生成器设备。云管理员可通过配置实例的类别来启用和控制设备行为。默认情况下:

  • 生成器设备被禁用。
  • /dev/random 用作默认熵源。要指定物理 HW RNG 设备,请在 Compute 环境文件中将 rng_dev_path 设置为 "/dev/hwrng"。

VirtIO 或其他支持的设备。

libvirt API 驱动程序

hw_scsi_model

启用 VirtIO SCSI (virtio-scsi)来为计算实例提供块设备访问;默认情况下,实例使用 VirtIO 块(virtio-blk)。VirtIO SCSI 是一个半虚拟化 SCSI 控制器设备,可提供更高的可扩展性和性能,并支持高级 SCSI 硬件。

virtio-scsi

libvirt API 驱动程序

hw_video_model

虚拟机实例中使用的视频设备驱动程序。

支持的驱动程序列表,按优先级顺序排列:

  • VirtIO.(推荐)带有 Gallium GPU 规格的虚拟 GPU,它使用 VIRGL 渲染器呈现 OpenGL。所有构架都支持这个 GPU 模型,如果主机有一个专用 GPU,则可以利用硬件加速。如需更多信息,请参阅 https://virgil3d.github.io/
  • qxl.适用于 SPICE 或 noVNC 环境的高性能驱动程序。
  • Cirrus.传统驱动程序,如果 QXL 驱动程序不可用,则使用。
  • VGA。将这个驱动程序用于 IBM Power 环境。
  • gop.不支持 QEMU/KVM 环境。
  • Xen.KVM 环境不支持。
  • vmvga.不使用传统驱动程序。
  • none.使用这个值在单独配置驱动程序的虚拟 GPU (vGPU)实例中禁用模拟图形或视频。

libvirt API 驱动程序

hw_video_ram

视频镜像的最大 RAM。仅在类别 extra_specs 和该值高于 hw_video_ram 中设置的值时,才使用 hw_video:ram_max_mb 值。

以 MB 为单位的整数(例如 64

libvirt API 驱动程序

hw_watchdog_action

启用在服务器挂起时执行指定操作的虚拟硬件 watchdog 设备。watchdog 使用 i6300esb 设备(模拟 PCI Intel 6300ESB)。如果没有指定 hw_watchdog_action,则禁用 watchdog。

  • disabled- 该设备没有附加。允许用户禁用镜像的 watchdog,即使它已使用镜像的类别启用。这个参数的默认值被禁用。
  • reset-Forcefully 重置 guest。
  • poweroff-Forcefully 关闭客户机。
  • 暂停客户机。
  • none-Only 启用 watchdog;如果服务器挂起,不执行任何操作。

libvirt API 驱动程序

os_command_line

libvirt 驱动程序使用的内核命令行,而不是默认值。对于 Linux 容器(LXC),该值用作初始化的参数。这个密钥仅对 Amazon 内核、ramdisk 或机器镜像(aki、ari 或 ami)有效。

 

libvirt API 驱动程序和 VMware API 驱动程序

hw_vif_model

指定要使用的虚拟网络接口设备模型。

有效选项取决于配置的 hypervisor。

  • KVM 和 QEMU:e1000、ne2k_pci、pcnet、rtl8139 和 virtio。
  • VMware:e1000、e1000e、VirtualE1000e、VirtualE1000e、VirtualPCNet32, VirtualSriovEthernetCard 和 VirtualVmxnet.
  • Xen: e1000, netfront, ne2k_pci, pcnet, and rtl8139.

VMware API 驱动程序

vmware_adaptertype

管理程序使用的虚拟 SCSI 或 IDE 控制器。

lsiLogicbusLogicide

VMware API 驱动程序

vmware_ostype

描述镜像中安装的操作系统的 VMware GuestID。这个值在创建虚拟机时传递给虚拟机监控程序。如果没有指定,则密钥默认为 otherGuest

如需更多信息,请参阅使用 VMware vSphere 的镜像

VMware API 驱动程序

vmware_image_version

当前未使用。

1

XenAPI 驱动程序

auto_disk_config

如果为 true,则在实例引导前,磁盘上的根分区会自动调整大小。只有在使用带有 XenAPI 驱动程序的基于 Xen 的 hypervisor 时,Compute 服务才会考虑这个值。只有镜像上只有一个分区,并且仅当分区采用 ext3ext4 格式时,计算服务才会尝试调整大小。

true / false

libvirt API 驱动程序和 XenAPI 驱动程序

os_type

在镜像上安装的操作系统。XenAPI 驱动程序包含根据镜像的 os_type 参数的值采取不同的操作的逻辑。例如,对于 os_type=windows 镜像,它会创建一个基于 FAT32 的交换分区,而不是 Linux swap 分区,它会将注入的主机名限制为小于 16 个字符。

linuxwindows

法律通告

Copyright © 2023 Red Hat, Inc.
The text of and illustrations in this document are licensed by Red Hat under a Creative Commons Attribution–Share Alike 3.0 Unported license ("CC-BY-SA"). An explanation of CC-BY-SA is available at http://creativecommons.org/licenses/by-sa/3.0/. In accordance with CC-BY-SA, if you distribute this document or an adaptation of it, you must provide the URL for the original version.
Red Hat, as the licensor of this document, waives the right to enforce, and agrees not to assert, Section 4d of CC-BY-SA to the fullest extent permitted by applicable law.
Red Hat, Red Hat Enterprise Linux, the Shadowman logo, the Red Hat logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.
Linux® is the registered trademark of Linus Torvalds in the United States and other countries.
Java® is a registered trademark of Oracle and/or its affiliates.
XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.
MySQL® is a registered trademark of MySQL AB in the United States, the European Union and other countries.
Node.js® is an official trademark of Joyent. Red Hat is not formally related to or endorsed by the official Joyent Node.js open source or commercial project.
The OpenStack® Word Mark and OpenStack logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation's permission. We are not affiliated with, endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.
All other trademarks are the property of their respective owners.