创建和管理镜像
使开源包含更多
红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。我们从这四个术语开始:master、slave、黑名单和白名单。由于此项工作十分艰巨,这些更改将在即将推出的几个发行版本中逐步实施。详情请查看 CTO Chris Wright 的信息。
对红帽文档提供反馈
我们感谢您对文档提供反馈信息。与我们分享您的成功秘诀。
在 JIRA 中提供文档反馈
使用 Create Issue 表单对文档提供反馈。JIRA 问题将在 Red Hat OpenStack Platform Jira 项目中创建,您可以在其中跟踪您的反馈进度。
- 确保您已登录到 JIRA。如果您没有 JIRA 帐户,请创建一个帐户来提交反馈。
- 点击以下链接打开 Create Issue 页面: Create Issue
- 完成 Summary 和 Description 字段。在 Description 字段中,包含文档 URL、章节或章节号以及问题的详细描述。不要修改表单中的任何其他字段。
- 点 Create。
第 1 章 Image 服务(glance)
管理 Red Hat OpenStack Platform(RHOSP)中的镜像和存储。
虚拟机镜像是一个文件,其中包含安装可引导操作系统的虚拟磁盘。支持不同格式的虚拟机镜像。RHOSP 中提供了以下格式:
-
RAW
- 非结构化磁盘镜像格式。 -
QCOW2
- QEMU 模拟器支持的磁盘格式。此格式包括 QCOW2v3(有时称为 QCOW3),它要求 QEMU 1.1 或更高版本。 -
ISO
- 磁盘上的数据扇区副本,保存在二进制文件中。 -
AKI
- 指示 Amazon 内核镜像. -
AMI
- 指示 Amazon 机器镜像。 -
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 多存储.更多信息请参阅 第 2.1 节 “存储边缘架构要求”。
Object Storage(swift)。有关更多信息,请参阅高级 Overcloud 自定义指南中的使用外部 Object Storage 集群。
镜像服务使用 Object 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 来转换镜像。
作为导入工作流的一部分,插件提供镜像转换。可根据部署器配置激活或取消激活此插件。因此,部署器需要为部署指定首选镜像格式。
在内部,镜像服务以特定格式接收镜像的位。这些位存储在临时位置。然后,触发插件将镜像转换为目标格式并移到最终目的地。任务完成后,会删除临时位置。因此,初始上传的格式不会被镜像服务保留。
有关镜像转换的更多信息,请参阅 第 1.2.8 节 “启用镜像转换”
只有在导入镜像时才能触发转换。上传镜像时不会运行它。例如:
$ 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 模板配置镜像服务缓存:
流程
在环境文件中,将
GlanceCacheEnabled
参数的值设置为true
,这将在glance-api.conf
heat 模板中自动将flavor
值设置为keystone+cachemanagement
:parameter_defaults: GlanceCacheEnabled: true
-
在重新部署 overcloud 时,将环境文件包含到
openstack overcloud deploy
命令中。 可选:在重新部署 overcloud 时,对
glance_cache_pruner
进行微调。以下示例显示了 5 分钟的频率:parameter_defaults: ControllerExtraConfig: glance::cache::pruner::minute: '*/5'
根据您的需要调整频率,以避免文件系统完整场景。选择替代频率时包含以下元素:
- 要在环境中缓存的文件大小。
- 可用文件系统空间量。
- 环境缓存镜像的频率。
1.1.6. 镜像预缓存
Red Hat OpenStack Platform(RHOSP)director 可以预缓存镜像作为 glance-api
服务的一部分。
1.1.6.1. 为定期镜像预缓存配置默认间隔
镜像预缓存的默认定期间隔为 300 秒。您可以根据您的要求增加或减少默认间隔。
流程
根据您的要求,在 undercloud 上的环境文件中使用
ExtraConfig
参数添加新间隔:parameter_defaults: ControllerExtraConfig: glance::config::glance_api_config: DEFAULT/cache_prefetcher_interval: value: '<300>'
将 <300> 替换为您要作为预缓存镜像的间隔的秒数。
在调整
/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
命令。
流程
以 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 ~]$
要对 overcloud 进行身份验证,默认将存储在
/home/stack/overcloudrc
中的凭证复制到controller-0
:$ scp ~/overcloudrc heat-admin@192.168.24.71:/home/heat-admin/
连接到
controller-0
:$ ssh heat-admin@192.168.24.71
在
controller-0
上,以heat-admin
用户身份识别glance_api 服务的
IP 地址。在以下示例中,IP 地址是172.25.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
由于
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
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 /]$
使用
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 /]$
流程
以 admin 用户身份,将镜像队列为缓存:
$ glance-cache-manage --host=<host_ip> queue-image <image_id>
-
将 <host_ip> 替换为运行
glance-api
容器的 Controller 节点的 IP 地址。 将 <image_id> 替换为您要队列的镜像的 ID。
当您排队要预缓存的镜像时,
cache_images
定期作业会同时列出所有排队的镜像。注意由于镜像缓存是每个节点的本地缓存,如果使用 HA(有 3、5 或 7 控制器)部署 Red Hat OpenStack Platform,那么在您运行
glance-cache-manage
命令时,您必须使用--host
选项指定主机地址。
-
将 <host_ip> 替换为运行
运行以下命令,以查看镜像缓存中的镜像:
$ 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
从缓存队列中删除镜像。 -
删除-all-queued-images
,从缓存队列中删除所有镜像。
1.1.7. 使用镜像服务 API 启用稀疏镜像上传
使用镜像服务(glance)API,您可以使用稀疏镜像上传来减少网络流量并保存存储空间。此功能在分布式 Compute 节点 (DCN) 环境中特别有用。使用稀疏镜像文件,镜像服务不会写入 null 字节序列。镜像服务使用给定偏移写入数据。存储后端将这些偏移解析为不实际消耗存储空间的 null 字节。
限制
- 仅 Ceph RBD 支持稀疏镜像上传。
- 文件系统不支持稀疏镜像上传。
- 在客户端和镜像服务 API 间传输过程中不会维护 Sparseness。在镜像服务 API 级别中,该镜像是稀疏的。
先决条件
- 您的 Red Hat OpenStack Platform(RHOSP)部署使用 RBD 作为镜像服务后端。
流程
-
以
stack
用户身份登录 undercloud 节点。 查找
stackrc
凭证文件:$ source stackrc
使用以下内容创建环境文件:
parameter_defaults: GlanceSparseUploadEnabled: true
使用其他环境文件将新环境文件添加到堆栈中并部署 overcloud:
$ openstack overcloud deploy \ --templates \ … -e <existing_overcloud_environment_files> \ -e <new_environment_file>.yaml \ …
有关上传镜像的更多信息,请参阅 第 1.2.2 节 “上传镜像”。
验证
您可以导入镜像并检查其大小来验证稀疏镜像上传。
在本地下载镜像文件:
$ wget <file_location>/<file_name>
将
<file_location
> 替换为文件的位置。将<file_name
> 替换为文件的名称。以下流程使用示例命令。在适当的环境中,将值替换为您环境中的值。
$ wget https://cloud.centos.org/centos/6/images/CentOS-6-x86_64-GenericCloud-1508.qcow2
检查您要上传的镜像的磁盘大小和虚拟大小:
qemu-img info <file_name>
以下流程使用示例命令。在适当的环境中,将值替换为您环境中的值。
$ qemu-img info CentOS-6-x86_64-GenericCloud-1508.qcow2 image: CentOS-6-x86_64-GenericCloud-1508.qcow2 file format: qcow2 virtual size: 8 GiB (8589934592 bytes) disk size: 1.09 GiB cluster_size: 65536 Format specific information: compat: 0.10 refcount bits: 1
导入镜像:
$ glance image-create-via-import --disk-format qcow2 --container-format bare --name centos_1 --file <file_name>
- 记录镜像 ID。后续步骤中需要用到它。
验证镜像是否已导入并处于 active 状态:
$ openstack image show <image_id>
在 Ceph Storage 节点上,验证镜像的大小是否小于第 1 步输出中的虚拟大小:
$ sudo rbd -p images diff <image_id> | awk '{ SUM += $2 } END { print SUM/1024/1024/1024 " GB" }' 1.03906 GB
可选:您可以确认在 Controller 节点上的 glance 配置文件中配置了
rbd_thin_provisioning
:使用 SSH 访问 Controller 节点:
$ ssh -A -t heat-admin@<controller_node_IP_address>
确认该 Controller 节点上的
rbd_thin_provisioning
等于True
:$ sudo podman exec -it glance_api sh -c 'grep ^rbd_thin_provisioning /etc/glance/glance-api.conf'
1.1.8. 安全 metadef API
在 Red Hat OpenStack Platform(RHOSP)中,用户可以通过元数据定义(metadef)API 定义键值对和标签元数据。目前,用户可以创建的元命名空间、对象、属性、资源或标签数量没有限制。
Metadef API 可能会向未经授权的用户泄漏信息。恶意用户可以利用缺乏限制并填充镜像服务(glance)数据库,且带有无限资源,这可以创建一个服务(DoS)风格的攻击。
镜像服务策略控制 metadef API。但是,metadef API 的默认策略设置可让所有用户创建或读取 metadef 信息。由于潜在的敏感名称(如内部基础架构详情或客户名称)无法隔离元数据,因此元数据资源不会将信息暴露给恶意用户。
1.1.8.1. 配置策略来限制 metadef API
要使镜像服务(glance)更安全,请在 Red Hat OpenStack Platform(RHOSP)部署中默认将 metadef 修改 API 限制为仅限管理员访问。
流程
作为云管理员,创建单独的 heat 模板文件,如
lock-down-glance-metadef-api.yaml
,使其包含镜像服务 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' } } …
有关策略和策略语法的详情,请参考此策略 章节。
在部署 overcloud 时,使用
-e
选项包括部署命令中包含策略覆盖的环境文件:$ openstack overcloud deploy -e lock-down-glance-metadef-api.yaml
1.1.8.2. 启用 metadef API
如果您之前限制的元数据定义(metadef)API,或希望重新放置新的默认值,您可以覆盖修改策略,以允许用户更新其各自资源。
具有依赖于对 metadef API 的写入访问权限的云管理员可能会导致所有用户访问这些 API。然而,在这种配置中,可能会意外泄漏敏感资源名称,如客户名称和内部项目。管理员必须审核其系统,以识别之前创建的资源,即使所有用户启用了读取访问权限也是如此。
流程
作为云管理员,登录 undercloud 并为策略覆盖创建一个文件。例如:
$ cat open-up-glance-api-metadef.yaml
配置策略覆盖文件,允许所有用户进行 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:metadef_default
。有关策略和策略语法的详情,请参考此策略 章节。在部署 overcloud 时,使用
-e
选项在部署命令中包括新策略文件:$ openstack overcloud deploy -e open-up-glance-api-metadef.yaml
1.2. 管理镜像
Image 服务(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. 将 KVM 客户机镜像与 Red Hat OpenStack Platform 搭配使用
您可以使用可用的 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 镜像 或 第 1.2.1.2.3 节 “创建 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 评估中心 下载评估镜像。
-
文本编辑器,如果您要更改
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]#
运行所有命令。
使用
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
配置实例:
- 在初始安装程序引导菜单中,选择 Install Red Hat Enterprise Linux 7。
- 选择相应的 Language 和 Keyboard 选项。
- 当提示输入您的安装使用的设备类型时,请选择" 自动探测到的安装介质 "。
- 当提示输入安装目的地时,请选择 Local Standard Disks。对于其他存储选项,请选择 Automatically configure partitioning。
- 对于软件选择,请选择 Minimal Install。
- 对于网络和主机名,选择 eth0 作为网络,并为您的设备选择主机名。默认主机名为 localhost.localdomain。
在 Root Password 字段中输入密码,然后在 Confirm 字段中再次输入相同的密码。
- 结果
- 安装过程完成,并显示 Complete! 屏幕。
- 安装完成后,重启实例并以 root 用户身份登录。
更新
/etc/sysconfig/network-scripts/ifcfg-eth0
文件,使其只包含以下值:TYPE=Ethernet DEVICE=eth0 ONBOOT=yes BOOTPROTO=dhcp NM_CONTROLLED=no
- 重启机器。
使用 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
更新系统:
# dnf -y update
安装
cloud-init
软件包:# dnf install -y cloud-utils-growpart cloud-init
编辑
/etc/cloud/cloud.cfg
配置文件并在cloud_init_modules
add 下:- resolv-conf
当实例首次引导时,
resolv-conf
选项会自动配置resolv.conf
。此文件包含与实例相关的信息,如名称服务器
、域和
其他选项。将以下行添加到
/etc/sysconfig/network
,以避免访问 EC2 元数据服务出现问题:NOZEROCONF=yes
要确保控制台消息显示在仪表板和
nova
控制台输出的 Log 选项卡中,请在/etc/default/grub
文件中添加以下引导选项:GRUB_CMDLINE_LINUX_DEFAULT="console=tty0 console=ttyS0,115200n8"
运行
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
取消注册实例,以便生成的镜像不包含此实例的订阅详情:
# subscription-manager repos --disable=* # subscription-manager unregister # dnf clean all
关闭实例:
# poweroff
使用
virt-sysprep
命令重置并清理镜像,以便它可用于在没有问题的情况下创建实例:[root@host]# virt-sysprep -d rhel7
通过将磁盘镜像中的任何可用空间转换为主机中的可用空间来减少镜像大小:
[root@host]# virt-sparsify --compress /tmp/rhel7.qcow2 rhel7-cloud.qcow2
这会在运行该命令的位置创建一个新的
rhel7-cloud.qcow2
文件。
rhel7-cloud.qcow2
镜像文件已准备好上传到镜像服务。有关使用仪表板将此镜像上传到 RHOSP 部署的更多信息,请参阅 第 1.2.2 节 “上传镜像”。
1.2.1.2.2. 创建 Red Hat Enterprise Linux 6 镜像
使用 Red Hat Enterprise Linux 6 ISO 文件以 QCOW2 格式手动创建 Red Hat OpenStack Platform(RHOSP)兼容镜像。
您必须在主机中使用 [root@host]#
运行所有命令。
使用
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
配置实例:
在初始安装程序引导菜单中,选择" 安装或升级现有系统 "并按照安装提示进行操作。接受默认设置。
磁盘安装程序提供了在安装前测试您的安装介质的选项。选择 OK 来运行测试,或选择 Skip 以继续进行测试。
- 选择相应的 Language 和 Keyboard 选项。
- 当提示输入您的安装使用的设备类型时,请选择 Basic Storage Devices。
-
为您的设备选择一个主机名。默认主机名为
localhost.localdomain
。 -
设置 时区和
root
密码。 - 根据磁盘中的空间,从哪个安装类型中选择您 想到的安装类型? 窗口。
- 选择 安装 SSH 服务器的基本服务器安装。
- 安装过程已完成,并显示 Red Hat Enterprise Linux 安装的完整 屏幕。
-
重启实例,然后以
root
用户身份登录。 更新
/etc/sysconfig/network-scripts/ifcfg-eth0
文件,使其只包含以下值:TYPE=Ethernet DEVICE=eth0 ONBOOT=yes BOOTPROTO=dhcp NM_CONTROLLED=no
- 重启机器。
使用 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
更新系统:
# dnf -y update
安装
cloud-init
软件包:# dnf install -y cloud-utils-growpart cloud-init
编辑
/etc/cloud/cloud.cfg
配置文件,并在cloud_init_modules
下添加以下内容。- resolv-conf
当实例首次引导时,
resolv-conf
选项会自动配置resolv.conf
配置文件。此文件包含与实例相关的信息,如名称服务器
、域
及其他选项。要防止网络问题,请创建
/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 地址。将以下行添加到
/etc/sysconfig/network
,以避免访问 EC2 元数据服务出现问题:NOZEROCONF=yes
要确保控制台消息显示在仪表板和
nova
控制台输出的 Log 选项卡中,请在/etc/grub.conf
文件中添加以下引导选项:console=tty0 console=ttyS0,115200n8
取消注册虚拟机,以便生成的镜像不包含此实例的同一订阅详情:
# subscription-manager repos --disable=* # subscription-manager unregister # dnf clean all
关闭实例:
# poweroff
使用
virt-sysprep
命令重置并清理镜像,以便它可用于在没有问题的情况下创建实例:[root@host]# virt-sysprep -d rhel6
使用
virt-sparsify
命令减少镜像大小。这个命令将磁盘镜像中的任何可用空间重新转换为主机中的可用空间:[root@host]# virt-sparsify --compress rhel6.qcow2 rhel6-cloud.qcow2
这会在运行该命令的位置创建一个新的
rhel6-cloud.qcow2
文件。注意根据镜像,根据应用到实例的类别中的磁盘空间,手动调整实例分区。
rhel6-cloud.qcow2
镜像文件已准备好上传到镜像服务。有关使用仪表板将此镜像上传到 RHOSP 部署的更多信息,请参阅 第 1.2.2 节 “上传镜像”。
1.2.1.2.3. 创建 Windows 镜像
使用 Windows ISO 文件以 QCOW2 格式手动创建 Red Hat OpenStack Platform(RHOSP)兼容镜像。
您必须在主机中使用 [root@host]#
运行所有命令。
流程
使用
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> the the Windows 实例的名称。
- <size>用于 GB 的 disk 大小。
- <path> the the Windows 安装 ISO 文件的路径。
<RAM> the requested of RAM 数量(以 MB 为单位)。
注意--os-type=windows
参数确保为 Windows 客户机正确配置了时钟,并启用其 Hyper-V enlightenment 功能。您还必须在镜像元数据中设置os_type=windows
,然后才能将镜像上传到镜像服务。
virt-install
默认将客户机镜像保存为/var/lib/libvirt/images/
<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 文档。
-
要允许新安装的 Windows 系统使用虚拟化硬件,您可能需要安装 VirtIO 驱动程序。要做到这一点,首先安装镜像,该镜像必须作为 CD-ROM 驱动器附加到 Windows 实例。要安装
virtio-win
软件包,您必须将 VirtIO ISO 镜像添加到实例中,并安装 VirtIO 驱动程序。如需更多信息,请参阅 配置和管理虚拟化 指南中的 为 Windows 虚拟机安装 KVM 半虚拟驱动程序。 要完成配置,请在 Windows 系统上下载并执行 Cloudbase-Init。在 Cloudbase-Init 安装结束时,选择 Run Sysprep 和 Shutdown 复选框。
Sysprep
工具通过生成操作系统 ID(供某些 Microsoft 服务使用)使 guest 唯一。重要红帽对 Cloudbase-Init 不提供技术支持。如果您遇到问题,请参阅 联系 Cloudbase Solutions。
当 Windows 系统关闭时,& lt;name>.qcow2
镜像文件已准备好上传到镜像服务。有关使用仪表板或命令行将此镜像上传到 RHOSP 部署的更多信息,请参阅 第 1.2.2 节 “上传镜像”。
libosinfo 数据
计算服务已弃用支持使用 libosinfo 数据来设置默认设备模型。反之,使用以下镜像元数据属性为实例配置最佳虚拟硬件:
-
os_distro
-
os_version
-
hw_cdrom_bus
-
hw_disk_bus
-
hw_scsi_model
-
hw_vif_model
-
hw_video_model
-
hypervisor_type
有关这些元数据属性的更多信息,请参阅 镜像配置参数。
1.2.2. 上传镜像
- 在仪表板中,选择 Project > Compute > Images。
- 点 Create Image。
- 填写这些值,再单击 创建镜像。
字段 | 备注 |
---|---|
Name | 镜像的名称。名称在项目内必须是唯一的。 |
描述 | 用于标识镜像的简短描述。 |
镜像源 | 镜像源:镜像位置或镜像文件.根据您的选择,下一个字段会显示。 |
镜像位置或镜像文件 |
|
格式 | 镜像格式(如 qcow2)。 |
架构 | 镜像架构。例如,将 i686 用于 32 位构架,或使用 x86_64 进行 64 位构架。 |
最小磁盘(GB) | 引导镜像所需的最小磁盘大小。如果没有指定此字段,则默认值为 0(无最小值)。 |
最小 RAM(MB) | 引导镜像所需的最小内存大小。如果没有指定此字段,则默认值为 0(无最小值)。 |
公开 | 若选中,请将镜像设置为公共镜像,供有权访问该项目的所有用户。 |
protected | 如果选中,请确保只有具有特定权限的用户才能删除此镜像。 |
镜像上传成功后,其状态为 active
,这表示该镜像可用。请注意,镜像服务可以处理在启动上传时使用的 Identity service token 生命周期间需要很长时间的大镜像。这是因为镜像服务首先使用身份服务创建信任,以便在上传完成时获取和使用新令牌,以及更新镜像的状态。
您也可以使用 glance image-create
命令和 property
选项,以上传镜像。可以在命令行中使用更多值。有关完整列表,请参阅 附录 A, 镜像配置参数。
1.2.3. 更新镜像
- 在仪表板中,选择 Project > Compute > Images。
从列表中选择 Edit Image。
注意只有以
admin
用户身份登录时,才可使用 Edit Image 选项。当您以demo
用户身份登录时,您可以选择启动实例或 创建卷。- 更新字段并点击 Update Image。您可以更新以下值 - 名称、描述、内核 ID、ramdisk ID、架构、格式、最小磁盘、最小 RAM、公共、保护。
- 单击下拉菜单并选择 Update Metadata 选项。
- 通过向右列添加项目来指定元数据。在左侧列中,有来自镜像服务元数据目录的元数据定义。选择 Other 来使用您选择的键添加元数据,然后在完成后点击 Save。
您也可以使用 glance image-update
命令和 property
选项来更新镜像。在命令行中有多个值 ; 有关完整的列表,请参阅 附录 A, 镜像配置参数。
1.2.4. 导入镜像
您可以使用以下两种方法之一将镜像导入到镜像服务(glance):
-
使用
web-download
从 URI 导入镜像。 -
使用
glance-direct
从本地文件系统导入镜像。
web-download
方法被默认启用。云管理员配置导入方法。您可以运行 glance import-info
命令来列出可用的导入选项。
1.2.4.1. 从远程 URI 导入镜像
您可以使用 web-download
方法从远程 URI 复制镜像。
创建镜像并指定要导入的镜像的 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, ovf, ova, docker)。 -
将
<DISK-FORMAT
> 替换为您要为镜像设置的磁盘格式(None, ami, ari, aki, vhd, vhdx, vmdk, raw, qcow2, vdi, iso, ploop)。 -
将
<NAME
> 替换为您的镜像的描述性名称。 -
将
<URI
> 替换为镜像的 URI。
-
将
您可以使用
glance image-show <IMAGE_ID>
; 命令检查镜像的可用性。-
将
<IMAGE_ID
> 替换为您在镜像创建过程中提供的 ID。
-
将
镜像服务 Web 下载
方法使用两阶段进程来执行导入:
-
Web 下载
方法创建镜像记录。 -
Web 下载
方法从指定的 URI 检索镜像。
URI 受可选的 denylist 和 allowlist 过滤。
镜像属性注入插件可能会向镜像注入元数据属性。这些注入属性决定镜像实例在其上启动的计算节点。
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>
;, <DISK-FORMAT
> , <NAME
> , 和 </PATH/TO/IMAGE
> 替换为您的镜像的相关值。
镜像从暂存区域移到后端位置后,会列出该镜像。但是,可能需要过些时间,镜像才会变为活跃状态。
您可以使用 glance image-show <IMAGE_ID>
; 命令检查镜像的可用性。
-
将
<IMAGE_ID
替换为您在镜像创建过程中提供的 ID。
1.2.5. 删除镜像
- 在仪表板中,选择 Project > Compute > Images。
- 选择您要删除的镜像并点 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.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。
流程
将镜像转换为 RAW 可能会生成大于原始 QCOW2 镜像文件的镜像。在转换前运行以下命令,以确定最终的 RAW 镜像大小:
qemu-img info <image>.qcow2
将镜像从 QCOW2 转换为 RAW 格式:
qemu-img convert -p -f qcow2 -O raw <original qcow2 image>.qcow2 <new raw image>.raw
1.2.9.1. 在镜像服务(glance)中配置磁盘格式
您可以使用 GlanceDiskFormats
参数配置镜像服务(glance)来启用或禁用磁盘格式。
流程
-
以
stack
用户身份登录 undercloud 主机。 提供 undercloud 凭证文件:
$ source ~/stackrc
在环境文件中包括
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
在
openstack overcloud deploy
命令中包含新配置的环境文件,以及与您环境相关的其他环境文件:$ openstack overcloud deploy --templates \ -e <overcloud_environment_files> \ -e <new_environment_file> \ …
-
将
<overcloud_environment_files
> 替换为属于部署一部分的环境文件列表。 -
将
<new_environment_file
> 替换为包含新配置的环境文件。
-
将
有关 RHOSP 中可用磁盘格式的更多信息,请参阅 第 1 章 Image 服务(glance)。
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. 存储边缘架构要求
- 每个镜像的副本必须存在于中央位置的镜像服务中。
- 在边缘站点上创建实例之前,您必须在该边缘站点拥有镜像的本地副本。
- 上传到边缘站点的镜像必须复制到中央位置,然后才能将其复制到其他边缘站点。
- 在部署带有 Ceph 存储的 DCN 架构时,您必须使用 raw 镜像。
- RBD 必须是 Image、Compute 和 Block Storage 服务的存储驱动程序。
-
对于每个站点,您必须将相同的值分配给
NovaComputeAvailabilityZone
和CinderStorageAvailabilityZone
参数。
2.2. 将镜像导入多个存储
使用可互操作的镜像导入工作流,将镜像数据导入到多个 Ceph Storage 集群中。您可以将镜像导入到本地文件系统上可用的镜像服务,或者通过 web 服务器导入。
如果您从 web 服务器导入镜像,可以一次将镜像导入到多个存储中。如果 web 服务器上没有镜像,您可以将本地文件系统中的镜像导入到中央存储中,然后将其复制到额外的存储中。如需更多信息,请参阅将现有镜像复制到多个存储中。
即使在中央站点上存储镜像副本,即使没有使用该镜像位于中央位置的实例。有关将镜像导入到镜像服务的更多信息,请参阅 分布式计算节点和存储部署指南。
2.2.1. 管理镜像导入失败
您可以使用 --allow-failure
参数管理镜像导入操作失败:
-
如果
--allow-failure
参数的值为true
,则在第一次存储成功导入数据后,镜像状态将变为活动状态
。这是默认设置。您可以使用os_glance_failed_import
image 属性查看无法导入镜像数据的存储列表。 -
如果将
--allow-failure
参数的值设置为false
,则镜像状态仅在所有指定存储成功导入数据后变为active
。导入镜像数据的任何存储失败会导致镜像状态失败
。镜像没有导入到任何指定存储中。
2.2.2. 将镜像数据导入到多个存储中
由于 --allow-failure
参数的默认设置是 true
,因此如果某些存储可以接受的,则不需要在命令中包含 参数,以导入镜像数据。
此流程不需要所有存储才能成功导入镜像数据。
流程
将镜像数据导入多个指定的存储:
$ 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。
- 将 STORE1、 STORE2 和 STORE3 替换为您要导入镜像数据的存储名称。
-
或者,将
--stores
替换为--all-stores true
,将镜像上传到所有存储。
glance image-create-via-import
命令自动将 QCOW2 镜像转换为 RAW 格式,只能使用 web-download
方法。glance-direct
方法可用,但只能在使用配置的共享文件系统的部署中才起作用。
2.2.3. 在不失败的情况下将镜像数据导入到多个存储中
此流程需要所有存储才能成功导入镜像数据。
流程
将镜像数据导入多个指定的存储:
$ glance image-create-via-import \ --container-format bare \ --name IMAGE-NAME \ --import-method web-download \ --uri URI \ --stores STORE1,STORE2
- 将 IMAGE-NAME 替换为您要导入的镜像的名称。
- 使用镜像的 URI 替换 URI。
- 将 STORE1、 STORE2 和 STORE3 替换为要复制镜像数据的存储名称。
或者,将
--stores
替换为--all-stores true
,将镜像上传到所有存储。注意当
--allow-failure
参数设置为false
时,镜像服务不会忽略无法导入镜像数据的存储。您可以使用镜像属性os_glance_failed_import
来查看失败存储列表。如需更多信息,请参阅 检查镜像导入操作的进度。
验证镜像数据是否已添加到特定的存储中:
$ glance image-show IMAGE-ID | grep stores
将 IMAGE-ID 替换为原始现有镜像的 ID。
输出显示以逗号分隔的存储列表。
2.2.4. 将镜像数据导入到单个存储中
您可以将镜像数据导入到单个存储中。
流程
将镜像数据导入单个存储:
$ 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
选项,则镜像服务会在中央存储中创建镜像。
验证镜像数据是否已添加到特定的存储中:
$ glance image-show IMAGE-ID | grep stores
将 IMAGE-ID 替换为原始现有镜像的 ID。
输出显示以逗号分隔的存储列表。
2.2.5. 检查镜像导入操作的进度
可互操作的镜像导入工作流会按顺序将镜像数据导入到存储中。镜像、存储数量和中央站点之间的网络速度和边缘站点之间的网络速度会影响镜像导入操作完成所需的时间。
您可以通过查看两个镜像属性来跟踪镜像导入的进度,该属性会显示在镜像导入操作期间发送的通知中:
-
os_glance_importing_to_stores
属性列出了尚未导入镜像数据的存储。在导入开始时,所有请求的存储均显示在列表中。每次成功导入镜像数据时,镜像服务会从列表中删除存储。 -
os_glance_failed_import
属性列出了无法导入镜像数据的存储。此列表在镜像导入操作开始时为空。
在以下流程中,环境中有三个 Ceph Storage 集群: 中央存储
和两个存储在边缘的 dcn0
和 dcn1
。
流程
验证镜像数据是否已添加到特定的存储中:
$ glance image-show IMAGE-ID
将 IMAGE-ID 替换为原始现有镜像的 ID。
输出显示了类似以下示例片断的以逗号分隔的存储列表:
| os_glance_failed_import | | os_glance_importing_to_stores | central,dcn0,dcn1 | status | importing
监控镜像导入操作的状态。当您在命令前面带有
watch
时,命令输出每两秒钟刷新一次。$ watch glance image-show IMAGE-ID
将 IMAGE-ID 替换为原始现有镜像的 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 Services(glance)镜像数据将现有镜像复制到边缘的多个 Ceph 存储存储中。
镜像必须存在于中央站点,然后才能将其复制到任何边缘站点。只有镜像所有者或管理员可以将现有镜像复制到新添加的存储中。
您可以通过将 --all-stores
设置为 true
或指定特定存储来接收镜像数据来复制现有镜像数据。
-
--all-stores
选项的默认设置是false
。如果--all-stores
为false
,您必须使用--stores STORE1,STORE2
指定存储镜像数据。如果镜像数据已存在于任何指定存储中,请求会失败。 -
如果将
all-stores
设为true
,且镜像数据已存在于一些存储中,则这些存储不包括在列表中。
指定存储存储镜像数据后,镜像服务会将数据从中央站点复制到暂存区域。然后,镜像服务使用可互操作的镜像导入工作流来导入镜像数据。如需更多信息,请参阅将镜像导入到多个存储。
红帽建议管理员要仔细避免时间非常接近的镜像复制请求。同一镜像两端的 copy-image 操作会导致竞争条件和意外的结果。现有镜像数据保持不变,但将数据复制到新存储会失败。
2.3.1. 将镜像复制到所有存储中
使用以下步骤将镜像数据复制到所有可用存储。
流程
将镜像数据复制到所有可用存储中:
$ glance image-import IMAGE-ID \ --all-stores true \ --import-method copy-image
使用您要复制的镜像的名称替换 IMAGE-ID。
确认镜像数据成功复制到所有可用存储:
$ glance image-list --include-stores
有关如何检查镜像导入操作的状态的信息,请参阅 检查镜像导入操作的进度。
2.3.2. 将镜像复制到特定存储
使用以下步骤将镜像数据复制到特定存储中。
流程
将镜像数据复制到特定的存储:
$ glance image-import IMAGE-ID \ --stores STORE1,STORE2 \ --import-method copy-image
- 使用您要复制的镜像的名称替换 IMAGE-ID。
- 将 STORE1 和 STORE2 替换为您要将镜像数据复制到的存储的名称。
确认镜像数据已成功复制到指定的存储中:
$ glance image-list --include-stores
有关如何检查镜像导入操作的状态的信息,请参阅 检查镜像导入操作的进度。
2.4. 从特定存储中删除镜像
此功能允许您使用 Red Hat OpenStack Image 服务(glance)删除特定存储中的现有镜像副本。
流程
从特定存储中删除镜像:
$ glance stores-delete --store _STORE_ID_ _IMAGE_ID_
- 将 _STORE_ID 替换为应删除镜像复制的存储的名称。
- 使用您要删除的镜像的 ID 替换 IMAGE_ID。
使用 glance image-delete
将在所有站点中永久删除镜像。将删除所有镜像副本,以及镜像实例和元数据。
2.5. 了解镜像的位置
虽然镜像可以存在于多个站点,但给定镜像只有一个 UUID。镜像元数据包含每个副本的位置。例如,两个边缘站点上存在的镜像作为具有三个位置的单一 UUID 公开:中央站点加上两个边缘站点。
流程
显示镜像副本存在的站点:
$ glance image-show ID | grep "stores" | stores | default_backend,dcn1,dcn2
在示例中,镜像存在于中央站点、
default_backend
和两个边缘站点dcn1
和dcn2
上。另外,您可以使用
--include-stores
选项运行glance image-list
命令,以查看镜像存在的站点:$ glance image-list --include-stores | ID | Name | Stores | 2bd882e7-1da0-4078-97fe-f1bb81f61b00 | cirros | default_backend,dcn1,dcn2
列出镜像位置属性以显示每个位置的详情:
$ 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 --)
镜像属性显示各个镜像位置的不同 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-update
和 glance image-create
命令的 property
选项:
$ glance image-update IMG-UUID --property architecture=x86_64
特定于 | 键 | 描述 | 支持的值 |
---|---|---|---|
All |
|
管理程序必须支持的 CPU 架构。例如, |
|
All |
| 管理程序类型。 |
|
All |
| 对于快照镜像,这是用于创建此镜像的服务器的 UUID。 | 有效服务器 UUID |
All |
| 存储在镜像服务中的镜像的 ID,在引导 AMI 风格的镜像时应用作内核。 | 有效的镜像 ID |
All |
| 小写的操作系统分发的通用名称。 |
|
All |
| 由经销商指定的操作系统版本。 | 版本号(例如:"11.10") |
All |
| 存储在镜像服务中的镜像的 ID,在引导 AMI 风格的镜像时应当用作 ramdisk。 | 有效的镜像 ID |
All |
| 虚拟机模式。它代表了用于虚拟机的主机/guest ABI(应用程序二进制接口)。 |
|
libvirt API 驱动程序 |
| 指定要将磁盘设备附加到的磁盘控制器类型。 |
|
libvirt API 驱动程序 |
| 指定要将 CD-ROM 设备附加到的磁盘控制器类型。 |
|
libvirt API 驱动程序 |
| 向实例公开的 NUMA 节点数量(不会覆盖类别定义)。 | 整数. |
libvirt API 驱动程序 |
| vCPU N-M 到 NUMA 节点 0(不覆盖类别定义) | 以逗号分隔的整数列表。 |
libvirt API 驱动程序 |
| vCPU N-M 到 NUMA 节点 1的映射(不会覆盖类别定义)。 | 以逗号分隔的整数列表。 |
libvirt API 驱动程序 |
| 将 N MB RAM 映射到 NUMA 节点 0(不要覆盖类别定义)。 | 整数 |
libvirt API 驱动程序 |
| 将 N MB RAM 映射到 NUMA 节点 1(不要覆盖类别定义)。 | 整数 |
libvirt API 驱动程序 |
|
客户机代理支持。如果设置为 |
|
libvirt API 驱动程序 |
| 向使用该镜像启动的实例添加一个随机数生成器(RNG)设备。
实例类别默认启用 RNG 设备。要禁用 RNG 设备,云管理员必须在类别的
默认熵源是 |
|
libvirt API 驱动程序 |
| 支持使用 VirtIO SCSI(virtio-scsi)为计算实例提供块设备访问;默认情况下,实例使用 VirtIO Block(virtio-blk)。VirtIO SCSI 是一个半虚拟化 SCSI 控制器设备,可提供更高的可扩展性和性能,支持高级 SCSI 硬件。 |
|
libvirt API 驱动程序 |
| 在虚拟机实例中使用的显示设备的视频设备驱动程序。 | 设置为以下值之一,指定要使用的驱动程序:
|
libvirt API 驱动程序 |
|
视频镜像的最大 RAM。仅在类别的 | 以 MB 为单位的整数(例如 64) |
libvirt API 驱动程序 |
|
启用在服务器挂起时执行指定操作的虚拟硬件 watchdog 设备。watchdog 使用 i6300esb 设备(计算 PCI Intel 6300ESB)。如果没有指定 |
|
libvirt API 驱动程序 |
| libvirt 驱动程序使用的内核命令行,而不是默认行。对于 Linux 容器(LXC),该值用作初始化的参数。此密钥仅对 Amazon 内核、ramdisk 或机器镜像(aki、ari 或 ami)有效。 | |
libvirt API 驱动程序和 VMware API 驱动程序 |
| 指定要使用的虚拟网络接口设备的型号。 | 有效选项取决于配置的虚拟机监控程序。
|
VMware API 驱动程序 |
| 管理程序使用的虚拟 SCSI 或 IDE 控制器。 |
|
VMware API 驱动程序 |
|
VMware GuestID,用于描述镜像中安装的操作系统。这个值在创建虚拟机时传递给虚拟机监控程序。如果未指定,则密钥默认为 | 如需更多信息,请参阅使用 VMware vSphere 的镜像。 |
VMware API 驱动程序 |
| 当前未使用的. |
|
XenAPI 驱动程序 |
|
如果为 true,则在实例引导前,磁盘上的根分区会自动调整大小。这个值只有在使用基于 XenAPI 驱动程序的管理程序时,才会考虑计算服务。只有镜像中有单个分区,只有分区为 |
|
libvirt API 驱动程序和 XenAPI 驱动程序 |
|
镜像上安装的操作系统。XenAPI 驱动程序包含逻辑,它们根据镜像的 |
|