存储指南

Red Hat OpenStack Platform 16.1

了解、使用和管理 OpenStack 中的持久性存储

OpenStack Documentation Team

摘要

本指南详细介绍了在 Red Hat OpenStack Platform 环境中使用和管理持久性存储的不同程序。它还包含配置和管理每种持久性存储类型的相应 OpenStack 服务的步骤。

使开源包含更多

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

对红帽文档提供反馈

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

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

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

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

第 1 章 Red Hat OpenStack Platform 中持久性存储简介

本指南讨论了创建和管理持久性存储的步骤。在 Red Hat OpenStack Platform (RHOSP)中,此存储由三个主要服务提供:

  • Block Storage (openstack-cinder)
  • Object Storage (openstack-swift)
  • 共享文件系统存储(openstack-manila)

这些服务提供不同类型的持久性存储,它们在不同用例中都有自己的一组优点。本指南讨论了用于一般企业存储要求的适用性。

您可以使用 RHOSP 仪表板或命令行客户端管理云存储。您可以使用任一方法执行大多数步骤。但是,您只能在命令行中完成一些更高级的步骤。本指南为仪表板提供尽可能使用的步骤。

注意

有关 Red Hat OpenStack Platform 文档的完整套件,请参阅 Red Hat OpenStack Platform 文档

重要

本指南记录了使用 crudini 应用一些自定义服务设置。因此,您需要首先安装 crudini 软件包:

# dnf install crudini -y

RHOSP 识别两种类型的存储: ephemeralpersistent。临时存储是仅与特定 Compute 实例关联的存储。实例终止后,即其临时存储。这种类型的存储对基本运行时要求很有用,如存储实例的操作系统。

持久性存储 的设计目的是独立于任何正在运行的实例的存活(持久性)。此存储用于需要被不同实例重复使用的任何数据,或超过特定实例的生命周期。RHOSP 使用以下类型的持久性存储:

OpenStack Block Storage 服务(openstack-cinder)允许用户通过 访问块存储设备。用户可以将卷附加到实例,以便使用通用持久性存储增强其临时存储。卷可以分离并重新附加到实例,只能通过它们所连接的实例访问。

您还可以将实例配置为使用临时存储。您可以配置块存储服务来将镜像写入卷,而不使用临时存储。然后,您可以使用卷作为实例的可引导根卷。

卷还通过备份和快照提供固有冗余和灾难恢复。另外,您还可以加密卷以提高安全性。

容器

OpenStack Object Storage 服务(openstack-swift)提供了一个完全分布式的存储解决方案,用于存储任何类型的静态数据或二进制对象,如介质文件、大型数据集和磁盘镜像。对象存储服务使用容器组织这些对象。

虽然卷的内容只能通过实例访问,但容器内的对象可以通过 Object Storage REST API 访问。因此,对象存储服务可以通过云中的几乎每个服务用作存储库。

共享
共享文件系统服务(openstack-manila)提供了轻松调配远程、可共享文件系统 或共享 的方法。共享允许云中租户打开共享存储,并可同时被多个实例使用。

每种存储类型都设计为解决特定的存储要求。容器是为广泛访问而设计的,因此能够在所有存储类型中实现最高吞吐量、访问和容错能力。容器使用量更多地用于服务。

另一方面,卷主要用于实例消耗。它们不会享受与容器相同的访问和性能级别,但它们具有更大的功能集,并且具有比容器更原生的安全功能。共享与本例中的卷类似,但多个实例可以消耗它们。

以下小节讨论了在特定存储标准上下文中每个存储类型的架构和功能集。

1.1. 可扩展性和后端

通常,集群存储解决方案提供了更大的后端可扩展性。例如,当您将 Red Hat Ceph 用作 Block Storage (cinder)后端时,您可以通过添加更多 Ceph Object Storage Daemon (OSD)节点来扩展存储容量和冗余。Block Storage、Object Storage (swift)和共享文件系统服务(manila)服务支持 Red Hat Ceph Storage 作为后端。

块存储服务可以使用多种存储解决方案作为离散后端。在后端级别,您可以通过添加更多后端并重新启动服务来扩展容量。块存储服务还具有大量支持的后端解决方案列表,其中的一些功能具有额外的可扩展性功能。

默认情况下,对象存储服务使用配置的存储节点上的文件系统,并且可以使用尽可能多的空间。对象存储服务支持 XFS 和 ext4 文件系统,它们都可以扩展为消耗尽可能多的底层块存储。您还可以通过向存储节点添加更多存储设备来扩展容量。

共享文件系统服务从被一个或多个第三方后端存储系统管理的指定存储池中置备文件共享。您可以通过增加服务可用的大小或数量来扩展此共享存储,或者向部署添加更多第三方后端存储系统。

1.2. 可访问性和管理

卷只通过实例被消耗,一次只能附加到一个实例中并挂载到一个实例。用户可以创建卷快照,可用于克隆卷或将卷恢复到以前的状态(请参阅 第 1.4 节 “冗余和灾难恢复”)。块存储服务还允许您创建卷类型,其中聚合了卷设置(如大小和后端),用户可在创建新卷时可轻松调用。这些类型可以与 服务质量 规格进一步关联,允许您为用户创建不同的存储层。

与卷一样,共享通过实例消耗。但是,共享可以直接挂载到实例中,不需要通过控制面板或 CLI 连接。共享也可以由多个实例同时挂载。共享文件系统服务还支持共享快照和克隆 ; 您还可以创建共享类型来聚合设置(与卷类型类似)。

容器中的对象可以通过 API 访问,并可供云内的实例和服务访问。这使得它们成为服务的对象存储库;例如,镜像服务(openstack-glance)将其镜像存储在由对象存储服务管理的容器中。

1.3. 安全

块存储服务(cinder)通过卷加密提供基本数据安全性。因此,您可以将卷类型配置为通过静态密钥加密;然后,密钥用于加密从配置的卷类型创建的所有卷。更多信息请参阅 第 2.2.6 节 “配置卷加密”

对象和容器安全性在服务和节点级别进行配置。Object Storage 服务(swift)没有为容器和对象提供原生加密。相反,对象存储服务优先选择云中可访问性的优先级,因此,这只依赖于云网络安全性来保护对象数据。

共享文件系统服务(manila)可以通过访问限制来保护共享,无论是实例 IP、用户或组还是 TLS 证书。此外,一些共享文件系统服务部署可以功能独立的共享服务器来管理共享网络和共享之间的关系;一些共享服务器支持,甚至需要额外的网络安全性。例如,CIFS 共享服务器需要部署 LDAP、Active Directory 或 Kerberos 身份验证服务。

有关如何保护镜像服务(glance)的更多信息,如镜像签名和验证和元数据定义(metadef)API 限制,请参阅创建和管理镜像指南中的镜像服务

1.4. 冗余和灾难恢复

块存储服务具有卷备份和恢复,为用户提供基本灾难恢复。备份允许您保护卷内容。在此之上,服务也支持快照;除克隆外,快照也可用于将卷恢复到之前的状态。

在多后端环境中,您还可以在后端之间迁移卷。如果您需要使后端脱机进行维护,这非常有用。备份通常存储在独立于其源卷的存储后端中,以帮助保护数据。但是,无法实现快照,因为快照取决于其源卷。

块存储服务还支持创建 一致性组,允许您将卷分组在一起,以便同时创建快照。这反过来,允许在多个卷之间实现更高级别的数据一致性。详情请查看 第 2.2.9 节 “配置和使用一致性组”

对象存储服务不提供内置备份功能。因此,所有备份都必须在文件系统或节点级别执行。但是,该服务具有更强大的冗余和容错功能;即使 Object Storage 服务最基本的部署也会多次复制对象。您可以使用 dm-multipath 等故障转移功能来增强冗余。

共享文件系统服务不提供共享的内置备份功能,但它允许您为克隆和恢复创建快照。

第 2 章 块存储和卷

块存储服务(openstack-cinder)管理所有卷的管理、安全性、调度和整体管理。卷用作计算实例的主要持久性存储形式。

有关卷备份的更多信息,请参阅 块存储备份指南

2.1. 后端

Red Hat OpenStack Platform 使用 OpenStack Platform director 部署。这样做有助于确保正确配置每个服务,包括块存储服务(以及扩展,其后端)。director 还有几个集成后端配置。

Red Hat OpenStack Platform 支持将 Red Hat Ceph 和 NFS 用作块存储后端。默认情况下,块存储服务使用 LVM 后端作为卷的软件仓库。虽然此后端适合测试环境,但在生产环境中不支持 LVM。

有关如何使用 OpenStack 部署 Ceph 的说明,请参阅使用容器化 Red Hat Ceph 部署 Overcloud

有关如何在 overcloud 中设置 NFS 存储的说明,请参阅高级 Overcloud 自定义指南中的 配置 NFS 存储

2.1.1. 第三方存储提供程序

您还可以配置块存储服务以使用支持的第三方存储设备。director 包括必要的组件,可轻松部署不同的后端解决方案。

有关支持的后端设备和驱动程序的完整列表,请参阅 RHEL OpenStack 平台中的组件、插件和驱动程序支持。所有第三方后端设备和驱动程序都有额外的部署指南。检查适当的部署指南,以确定后端设备或驱动程序是否需要插件。有关部署第三方存储设备插件的更多信息,请参阅高级 Overcloud 自定义指南中的 部署供应商插件

2.2. 块存储服务管理

以下流程解释了如何配置块存储服务以满足您的需要。所有这些流程都需要管理员特权。

重要

您必须在使用块存储服务(cinder)和光纤通道(FC)后端的任何部署中,在所有 Controller 节点和 Compute 节点上安装主机总线适配器(HBA)。

2.2.1. 主动-主动部署以实现高可用性

重要的
只有边缘站点的分布式计算节点(DCN)架构中才支持主动-主动模式。

在主动 - 被动模式中,如果块存储服务在超融合部署中失败,节点隔离就不可靠。这是因为节点隔离可以触发不必要的重新平衡存储。边缘站点不会部署 Pacemaker,但 Pacemaker 仍然存在于控制站点。相反,边缘站点在主动配置中部署块存储服务来支持高度可用的超融合部署。

主动-主动部署通过在所有可用节点之间平衡工作负载来提高扩展、性能并缩短响应时间。在主动配置中部署块存储服务可创建一个高可用性环境,可在部分网络中断期间维护管理层,以及单节点或多节点硬件故障。主动-主动部署允许集群在节点中断期间继续提供块存储服务。

但是,主动-主动部署不会启用工作流自动恢复。如果服务停止,在故障节点上运行的单个操作也会在中断期间失败。在这种情况下,确认服务已关闭,并启动已进行动态操作的资源清理。

2.2.1.1. 为高可用性启用主动配置

cinder-volume-active-active.yaml 文件允许您在 active-active 配置中部署块存储服务。此文件可确保 director 使用非 Pacemaker cinder-volume heat 模板,并将 etcd 服务作为分布式锁定管理器(DLM)添加到部署中。

cinder-volume-active-active.yaml 文件还通过为 CinderVolumeCluster 参数指定一个值来定义 active-active 集群名称。CinderVolumeCluster 是一个全局块存储参数。因此,您无法在同一部署中包含集群(主动-主动)和非集群后端。

重要

目前,块存储的主动配置仅适用于 Ceph RADOS 块设备(RBD)后端。如果您计划使用多个后端,则所有后端都必须支持主动配置。如果部署中包含不支持主动配置的后端,则该后端将不适用于存储。在主动-主动部署中,如果您在不支持主动配置的后端中保存数据,则风险数据丢失。

流程

要启用主动-主动块存储服务卷,请在 overcloud 部署中包含以下环境文件:

-e /usr/share/openstack-tripleo-heat-templates/environments/cinder-volume-active-active.yaml

2.2.1.2. 主动配置的维护命令

部署主动配置后,您可以使用一些命令来在使用 API 版本 3.17 及之后的版本时与环境交互。

用户目标

命令

查看服务列表,包括集群名称、主机、区域、状态、状态、禁用原因和后端状态等详情。

注意 :当由 director 为 Ceph 后端部署时,默认的集群名称为 tripleo@tripleo_ceph

cinder service-list

请参阅整个集群的详细信息和摘要信息,而不是单个服务。

cinder cluster-list

注意 :该命令需要 3.7 或更高版本的 cinder API 微版本。

查看有关特定集群的详细信息。

cinder cluster-show <cluster_name>

注意 :该命令需要 3.7 或更高版本的 cinder API 微版本。

启用禁用的服务。

cinder cluster-enable <cluster_name>

注意 :该命令需要 3.7 或更高版本的 cinder API 微版本。

禁用集群服务。

cinder cluster-disable <cluster_name>

注意 :该命令需要 3.7 或更高版本的 cinder API 微版本。

2.2.1.3. 卷管理和取消管理

不管理和管理机制有助于使用版本 X+1 将卷从一个服务从一个服务移动到另一个服务。两个服务都会在此过程中保持运行。

在 API 版本 3.17 或更高版本中,您可以看到可用于块存储集群中管理的卷和快照列表。要查看这些列表,请使用带有 cinder manageable-listcinder snapshot-manageable-list--cluster 参数。

在 API 版本 3.16 及更高版本中,cinder 管理命令也接受可选的 --cluster 参数,以便您可以将之前非受管卷添加到块存储集群中。

2.2.1.4. 集群服务上的卷迁移

使用 API 版本 3.16 和更高版本时,cinder migratecinder-manage 命令接受 --cluster 参数来定义主动-主动部署的目的地。

当您在块存储服务中迁移卷时,传递可选的 --cluster 参数并省略 主机 位置参数,因为参数是相互排斥的。

2.2.1.5. 启动服务器维护

所有块存储卷服务在启动时执行自己的维护。在一个集群中分组的多个卷服务的环境中,您可以清理当前没有运行的服务。

命令 work-cleanup 会触发服务器清理。该命令返回:

  • 命令可以清理的服务列表。
  • 命令无法清理的服务列表,因为它们目前没有在集群中运行。
注意

work-cleanup 命令仅适用于运行 API 版本 3.24 或更高版本的服务器。

流程

  1. 运行以下命令验证集群的所有服务是否正在运行:

    $ cinder cluster-list --detailed

    或者,运行 cluster show 命令。

  2. 如果有任何服务没有运行,请运行以下命令来识别这些特定服务:

    $ cinder service-list
  3. 运行以下命令来触发服务器清理:

    $ cinder work-cleanup [--cluster <cluster-name>] [--host <hostname>] [--binary <binary>] [--is-up <True|true|False|false>] [--disabled <True|true|False|false>] [--resource-id <resource-id>] [--resource-type <Volume|Snapshot>]
    注意

    过滤器(如 --cluster--host--binary )定义命令清理的内容。您可以过滤集群名称、主机名、服务的类型和资源类型,包括特定资源。如果您没有应用过滤,命令会尝试清理可清理的所有内容。

    以下示例按集群名称过滤:

    $ cinder work-cleanup --cluster tripleo@tripleo_ceph

2.2.2. 使用卷类型的组卷设置

使用 Red Hat OpenStack Platform,您可以创建卷类型,以便您可以将相关的设置应用到卷类型。您可以在卷创建过程中应用设置,请参阅 创建卷。您还可以在创建卷后应用设置,请参阅 更改卷的类型(Volume Re-typing)。以下列表显示了您可以应用到卷类型的一些关联的设置:

设置使用名为 Extra Specs 的键值对与卷类型关联。当您在卷创建过程中指定卷类型时,块存储调度程序会将这些键值对作为设置应用。您可以将多个键值对与同一卷类型关联。

卷类型提供为不同的用户提供存储层的功能。通过将特定性能、弹性和其他设置作为键值对关联到卷类型,您可以将特定于层的设置映射到不同的卷类型。然后,您可以通过指定对应的卷类型,在创建卷时应用层设置。

2.2.2.1. 列出主机驱动程序的功能

注意

可用的 Extra Specs 因后端驱动程序而异。如需有效 Extra Specs 列表,请参阅驱动程序文档。

另外,您可以直接查询块存储主机,以确定其驱动程序支持哪些定义良好的标准 Extra Spec。首先(通过命令行)登录托管块存储服务的节点。然后:

# cinder service-list

此命令将返回一个列表,其中包含每个块存储服务的主机(cinder-backupcinder-schedulercinder-volume)。例如:

+------------------+---------------------------+------+---------
|      Binary      |            Host           | Zone |  Status ...
+------------------+---------------------------+------+---------
|  cinder-backup   |   localhost.localdomain   | nova | enabled ...
| cinder-scheduler |   localhost.localdomain   | nova | enabled ...
|  cinder-volume   | *localhost.localdomain@lvm* | nova | enabled ...
+------------------+---------------------------+------+---------

要显示块存储服务支持的 Extra Specs (并反过来)的驱动程序功能,请运行:

# cinder get-capabilities _VOLSVCHOST_

其中 VOLSVCHOSTcinder-volume 主机的完整名称。例如:

# cinder get-capabilities localhost.localdomain@lvm
    +---------------------+-----------------------------------------+
    |     Volume stats    |                        Value            |
    +---------------------+-----------------------------------------+
    |     description     |                         None            |
    |     display_name    |                         None            |
    |    driver_version   |                        3.0.0            |
    |      namespace      | OS::Storage::Capabilities::localhost.loc...
    |      pool_name      |                         None            |
    |   storage_protocol  |                        iSCSI            |
    |     vendor_name     |                     Open Source         |
    |      visibility     |                         None            |
    | volume_backend_name |                         lvm             |
    +---------------------+-----------------------------------------+
    +--------------------+------------------------------------------+
    | Backend properties |                        Value             |
    +--------------------+------------------------------------------+
    |    compression     |      {u'type': u'boolean', u'description'...
    |        qos         |              {u'type': u'boolean', u'des ...
    |    replication     |      {u'type': u'boolean', u'description'...
    | thin_provisioning  | {u'type': u'boolean', u'description': u'S...
    +--------------------+------------------------------------------+

Backend properties 列显示您可以设置的 Extra Spec Keys 列表,而 Value 列则提供有关有效对应值的信息。

2.2.2.2. 创建并配置卷类型

  1. 在仪表板中作为 admin 用户,选择 Admin > Volumes > Volume Types
  2. 单击创建卷类型
  3. Name 字段中输入卷类型名称。
  4. 单击创建卷类型。新类型会出现在 卷类型 表中。
  5. 选择卷类型的 View Extra Specs 操作。
  6. Create 并指定 KeyValue。键值对必须有效;否则,在卷创建过程中指定卷类型将导致错误。
  7. Create。关联的设置(键值对)现在出现在 Extra Specs 表中。

默认情况下,所有 OpenStack 租户都可以访问所有卷类型。如果您需要创建具有受限访问权限的卷类型,则需要通过 CLI 完成此操作。具体说明请查看 第 2.2.2.5 节 “创建并配置私有卷类型”

注意

您还可以将 QoS Spec 与卷类型关联。更多信息请参阅 第 2.2.5.4 节 “将 QOS Spec 与卷类型关联”

2.2.2.3. 编辑卷类型

  1. 在仪表板中作为 admin 用户,选择 Admin > Volumes > Volume Types
  2. Volume Types 表中,选择卷类型的 View Extra Specs 操作。
  3. 在此页的 Extra Specs 表中,您可以:

    • 在卷类型中添加一个新的设置。要做到这一点,点 Create 并指定您要与卷类型关联的新设置的键/值对。
    • 选择设置的 Edit action 来编辑与卷类型关联的现有设置。
    • 选择 extra specs 复选框并单击 Delete Extra Specs 和下一个对话框屏幕,删除与卷类型关联的现有设置。

2.2.2.4. 删除卷类型

要删除卷类型,请从卷类型表中选中其对应的复选框,然后点 Delete Volume Types

2.2.2.5. 创建并配置私有卷类型

默认情况下,所有租户都可使用所有卷类型。您可以通过将其标记为 私有 来创建受限卷类型。为此,请将类型的 is-public 标志设为 false

私有卷类型可用于限制对具有特定属性的卷的访问。通常,这些设置应当仅可供特定租户使用;示例包括新的后端或被测试的超高性能配置。

要创建私有卷类型,请运行:

$ cinder type-create --is-public false  <TYPE-NAME>

默认情况下,私有卷类型只能被创建者访问。但是,管理员用户可使用以下命令查找并查看私有卷类型:

$ cinder type-list --all

此命令列出了公共和私有卷类型,它还包括每个的名称和 ID。您需要卷类型的 ID 来提供它的访问权限。

在租户级别授予私有卷类型的访问权限。要授予租户对私有卷类型的访问权限,请运行:

$ cinder  type-access-add --volume-type <TYPE-ID> --project-id <TENANT-ID>

要查看哪些租户有权访问私有卷类型,请运行:

$ cinder  type-access-list --volume-type <TYPE-ID>

要从私有卷类型的访问列表中删除租户,请运行:

$ cinder  type-access-remove --volume-type <TYPE-ID> --project-id <TENANT-ID>
注意

默认情况下,只有具有管理特权的用户才能创建、查看或配置私有卷类型的访问权限。

2.2.3. 为块存储服务创建和配置内部租户

有些块存储功能(如 Image-Volume 缓存)需要配置内部租户。块存储服务使用此租户(或项目)来管理块存储项目,它们不一定需要公开给普通用户。此类项目的示例是缓存用于频繁卷克隆或迁移卷的临时副本的镜像。

要配置内部项目,首先创建一个名为 cinder-internal 的通用项目和用户。要做到这一点,登录到 Controller 节点并运行:

# openstack project create --enable --description "Block Storage Internal Tenant" cinder-internal
    +-------------+----------------------------------+
    |   Property  |              Value               |
    +-------------+----------------------------------+
    | description |  Block Storage Internal Tenant   |
    |   enabled   |               True               |
    |      id     | cb91e1fe446a45628bb2b139d7dccaef |
    |     name    |         cinder-internal          |
    +-------------+----------------------------------+
# openstack user create --project cinder-internal cinder-internal
    +----------+----------------------------------+
    | Property |              Value               |
    +----------+----------------------------------+
    |  email   |               None               |
    | enabled  |               True               |
    |    id    | 84e9672c64f041d6bfa7a930f558d946 |
    |   name   |         cinder-internal          |
    |project_id| cb91e1fe446a45628bb2b139d7dccaef |
    | username |         cinder-internal          |
    +----------+----------------------------------+

添加 Extra Config 选项的步骤会创建一个内部租户。更多信息请参阅 第 2.2.4 节 “配置并启用 Image-Volume 缓存”

2.2.4. 配置并启用 Image-Volume 缓存

块存储服务具有可选的 Image-Volume 缓存,可在从镜像创建卷时使用。此缓存旨在改进从频繁使用的镜像创建卷的速度。有关如何从镜像创建卷的详情,请参考 第 2.3.1 节 “创建一个卷”

启用后,Image-Volume 缓存会在从中创建卷时存储镜像的副本。此存储的镜像将缓存到块存储后端,以帮助在镜像下次用于创建卷时提高性能。Image-Volume 缓存的限制可以设置为大小(以 GB 为单位)、镜像数或两者。

几个后端支持 Image-Volume 缓存。如果您使用第三方后端,请参考其文档来获取有关 Image-Volume 缓存支持的信息。

注意

Image-Volume 缓存要求为块存储服务 配置内部租户。具体说明请查看 第 2.2.3 节 “为块存储服务创建和配置内部租户”

要在后端上启用和配置 Image-Volume 缓存(BACKEND),请将值添加到 undercloud 上环境文件的 ExtraConfig 部分。例如:

parameter_defaults:
  ExtraConfig:
    cinder::config::cinder_config:
      DEFAULT/cinder_internal_tenant_project_id:
        value: TENANTID
      DEFAULT/cinder_internal_tenant_user_id:
        value: USERID
      BACKEND/image_volume_cache_enabled: 1
        value: True
      BACKEND/image_volume_cache_max_size_gb:
        value: MAXSIZE 2
      BACKEND/image_volume_cache_max_count:
        value: MAXNUMBER 3
1
BACKEND 替换为目标后端的名称(特别是其 volume_backend_name 值)。
2
默认情况下,Image-Volume 缓存大小仅受后端限制。将 MAXSIZE 更改为 GB 的数字。
3
您还可以使用 MAXNUMBER 设置最大镜像数。

块存储服务数据库使用时间戳来跟踪每个缓存的镜像上次用于创建镜像。如果设置了 MAXSIZEMAXNUMBER,则块存储服务将根据需要删除缓存的镜像,以便为新的镜像进行修改。每当满足 Image-Volume 缓存限制时,会首先删除带有旧时间戳的缓存镜像。

/home/stack/templates/ 中创建环境文件后,以 stack 用户身份登录并通过运行以下命令来部署配置:

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

其中 ENV_FILE.yaml 是之前添加的 ExtraConfig 设置的文件名。

重要

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

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

2.2.5. 使用服务质量规格

您可以将多个性能设置映射到单个服务质量规格(QOS Specs)。这样,您可以为不同的用户类型提供性能层。

性能设置映射为 QOS Specs 的键值对,类似于卷设置与卷类型关联的方式。但是,在以下方面,QOS Specs 与卷类型不同:

  • QOS Specs 用于应用性能设置,其中包括对磁盘进行限制读/写操作。可用的和支持的性能设置因存储驱动程序而异。

    要确定后端支持哪些 QOS Spec,请参阅后端设备驱动程序的文档。

  • 卷类型直接应用于卷,而 QOS Specs 不是。相反,QOS Specs 与卷类型关联。在卷创建过程中,指定卷类型也会应用映射到卷类型关联的 QOS Specs 的性能设置。

2.2.5.1. 基本卷服务质量

您可以使用基本卷 QOS 值为每个卷定义性能限制。块存储服务支持以下选项:

  • read_iops_sec
  • write_iops_sec
  • total_iops_sec
  • read_bytes_sec
  • write_bytes_sec
  • total_bytes_sec
  • read_iops_sec_max
  • write_iops_sec_max
  • total_iops_sec_max
  • read_bytes_sec_max
  • write_bytes_sec_max
  • total_bytes_sec_max
  • size_iops_sec

2.2.5.2. 创建并配置 QOS 规格

作为管理员,您可以通过 QOS Specs 表创建和配置 QOS Spec。您可以将多个键/值对与同一 QOS Spec 关联。

  1. 在仪表板中作为 admin 用户,选择 Admin > Volumes > Volume Types
  2. QOS Specs 表中,点 Create QOS Spec
  3. 输入 QOS Spec 的名称。
  4. Consumer 字段中,指定应强制执行 QOS 策略的位置:

    表 2.1. 消费者类型

    类型描述

    back-end

    QOS 策略将应用到块存储后端。

    front-end

    QOS 策略将应用到 Compute。

    两者都

    QOS 策略将应用到块存储和计算。

  5. Create。新的 QOS Spec 现在应该会显示在 QOS Specs 表中。
  6. QOS Specs 表中,选择新的 spec 的 Manage Specs 操作。
  7. 单击 Create,再指定 KeyValue。键值对必须有效;否则,在卷创建过程中指定与此 QOS Spec 关联的卷类型将失败。

    例如,要将读取限制 IOPS 设置为 500,请使用以下 Key/Value 对:

    read_iops_sec=500
  8. Create。关联的设置(键值对)现在出现在 Key-Value Pairs 表中。

2.2.5.3. 设置 Capacity-Derived QoS 限制

您可以使用卷类型在卷上实现容量派生的服务质量(QoS)限制。这将允许您根据置备的卷的大小设置确定的 IOPS 吞吐量。这样做简化了存储资源如何提供给用户,为用户提供了预先确定的(并且最终具有高度可预测的)吞吐量率。

特别是,块存储服务允许您根据实际调配的大小设置要分配给卷的 IOPS 数。这个吞吐量由每个 GB 的 IOPS 通过以下 QoS 键设置:

read_iops_sec_per_gb
write_iops_sec_per_gb
total_iops_sec_per_gb

这些密钥允许您设置读取、写入或总 IOPS,以使用置备的卷的大小进行扩展。例如,如果卷类型使用 read_iops_sec_per_gb=500,则置备的 3GB 卷会自动具有读取 IOPS 1500。

容量派生的 QoS 限制是为每个卷类型设置,并像任何正常的 QoS 规格一样配置。另外,这些限制直接由底层块存储服务支持,不依赖于任何特定的驱动程序。

有关卷类型的详情,请参考 第 2.2.2 节 “使用卷类型的组卷设置”第 2.2.2.2 节 “创建并配置卷类型”。有关如何设置 QoS 规格的说明 第 2.2.5 节 “使用服务质量规格”

警告

当您将卷类型(或执行卷)带有 capacity-derived QoS 限制的卷类型(或执行卷)时,不会应用限制。只有在将卷从实例分离后,才会应用限制。

有关卷重新处理的信息,请参阅 第 2.3.16 节 “卷重新处理”

2.2.5.4. 将 QOS Spec 与卷类型关联

作为管理员,您可以使用卷类型表将 QOS Spec 与现有卷类型相关联。

  1. 在仪表板中以管理员身份,选择 Admin > Volumes > Volume Types
  2. Volume Types 表中,选择类型的 Manage QOS Spec Association 操作。
  3. 要关联的 QOS Spec 列表中选择 QOS Spec。
  4. 单击 关联。所选的 QOS Spec 现在会出现在编辑的卷类型的关联 QOS Spec 列中。

2.2.5.5. 从卷类型中解除 QOS Spec 解除关联

  1. 在仪表板中以管理员身份,选择 Admin > Volumes > Volume Types
  2. Volume Types 表中,选择类型的 Manage QOS Spec Association 操作。
  3. 从要关联的 QOS Spec 列表中选择 None
  4. 单击 关联。所选 QOS Spec 不再位于编辑 的卷类型的关联 QOS Spec 列中。

2.2.6. 配置卷加密

卷加密在卷后端被泄露或被盗时,提供基本数据保护。Compute 和 Block Storage 服务都集成在一起,以允许实例读取访问和使用加密卷。您必须部署 Key Manager 服务(barbican)才能使用卷加密。

重要
  • 基于文件的卷(如 NFS)不支持卷加密。
  • 不支持将未加密的卷重新设置为相同大小的加密卷,因为加密卷需要额外的空间来存储加密数据。有关加密未加密的卷的更多信息,请参阅 加密未加密的卷

使用卷类型应用卷加密。有关加密卷类型的详情,请查看 第 2.2.6.1 节 “通过控制面板配置卷类型加密”

2.2.6.1. 通过控制面板配置卷类型加密

要创建加密的卷,您首先需要一个 加密的卷类型。加密卷类型涉及设置它应使用的供应商类、密码和密钥大小:

  1. 在仪表板中作为 admin 用户,选择 Admin > Volumes > Volume Types
  2. 在要加密的卷的 Actions 列中,选择 Create Encryption 以启动 Create Volume Type Encryption 向导。
  3. 在这里,配置卷类型加密的 Provider,Control Location,Cipher, 和 Key Size 设置。Description 列描述了每个设置。

    重要

    以下列出的值是 ProviderCipherKey Size 唯一支持的选项。

    1. Provider 输入 luks
    2. Cipher 输入 aes-xts-plain64
    3. Key Size 输入 256
  4. 单击 Create Volume Type Encryption

有加密卷类型后,您可以调用它来自动创建加密的卷。有关创建卷类型的详情,请参考 第 2.2.2.2 节 “创建并配置卷类型”。具体来说,从 Create Volume 窗口中的 Type 下拉列表中选择加密的卷类型(请参阅 第 2.3 节 “基本卷使用和配置”)。

要通过 CLI 配置加密卷类型,请参阅 第 2.2.6.2 节 “通过 CLI 配置卷类型加密”

您还可以重新配置加密卷类型的加密设置。

  1. 从卷类型的 Actions 列中选择 Update Encryption 以启动 Update Volume Type Encryption 向导。
  2. Project > Compute > Volumes 中,检查 Volumes 表中的 Encrypted 列,以确定卷是否加密。
  3. 如果卷加密,请单击该列中的 Yes 以查看加密设置。

2.2.6.2. 通过 CLI 配置卷类型加密

要配置块存储卷加密,请执行以下操作:

  1. 创建卷类型:

    $ cinder type-create encrypt-type
  2. 配置密码、密钥大小、控制位置和提供程序设置:

    $ cinder encryption-type-create --cipher aes-xts-plain64 --key-size 256 --control-location front-end encrypt-type luks
  3. 创建一个加密卷:

    $ cinder --debug create 1 --volume-type encrypt-type --name DemoEncVol

2.2.6.3. 自动删除卷镜像加密密钥

将加密卷上传到镜像服务(glance)时,块存储服务(cinder)在密钥管理服务(barbican)中创建一个加密密钥。这会在加密密钥和存储的镜像之间创建一个 1:1 关系。

加密密钥删除可防止密钥管理服务无限度地消耗资源。块存储、密钥管理和镜像服务自动管理加密卷的密钥,包括删除密钥。

块存储服务会自动将两个属性添加到卷镜像中:

  • cinder_encryption_key_id - 密钥管理服务为特定镜像存储的加密密钥的标识符。
  • cinder_encryption_key_deletion_policy - 告知镜像服务是否删除与此镜像关联的密钥的策略。
重要

这些属性的值会被自动分配。为避免意外的数据丢失,请不要调整这些值

当您创建卷镜像时,块存储服务会将 cinder_encryption_key_deletion_policy 属性设置为 on_image_deletion。当您删除卷镜像时,如果 cinder_encryption_key_deletion_policy 等于 on_image_deletion _policy,则镜像服务会删除对应的加密密钥。

重要

红帽不推荐手动操作 cinder_encryption_key_idcinder_encryption_key_deletion_policy 属性。如果您使用由 cinder_encryption_key_id 值标识的加密密钥用于任何其他目的,则风险数据丢失。

如需更多信息,请参阅使用 OpenStack Key Manager 管理 secret 指南。

2.2.7. 配置卷如何分配为多个后端

如果块存储服务配置为使用多个后端,您可以使用配置的卷类型来指定应创建卷的位置。详情请查看 第 2.3.2 节 “为卷创建指定后端”

如果您在卷创建过程中没有指定后端,块存储服务将自动选择一个后端。块存储将第一个定义的后端设置为默认值;此后端将在用尽空间前使用。此时,块存储会将第二个定义的后端设置为默认后端,以此类推。

如果这不适用于您的需要,您可以使用过滤器调度程序来控制块存储应如何选择后端。此调度程序可以使用不同的过滤器来分类合适的后端,例如:

AvailabilityZoneFilter
过滤掉不符合所请求卷的可用区要求的所有后端。
CapacityFilter
仅选择具有足够空间的后端来容纳卷。
CapabilitiesFilter
仅选择可支持卷中任何指定设置的后端。
InstanceLocality
将集群配置为使用卷本地到同一节点。

要配置过滤器调度程序,请在包含以下内容的部署中添加环境文件:

parameter_defaults:
  ControllerExtraConfig: # 1
    cinder::config::cinder_config:
      DEFAULT/scheduler_default_filters:
        value: 'AvailabilityZoneFilter,CapacityFilter,CapabilitiesFilter,InstanceLocality'
1
您还可以在现有环境文件的 parameter_defaults: 部分中添加 ControllerExtraConfig: hook 及其嵌套部分。

2.2.8. 部署可用区

可用域是特定于供应商的,对云实例和服务进行分组的方法。director 使用 CinderXXXAvailabilityZone 参数(其中 XXX 与特定后端相关联)为块存储卷后端配置不同的可用区。

流程

为块存储卷后端部署不同的可用区:

  1. 在环境文件中添加以下参数来创建两个可用区:

    parameter_defaults:
     CinderXXXAvailabilityZone: zone1
     CinderYYYAvailabilityZone: zone2

    XXXYYY 替换为支持的后端值,例如:

    CinderISCSIAvailabilityZone
    CinderNfsAvailabilityZone
    CinderRbdAvailabilityZone
    注意

    /usr/share/openstack-tripleo-heat-templates/deployment/cinder/ 目录中搜索与后端关联的 heat 模板,以获取正确的后端值。

    以下示例部署两个后端,其中 rbd 是 zone 1,iSCSI 是 zone 2:

    parameter_defaults:
     CinderRbdAvailabilityZone: zone1
     CinderISCSIAvailabilityZone: zone2
  2. 部署 overcloud,并包含更新的环境文件。

2.2.9. 配置和使用一致性组

您可以使用 Block Storage (cinder)服务将一致性组设置为将多个卷作为单一实体分组在一起。这意味着,您可以同时对多个卷执行操作,而不是单独执行。您可以使用一致性组为多个卷同时创建快照。这也意味着您可以同时恢复或克隆这些卷。

卷可以是多个一致性组的成员。但是,在将卷添加到一致性组后,您无法删除、重新输入或迁移卷。

2.2.9.1. 配置一致性组

默认情况下,块存储安全策略禁用一致性组 API。在使用该功能前,您必须在此处启用它。托管 Block Storage API 服务的节点 /etc/cinder/policy.json 文件中的相关一致性组条目,openstack-cinder-api 列出默认设置:

"consistencygroup:create" : "group:nobody",
"consistencygroup:delete": "group:nobody",
"consistencygroup:update": "group:nobody",
"consistencygroup:get": "group:nobody",
"consistencygroup:get_all": "group:nobody",
"consistencygroup:create_cgsnapshot" : "group:nobody",
"consistencygroup:delete_cgsnapshot": "group:nobody",
"consistencygroup:get_cgsnapshot": "group:nobody",
"consistencygroup:get_all_cgsnapshots": "group:nobody",

您必须在环境文件中更改这些设置,然后使用 openstack overcloud deploy 命令将它们部署到 overcloud。不要直接编辑 JSON 文件,因为在下次部署 overcloud 时更改会被覆盖。

流程

  1. 编辑环境文件,并在 parameter_defaults 部分中添加新条目。这样可确保条目在容器中更新,并在 director 使用 openstack overcloud deploy 命令重新部署环境时保留条目。
  2. 使用 CinderApiPolicies 在环境文件中添加新部分来设置一致性组设置。带有 JSON 文件中的默认设置的等同 parameter_defaults 部分如下所示:

    parameter_defaults:
      CinderApiPolicies: { \
         cinder-consistencygroup_create: { key: 'consistencygroup:create', value: 'group:nobody' }, \
         cinder-consistencygroup_delete: { key: 'consistencygroup:delete', value: 'group:nobody' },  \
         cinder-consistencygroup_update: { key: 'consistencygroup:update', value: 'group:nobody' }, \
         cinder-consistencygroup_get: { key: 'consistencygroup:get', value: 'group:nobody' }, \
         cinder-consistencygroup_get_all: { key: 'consistencygroup:get_all', value: 'group:nobody' }, \
         cinder-consistencygroup_create_cgsnapshot: { key: 'consistencygroup:create_cgsnapshot', value: 'group:nobody' }, \
         cinder-consistencygroup_delete_cgsnapshot: { key: 'consistencygroup:delete_cgsnapshot', value: 'group:nobody' }, \
         cinder-consistencygroup_get_cgsnapshot: { key: 'consistencygroup:get_cgsnapshot', value: 'group:nobody' }, \
         cinder-consistencygroup_get_all_cgsnapshots: { key: 'consistencygroup:get_all_cgsnapshots', value: 'group:nobody' }, \
     }
  3. 'group:nobody' 确定没有组可以使用此功能,以便有效地禁用它。要启用它,请将组更改为另一个值。
  4. 为提高安全性,请将一致性组 API 和卷类型管理 API 的权限设置为相同。默认情况下,卷类型管理 API 会在同一个 /etc/cinder/policy.json_ file 文件中设置为 "rule:admin_or_owner"

    "volume_extension:types_manage": "rule:admin_or_owner",
  5. 要使一致性组功能可供所有用户使用,请将 API 策略条目设置为允许用户创建、使用和管理自己的一致性组。要做到这一点,请使用 rule:admin_or_owner:

    CinderApiPolicies: { \
         cinder-consistencygroup_create: { key: 'consistencygroup:create', value: 'rule:admin_or_owner' }, \
         cinder-consistencygroup_delete: { key: 'consistencygroup:delete', value: 'rule:admin_or_owner' },  \
         cinder-consistencygroup_update: { key: 'consistencygroup:update', value: 'rule:admin_or_owner' }, \
         cinder-consistencygroup_get: { key: 'consistencygroup:get', value: 'rule:admin_or_owner' }, \
         cinder-consistencygroup_get_all: { key: 'consistencygroup:get_all', value: 'rule:admin_or_owner' }, \
         cinder-consistencygroup_create_cgsnapshot: { key: 'consistencygroup:create_cgsnapshot', value: 'rule:admin_or_owner' }, \
         cinder-consistencygroup_delete_cgsnapshot: { key: 'consistencygroup:delete_cgsnapshot', value: 'rule:admin_or_owner' }, \
         cinder-consistencygroup_get_cgsnapshot: { key: 'consistencygroup:get_cgsnapshot', value: 'rule:admin_or_owner' }, \
         cinder-consistencygroup_get_all_cgsnapshots: { key: 'consistencygroup:get_all_cgsnapshots', value: 'rule:admin_or_owner’ }, \
     }
  6. 当您在 /home/stack/templates/ 中创建环境文件时,以 stack 用户身份登录并部署配置:

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

    <ENV_FILE.yaml > 替换为您添加的 ExtraConfig 设置的文件名称。

    重要

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

有关 openstack overcloud deploy 命令的更多信息,请参阅 Director 安装和使用指南中的使用 CLI 工具创建 Overcloud

2.2.9.2. 创建一致性组

启用一致性组 API 后,您可以开始创建一致性组。

流程

  1. 在仪表板中,选择 Project > Compute > Volumes > Volume Consistency Groups
  2. 单击 Create Consistency Group
  3. 在向导的 Consistency Group Information 选项卡中,输入您的一致性组的名称和描述。然后,指定其 可用区
  4. 您还可以将卷类型添加到一致性组中。当您在一致性组中创建卷时,块存储服务将从这些卷类型应用兼容的设置。要添加卷类型,请点击所有可用卷类型列表中的 + 按钮。
  5. 单击 Create Consistency Group。它会出现在 Volume Consistency Groups 表中。

2.2.9.3. 管理一致性组

流程

  1. 可选:您可以通过从 Action 列中选择 Edit Consistency Group 来更改一致性组的名称或描述。
  2. 要直接从一致性组中添加或删除卷,请在仪表板中以 admin 用户身份选择 Project > Compute > Volumes > Volume Consistency Groups
  3. 查找您要配置的一致性组。在该一致性组的 Actions 列中,选择 Manage Volumes。这将启动 Add/Remove Consistency Group Volumes 向导。

    1. 要将卷添加到一致性组中,请单击 All available volumes 列表中的 + 按钮。
    2. 要从一致性组中删除卷,请单击 Selected volumes 列表中的 - 按钮。
  4. 单击 Edit Consistency Group

2.2.9.4. 创建和管理一致性组快照

将卷添加到一致性组后,您现在可以从其中创建快照。

流程

  1. 在托管 openstack-cinder-api 的节点上,以 admin 用户身份登录,输入:

    # export OS_VOLUME_API_VERSION=2

    这会将客户端配置为使用 openstack-cinder-api 的版本 2

  2. 列出所有可用的一致性组及其对应 ID:

    # cinder consisgroup-list
  3. 使用一致性组创建快照:

    # cinder cgsnapshot-create --name <CGSNAPNAME> --description "<DESCRIPTION>" <CGNAMEID>

    替换:

    • <CGSNAPNAME > 带有快照名称(可选)。
    • <DESCRIPTION > 带有快照的描述(可选)。
    • <CGNAMEID> 带有一致性组的名称或 ID。
  4. 显示所有可用一致性组快照的列表:

    # cinder cgsnapshot-list

2.2.9.5. 克隆一致性组

您还可以使用一致性组同时创建整个预配置的卷。您可以通过克隆现有的一致性组或恢复一致性组快照来完成此操作。两个进程都使用相同的命令。

流程

  1. 克隆现有的一致性组:

    # cinder consisgroup-create-from-src --source-cg <CGNAMEID> --name <CGNAME> --description "<DESCRIPTION>"

    替换:

    • <CGNAMEID > 是您要克隆的一致性组的名称或 ID。
    • <CGNAME > 是一致性组的名称(可选)。
    • <DESCRIPTION > 是一致性组的描述(可选)。
  2. 从一致性组快照创建一致性组:

    # cinder consisgroup-create-from-src --cgsnapshot <CGSNAPNAME> --name <CGNAME> --description "<DESCRIPTION>

    将 < CGSNAPNAME > 替换为您要用于创建一致性组的快照的名称或 ID。

2.3. 基本卷使用和配置

以下流程描述了如何执行基本的最终用户卷管理。这些流程不需要管理特权。

重要

您必须在使用块存储服务(cinder)和光纤通道(FC)后端的任何部署中,在所有 Controller 节点和 Compute 节点上安装主机总线适配器(HBA)。

2.3.1. 创建一个卷

重要

您可以为项目创建的默认最大卷数量为 10。

流程

  1. 在控制面板中,选择 Project > Compute > Volumes
  2. Create Volume,并编辑以下字段:

    字段描述

    卷名称

    卷的名称。

    描述

    可选,卷的简短描述。

    类型

    可选卷类型(请参阅 第 2.2.2 节 “使用卷类型的组卷设置”)。

    如果您有多个块存储后端,则可以使用它来选择特定的后端。请参阅 第 2.3.2 节 “为卷创建指定后端”

    大小(GB)

    卷大小(以 GB 为单位)。如果要从未加密的镜像创建加密卷,您必须确保卷大小至少大于镜像大小,以便加密数据不会截断卷数据。

    可用性区域

    可用性区域(逻辑服务器组)以及主机聚合是隔离 OpenStack 中资源的常用方法。可用区在安装过程中定义。有关可用区和主机聚合的更多信息,请参阅创建和管理主机聚合

  3. 指定 卷源

    描述

    没有源的空卷

    卷为空,不包含文件系统或分区表。

    Snapshot

    使用现有快照作为卷源。如果选择了这个选项,则会打开一个新的 Use snapshot 作为 源列表 ; 您可以从列表中选择一个快照。如果要从加密卷快照创建新卷,您必须确保新卷至少大于旧卷。有关卷快照的详情,请参考 第 2.3.10 节 “创建、使用或删除卷快照”

    Image

    使用现有镜像作为卷源。如果选择了这个选项,则会打开一个新的 Use snapshot 作为 源列表 ; 您可以从列表中选择一个镜像。

    使用现有卷作为卷源。如果选择了这个选项,则会打开一个新的 Use snapshot 作为 源列表;您可以从列表中选择一个卷。

  4. 创建卷。创建卷后,其名称将显示在 Volumes 表中。

您还可以稍后更改卷类型。更多信息请参阅 第 2.3.16 节 “卷重新处理”

2.3.2. 为卷创建指定后端

每当配置了多个 Block Storage (cinder)后端时,您还必须为每个后端创建一个卷类型。然后,您可以使用类型来指定用于创建卷的后端。有关卷类型的详情,请参考 第 2.2.2 节 “使用卷类型的组卷设置”

要在创建卷时指定后端,请从 Type 列表中选择其对应的卷类型(请参阅 第 2.3.1 节 “创建一个卷”)。

如果您没有在卷创建过程中指定后端,块存储服务会自动为您选择一个后端。默认情况下,该服务使用最多可用空间选择后端。您还可以配置块存储服务,以便在所有可用后端中随机选择。更多信息请参阅 第 2.2.7 节 “配置卷如何分配为多个后端”

2.3.3. 编辑卷名称或描述

  1. 在控制面板中,选择 Project > Compute > Volumes
  2. 选择卷的 编辑卷 按钮。
  3. 根据需要编辑卷名称或描述。
  4. Edit Volume 保存您的更改。
注意

要创建加密卷,您必须首先为卷加密配置了卷类型。另外,您必须配置 Compute 和 Block Storage 服务,以使用相同的静态密钥。有关如何为卷加密设置要求的详情,请参考 第 2.2.6 节 “配置卷加密”

2.3.4. 重新调整(扩展)卷的大小

注意

支持调整使用中的卷大小,但取决于驱动程序。RBD 支持。您不能扩展使用多重附加卷。有关支持这个功能的更多信息,请联系红帽支持。

  1. 列出卷以检索您要扩展的卷 ID:

    $ cinder list
  2. 要重新定义卷的大小,请运行以下命令来指定正确的 API 微版本,然后将卷 ID 和新大小(大于旧大小的值)作为参数传递:

    $ OS_VOLUME_API_VERSION=<API microversion>
    $ cinder extend <volume ID> <size>

    将 <API_microversion>, <volume_ID>, 和 <size> 替换为适当的值,例如:

    $ OS_VOLUME_API_VERSION=3.42
    $ cinder extend 573e024d-5235-49ce-8332-be1576d323f8 10

2.3.5. 删除卷

  1. 在控制面板中,选择 Project > Compute > Volumes
  2. Volumes 表中,选择要删除的卷。
  3. 删除卷
注意

如果卷有现有的快照,则无法删除它。有关如何删除快照的步骤,请参考 第 2.3.10 节 “创建、使用或删除卷快照”

2.3.6. 将卷附加到实例

实例可以将卷用于持久存储。卷一次只能附加到一个实例。如需更多信息,请参阅 创建和管理实例 指南中的 将卷附加到实例

2.3.6.1. 将卷附加到实例

  1. 在控制面板中,选择 Project > Compute > Volumes
  2. 选择 Edit Attachments 操作。如果卷没有附加到实例,则可以看到 Attach To Instance 下拉列表。
  3. Attach To Instance 列表中,选择要将卷附加到的实例。
  4. 单击 Attach Volume

2.3.6.2. 从实例分离卷

  1. 在控制面板中,选择 Project > Compute > Volumes
  2. 选择卷的 Manage Attachments 操作。如果卷附加到实例,实例的名称将显示在 Attachments 表中。
  3. 单击此中的 Detach Volume,然后单击下一个对话框屏幕。

2.3.7. 将卷附加到多个实例

卷多重附加可让多个实例同时对块存储卷进行读/写访问。支持 Ceph RBD 驱动程序。

警告

您必须使用多附件或集群感知的文件系统来管理来自多个实例的写入操作。如果不这样做,会导致数据崩溃。

多附加卷的限制

  • Block Storage (cinder)后端必须支持多附加卷。有关支持的后端的详情,请联系红帽支持。
  • 您的 Block Storage (cinder)驱动程序必须支持多附加卷。联系红帽支持,以验证您的厂商插件是否支持 multi-attach。有关厂商插件认证的更多信息,请参阅以下位置:

  • 不支持只读多附件卷。
  • 多附加卷的实时迁移不可用。
  • 不支持对多重附加卷的加密。
  • Bare Metal Provisioning 服务(ironic) virt 驱动程序不支持 multi-attach 卷。只有在 libvirt virt 驱动程序才支持 multi-attach 卷。
  • 您不能将附加的卷从 multi-attach 类型重新输入到非附加类型,您无法将非 multi-attach 类型重新输入到 multi-attach 类型。
  • 在附加的卷迁移过程中,您无法使用多个读写附加作为源或目标卷的多附件。
  • 您不能将多附件卷附加到 shelved 卸载的实例。

2.3.7.1. 创建多附加卷类型

要将卷附加到多个实例,请在卷额外规格中将 multiattach 标志设置为 & lt;is> True。当您创建 multi-attach 卷类型时,卷将继承 标记并成为多附件卷。

注意

默认情况下,创建新卷类型是一个仅限管理员的操作。

流程

  1. 运行以下命令来创建 multi-attach 卷类型:

    $ cinder type-create multiattach
    $ cinder type-key multiattach set multiattach="<is> True"
    注意

    此流程在支持 multiattach 的任何后端中创建卷。因此,如果支持 multiattach 的两个后端,调度程序会根据创建时的可用空间决定要使用的后端。

  2. 运行以下命令来指定后端:

    $ cinder type-key multiattach set volume_backend_name=<backend_name>

2.3.7.2. 卷重新处理

您可以重新键入卷,使其能够多重附加,或者重新输入支持多重附加的卷,使其能够附加到多个实例。但是,您只能在不使用时重新键入卷,其状态为 可用

当您附加一个多附件卷时,一些虚拟机监控程序需要特殊考虑,比如当您禁用缓存时。目前,无法安全地更新附加的卷,同时保留整个卷。如果您试图重新输入附加到多个实例的卷,则重新处理会失败。

2.3.7.3. 创建一个多附件卷

创建 multi-attach 卷类型后,创建一个 multi-attach 卷。

流程

  1. 运行以下命令来创建 multi-attach 卷:

    $ cinder create <volume_size> --name <volume_name> --volume-type multiattach
  2. 运行以下命令,以验证卷是否能够多重附加。如果卷可以 multi-attach,则 multiattach 字段等于 True

    $ cinder show <vol_id> | grep multiattach
    
    | multiattach | True |

现在,您可以将卷附加到多个实例。有关如何将卷附加到实例的详情,请参考 将卷附加到实例

2.3.7.4. 支持的后端

块存储后端必须支持 multi-attach。有关支持的后端的详情,请联系红帽支持。

2.3.8. 只读卷

卷可以被标记为只读,以防止其数据被意外覆盖或删除。要做到这一点,使用以下命令将卷设置为只读:

# cinder readonly-mode-update <VOLUME-ID> true

要将只读卷设置为读写,请运行:

# cinder readonly-mode-update <VOLUME-ID> false

2.3.9. 更改卷所有者

要更改卷的所有者,您必须执行卷转让。卷转让由卷所有者启动,在新所有者接受转让后,所有权的更改已完成。

2.3.9.1. 从命令行转让卷

  1. 以卷的当前所有者身份登录。
  2. 列出可用的卷:

    # cinder list
  3. 启动卷转让:

    # cinder transfer-create VOLUME

    其中 VOLUME 是您要传输的卷的名称或 ID。例如,

      +------------+--------------------------------------+
      |  Property  |                Value                 |
      +------------+--------------------------------------+
      |  auth_key  |           f03bf51ce7ead189           |
      | created_at |      2014-12-08T03:46:31.884066      |
      |     id     | 3f5dc551-c675-4205-a13a-d30f88527490 |
      |    name    |                 None                 |
      | volume_id  | bcf7d015-4843-464c-880d-7376851ca728 |
      +------------+--------------------------------------+

    cinder transfer-create 命令清除卷的所有权,并为转让创建一个 idauth_key。这些值可以被指定为,供另一个用户用来接受转让,并成为卷的新所有者。

  4. 新用户现在可以声明卷的所有权。要做到这一点,用户应首先从命令行登录并运行:

    # cinder transfer-accept TRANSFERID TRANSFERKEY

    其中 TRANSFERIDTRANSFERKEYcinder transfer-create 命令返回的 idauth_key 值。例如,

    # cinder transfer-accept 3f5dc551-c675-4205-a13a-d30f88527490 f03bf51ce7ead189
注意

您可以使用以下方法查看所有可用卷传输:

# cinder transfer-list

2.3.9.2. 使用仪表板转让卷

从仪表板创建卷转让

  1. 在仪表板中作为卷所有者,选择 Projects > Volumes
  2. 在要转让的卷的 Actions 列中,选择 Create Transfer
  3. Create Transfer 对话框中,输入转让的名称,再单击 Create Volume Transfer

    卷转让已创建,在 Volume Transfer 屏幕中,您可以捕获发送到接收者项目的 转让 ID 和授权密钥

    Download transfer credentials 按钮下载一个 .txt 文件,它包括了 transfer name, transfer ID, 和 authorization key

    注意

    授权密钥仅在 Volume Transfer 屏幕中提供。如果丢失了授权密钥,您必须取消转让并创建另一个传输来生成新的授权密钥。

  4. 关闭 Volume Transfer 屏幕,以返回到卷列表。

    卷状态会变为 awaiting-transfer,直到接收者项目接受转让为止

从仪表板接受卷转让

  1. 在仪表板中作为接收者项目所有者,选择 Projects > Volumes
  2. 单击 Accept Transfer
  3. Accept Volume Transfer 对话框中,输入您从卷所有者接收的 转让 ID 和授权密钥,然后单击 Accept Volume Transfer

    卷现在出现在活动项目的卷列表中。

2.3.10. 创建、使用或删除卷快照

您可以通过创建卷快照来保留卷在特定时间点的状态。然后,您可以使用快照克隆新卷。

注意

卷备份与快照不同。备份保留卷中包含的数据,而快照会在特定时间点保留卷的状态。如果卷有现有的快照,则无法删除卷。卷备份可防止数据丢失,而快照则有助于克隆。

因此,快照后端通常与卷后端在一起,以便在克隆过程中最小化延迟。相反,备份存储库通常位于不同的位置,例如在典型的企业部署中在不同节点、物理存储甚至地理位置。这是为了防止备份存储库不受卷后端可能出现的任何损坏的影响。

有关卷备份的更多信息,请参阅 块存储备份指南

创建卷快照:

  1. 在控制面板中,选择 Project > Compute > Volumes
  2. 选择目标卷的 Create Snapshot 操作。
  3. 快照 提供快照名称,再单击 创建卷快照卷快照 选项卡显示所有快照。

当新卷出现在 Volume Snapshots 表中时,您可以从快照克隆新卷。选择快照的 Create Volume 操作。有关卷创建的更多信息,请参阅 第 2.3.1 节 “创建一个卷”

重要

如果要从加密卷快照创建新卷,您必须确保新卷至少大于旧卷。

要删除快照,请选择其 Delete Volume Snapshot 操作。

如果您的 OpenStack 部署使用 Red Hat Ceph 后端,请参阅 第 2.3.10.1 节 “Red Hat Ceph Storage 后端中的保护和未保护的快照” 以了解有关快照安全和故障排除的更多信息。

注意

对于从快照创建的块存储服务(cinder)的 RADOS 块设备(RBD)卷,您可以使用 CinderRbdFlattenVolumeFromSnapshot heat 参数扁平化和删除对快照的依赖项。当您将 CinderRbdFlattenVolumeFromSnapshot 设置为 true 时,块存储服务扁平化 RBD 卷,并删除对快照的依赖项,同时扁平化所有未来的快照。默认值为 false,这也是 cinder RBD 驱动程序的默认值。

请注意,扁平化快照会删除与父级共享任何潜在的块,并在后端上产生更大的快照大小,并增加快照创建时间。

2.3.10.1. Red Hat Ceph Storage 后端中的保护和未保护的快照

在将 Red Hat Ceph Storage 用作 OpenStack 部署的后端时,您可以在后端中将快照设置为 protected。尝试通过 OpenStack 删除受保护的快照(如通过控制面板或 cinder snapshot-delete 命令)将失败。

发生这种情况时,首先在 Red Hat Ceph 后端将快照设置为 unprotected。之后,您应能够正常通过 OpenStack 删除快照。

有关更多信息,请参阅 Red Hat Ceph Storage 块设备指南中的以下链接

2.3.11. 使用快照恢复到卷的最后一个状态

您可以恢复卷的最新快照。这意味着,您可以对卷数据进行原位升级到其最新的快照。

警告
支持恢复卷的最新快照,但取决于驱动程序。这个功能的正确实现是驱动程序辅助的。有关支持这个功能的更多信息,请联系您的驱动程序厂商。

限制

  • 在多附加卷中使用恢复到快照功能可能会有限制。在使用此功能前,检查是否应用了这些限制。
  • 在进行快照后,您无法恢复调整(扩展)的卷。
  • 您不能在附加或正在使用的卷中使用 restore-to-snapshot 功能。

前提条件

  • Block Storage (cinder) API 微版本 3.40 或更高版本。
  • 您必须至少为卷创建了一个快照。

流程

  1. stack 用户身份登录 undercloud。
  2. 获取 overcloudrc 文件:

    [stack@undercloud ~] $ source overcloudrc
  3. 分离卷:

    $ nova volume-detach <instance_id> <vol_id>

    将 <instance_id> 和 <vol_id> 替换为您要恢复的实例和卷的 ID。

  4. 找到您要恢复的快照的 ID 或名称。您只能恢复最新的快照。

    $ cinder snapshot-list
  5. 恢复快照:

    $ cinder --os-volume-api-version=3.40 revert-to-snapshot  <snapshot_id or snapshot_name>

    将 <snapshot_id 或 snapshot_name> 替换为 ID 或快照的名称。

  6. 可选: 您可以使用 cinder snapshot-list 命令检查您要恢复的卷是否处于恢复状态。

    $  cinder snapshot-list
  7. 重新附加卷:

    $  nova volume-attach <instance_id> <vol_id>

    将 <instance_id> 和 <vol_id> 替换为您恢复的实例和卷的 ID。

2.3.11.1. 验证您的恢复是否成功

流程

  • 要检查流程是否成功,您可以使用 cinder list 命令验证您恢复的卷现在是否处于 available 状态。

    $ cinder list
    备注
    如果您使用 Block Storage (cinder)作为可引导的根卷,则无法在该卷上使用 restore-to-snapshot 功能,因为它没有处于 available 状态。要使用这个功能,实例必须使用 delete_on_termination=false (默认)属性引导,以便在实例终止时保留引导卷。当您要恢复到快照时,您必须首先删除初始实例,以便卷可用。然后,您可以恢复它并从卷创建新实例。

2.3.12. 将卷上传到镜像服务

您可以将现有卷作为镜像直接上传到镜像服务。要做到这一点:

  1. 在控制面板中,选择 Project > Compute > Volumes
  2. 选择目标卷的 Upload to Image 操作。
  3. 为卷提供 Image Name,并从列表中选择 Disk Format
  4. Upload

要查看上传的镜像,请选择 Project > Compute > Images。新镜像会出现在 Images 表中。有关如何使用和配置镜像的详情,请参考 创建和管理镜像指南中的管理镜像https://access.redhat.com/documentation/zh-cn/red_hat_openstack_platform/16.1/html/creating_and_managing_images/ch-image-service#section-manage_images

2.3.13. 在后端之间移动卷

将卷从一个存储后端移动到另一个存储后端有很多原因,例如:

  • 停用不再支持的存储系统。
  • 更改卷的存储类或层。
  • 更改卷的可用区。

使用 Block Storage 服务(cinder),您可以使用以下方法在后端间移动卷:

  • retype :默认策略允许卷所有者和管理员重新输入卷。retype 操作是在后端之间移动卷的最常见方法。
  • migrate :默认策略仅允许管理员迁移卷。为特定的用例保留卷迁移,因为它受到限制,需要明确了解部署如何工作。如需更多信息,请参阅 迁移卷

限制

红帽支持在可用区内和跨可用区(AZ)间移动卷,但有以下限制:

  • 卷必须具有 available 或 in-use 状态才能移动。
  • 对使用中的卷的支持取决于驱动程序。
  • 卷不能有快照。
  • 卷不能属于组或一致性组。

2.3.14. 移动可用卷

您可以在所有后端之间移动可用卷,但性能取决于您使用的后端。许多后端支持协助的迁移。有关协助迁移的后端支持的更多信息,请联系供应商。

支持的迁移可用于卷重新类型和卷迁移。通过协助的迁移,后端可以优化将数据从源后端迁移到目标后端,但两个后端都必须来自同一供应商。

注意

红帽只支持带有多池后端的后端辅助迁移,或者在将 cinder migrate 操作用于单池后端时,如 RBD。

2.3.14.1. 通用卷迁移

当无法支持在后端之间进行迁移时,块存储服务会执行通用卷迁移。

通用卷迁移要求在 Block Storage (cinder)服务将数据从源卷移动到 Controller 节点前连接两个后端的卷,并从 Controller 节点移到目标卷。无论源和目标后端中的存储类型如何,块存储服务都会无缝执行这个过程。

重要

在执行通用卷迁移前,请确保您有足够的带宽。通用卷迁移的持续时间与卷的大小直接成比例,从而使操作比支持的迁移要慢。

2.3.15. 移动使用的卷

没有可用于移动使用的卷的优化或辅助选项。当您移动使用的卷时,计算服务(nova)必须使用虚拟机监控程序将数据从源后端中的卷传输到目标后端的卷。这需要与运行卷正在使用的实例的虚拟机监控程序协调。

块存储服务(cinder)和计算服务协同工作,以执行此操作。Compute 服务管理大多数工作,因为数据通过 Compute 节点从一个卷复制到另一个卷。

重要

在移动使用卷前,请确保您有足够的带宽。此操作的持续时间与卷的大小直接成比例,从而使操作比支持的迁移要慢。

限制

  • 当卷附加到多个 nova 实例时,它们不会被移动。
  • 不支持非块设备,将目标后端上的存储协议限制为 iSCSI、光纤通道(FC)或 RBD。

2.3.16. 卷重新处理

卷重新调整是将卷从一个后端移动到另一个后端的标准方法。该操作要求管理员为不同的后端定义适当的卷类型。默认策略允许卷所有者和管理员重新键入卷。

当您重新输入卷时,您可以将卷类型及其设置应用到已存在的卷。有关卷类型的详情,请参考 第 2.2.2 节 “使用卷类型的组卷设置”

您可以重新键入新卷类型的额外规格可以应用到现有卷的卷。您可以重新键入卷,以将预定义的设置或存储属性应用到现有卷,例如:

  • 将卷移动到不同的后端。
  • 更改卷的存储类或层。
  • 启用或禁用复制等功能。

重新调整卷不一定意味着您必须将卷从一个后端移到另一个后端。然而,在有些情况下,您必须移动卷才能完成重新输入:

  • 新卷类型定义了不同的 volume_backend_name
  • 当前卷类型的 volume_backend_name 未定义,该卷存储在新卷类型的 volume_backend_name 指定的后端上。

将卷从一个后端移动到另一个后端可能需要大量时间和资源。因此,当重新类型需要移动数据时,块存储服务默认不会移动数据。除非将迁移策略指定为 retype 请求的一部分,否则操作会失败。更多信息请参阅 第 2.3.16.2 节 “从命令行重新定义卷”

限制

  • 您不能重新输入所有卷。有关在后端之间移动卷的详情,请参考 第 2.3.13 节 “在后端之间移动卷”
  • 您不能将未加密的卷重新输入为加密卷类型,但您可以重新键入加密的卷来未加密的。
  • 没有管理特权的用户只能重新键入他们拥有的卷。

2.3.16.1. 从仪表板 UI 重新获取卷

使用仪表板 UI 重新输入卷。

重要

不支持将未加密的卷重新设置为相同大小的加密卷,因为加密卷需要额外的空间来存储加密数据。有关加密未加密的卷的更多信息,请参阅 加密未加密的卷

先决条件

流程

  1. 在控制面板中,选择 Project > Compute > Volumes
  2. 在您要迁移的卷的 Actions 列中,选择 Change Volume Type
  3. Change Volume Type 对话框中,选择目标卷类型并从 Type 列表中定义新后端。
  4. 如果要将卷迁移到另一个后端,请从 Migration Policy 列表中选择 On Demand。更多信息请参阅 第 2.3.13 节 “在后端之间移动卷”
  5. Change Volume Type 开始迁移。

2.3.16.2. 从命令行重新定义卷

与仪表板 UI 过程类似,您可以从命令行重新输入卷。

重要

不支持将未加密的卷重新设置为相同大小的加密卷,因为加密卷需要额外的空间来存储加密数据。有关加密未加密的卷的更多信息,请参阅 加密未加密的卷

先决条件

流程

  1. 输入以下命令重新输入卷:

    $ cinder retype <volume id> <new volume type name>
  2. 如果重新类型操作需要将卷从一个后端移到另一个后端,则块存储服务需要特定的标记:

    $ cinder retype --migration-policy on-demand <volume id> <new volume type name>
    注意

    当重新类型操作进行时,卷状态会更改为 retyping

  3. 输入以下命令并查看 volume_type 字段,以确认重新类型操作成功。volume_type 字段显示新卷类型。

    $ cinder show <volume id>
    注意

    当您启动重新类型操作时,卷名称会被重复。如果您输入了带有卷名称的 cinder show 命令,cinder 客户端将返回与 ERROR: Multiple volume match found for '<volume name>' 的错误。要避免这个错误,请使用卷 ID。

2.3.17. 在 overcloud 节点上启用 LVM2 过滤

如果您使用带有某些块存储服务(cinder)后端的 LVM2 (逻辑卷管理)卷,您在 Red Hat OpenStack Platform (RHOSP)客户机中创建的卷可能会在主机 cinder-volumenova-compute 容器的 overcloud 节点上可见。在这种情况下,主机上的 LVM2 工具扫描 OpenStack 客户机创建的 LVM2 卷,这可能会在 Compute 或 Controller 节点上产生一个或多个问题:

  • LVM 似乎查看客户机中的卷组
  • LVM 报告重复的卷组名称
  • 卷分离失败,因为 LVM 正在访问存储
  • 由于 LVM 存在问题,客户机无法引导
  • 因为缺少实际存在的磁盘,客户机机器上的 LVM 处于部分状态
  • 在具有 LVM 的设备中,块存储服务(cinder)操作会失败
  • 块存储服务(cinder)快照无法正确删除
  • 实时迁移过程中出现错误: /etc/multipath.conf 不存在

要防止这种错误扫描,并从主机节点隔离客户机 LVM2 卷,您可以在部署或更新 overcloud 时使用 LVMFilterEnabled heat 参数启用和配置过滤器。这个过滤器从托管活跃 LVM2 卷的物理设备列表中计算。您还可以使用 LVMFilterAllowlistLVMFilterDenylist 参数明确允许或拒绝块设备。您可以在全局范围内、针对特定节点角色或特定设备应用此过滤。

注意

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

先决条件

流程

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

    $ source ~/stackrc
  3. 创建新的环境文件,或修改现有的环境文件。在本例中,创建新文件 lvm2-filtering.yaml

    $ touch ~/lvm2-filtering.yaml
  4. 在环境文件中包含以下参数:

    parameter_defaults:
      LVMFilterEnabled: true

    您可以进一步自定义 LVM2 过滤器的实现。例如,要只在 Compute 节点上启用过滤,请使用以下配置:

    parameter_defaults:
      ComputeParameters:
        LVMFilterEnabled: true

    这些参数还支持正则表达式。要只在 Compute 节点上启用过滤,并忽略所有以 /dev/sd 开头的设备,请使用以下配置:

    parameter_defaults:
      ComputeParameters:
        LVMFilterEnabled: true
        LVMFilterDenylist:
          - /dev/sd.*
  5. 运行 openstack overcloud deploy 命令,并包含包含 LVM2 过滤配置的环境文件,以及与 overcloud 部署相关的任何其他环境文件:

    $ openstack overcloud deploy --templates \
    <environment-files> \
    -e lvm2-filtering.yaml

2.4. 高级卷配置

以下流程描述了如何执行高级卷管理步骤。

重要

您必须在使用块存储服务(cinder)和光纤通道(FC)后端的任何部署中,在所有 Controller 节点和 Compute 节点上安装主机总线适配器(HBA)。

2.4.1. 迁移卷

使用 Block Storage 服务(cinder),您可以在可用区和跨可用区(AZ)之间迁移卷。这是将卷从一个后端移到另一个后端的最常用方法。默认策略仅允许管理员迁移卷。不要更改默认策略。

在高度自定义部署或必须停用存储系统的情况下,管理员可以迁移卷。在这两种用例中,多个存储系统共享相同的 volume_backend_name,或者未定义。

限制

  • 无法复制卷。
  • 目标后端必须与卷的当前后端不同。
  • 现有卷类型必须对新后端有效,这意味着必须满足以下条件:

    • 卷类型不能在其额外 specs 中定义 backend_volume_name,或者两个块存储后端都必须使用相同的 backend_volume_name 配置。
    • 两个后端都必须支持卷类型中配置的相同功能,如支持精简配置、密集置备或其他功能配置。
注意

将卷从一个后端移动到另一个后端可能需要大量时间和资源。更多信息请参阅 第 2.3.13 节 “在后端之间移动卷”

2.4.1.1. 在后端之间迁移

使用仪表板 UI 在后端之间迁移卷。

流程

  1. 在控制面板中,选择 Admin > Volumes
  2. 在您要迁移的卷的 Actions 列中,选择 Migrate Volume
  3. Migrate Volume 对话框中,从 Destination Host 下拉列表中选择目标主机。

    注意

    要绕过主机迁移的任何驱动程序优化,请选择 Force Host Copy 复选框。

  4. Migrate 开始迁移。

2.4.1.2. 从命令行在后端之间迁移

流程

  1. 输入以下命令来检索目标后端的名称:

    $ cinder get-pools --detail
    
    Property                      | Value
    
    ...
    
    | name                        | localdomain@lvmdriver-1#lvmdriver-1
    | pool_name                   | lvmdriver-1
    
    ...
    
    | volume_backend_name         | lvmdriver-1
    
    ...
    
    Property                      | Value
    
    ...
                                                          |
    | name                        | localdomain@lvmdriver-2#lvmdriver-1
    | pool_name                   | lvmdriver-1
    
    ...
    
    | volume_backend_name         | lvmdriver-1
    
    ...

    后端名称的格式是 host@volume_backend_name#pool

    在示例输出中,块存储服务中有两个 LVM 后端:localdomain@lvmdriver-1#lvmdriver-1localdomain@lvmdriver-2#lvmdriver-1。请注意,两个后端都共享相同的 volume_backend_name,lvmdriver-1

    注意

    使用 LVM 只适用于。在生产环境中不支持 LVM。

  2. 输入以下命令将卷从一个后端迁移到另一个后端:

    $ cinder migrate <volume id or name> <new host>

2.4.1.3. 验证卷迁移

当您创建卷时,migration_status 值等于 None。当您启动 迁移时,状态会更改为迁移。迁移完成后,状态会更改为 successerror

在块存储服务接受迁移请求后,cinder 客户端会以 Request to migrate volume <volume id> 类似的消息进行响应。但是,迁移需要时间完成。作为管理员,您可以验证迁移的状态。

流程

  1. 输入以下命令并查看 migration_status 字段:

    $ cinder show <volume id>
    注意

    当您启动通用卷迁移时,卷名称会被重复。如果您输入了带有卷名称的 cinder show 命令,cinder 客户端会返回一个类似于 ERROR: Multiple volume match found for '<volume name>' 的错误。要避免这个错误,请使用卷 ID。

迁移成功后,host 字段与 cinder migrate 命令中设置的 &lt ;new host > 值匹配。

2.4.2. 加密未加密的卷

要加密未加密的卷,您必须备份未加密的卷,然后将其恢复到新的加密卷,或者从未加密卷创建镜像服务(glance)镜像,然后从镜像创建一个新的加密卷。

前提条件

  • 要加密的未加密的卷。

流程

  1. 如果 cinder-backup 服务可用,备份当前未加密的卷:

    $ cinder backup-create <unencrypted_volume>
    • <unencrypted_volume > 替换为未加密的卷的名称或 ID。
  2. 创建新加密卷:

    $ cinder create <encrypted_volume_size> --volume-type <encrypted_volume_type>
    • <encrypted_volume_size > 替换为新卷的大小(以 GB 为单位)。这个值必须于未加密卷的大 1 GB,以便容纳加密元数据。
    • <encrypted_volume_type > 替换为您需要的加密类型。
  3. 将未加密的卷的备份恢复到新的加密卷:

    $ cinder backup-restore <backup> --volume <encrypted_volume>
    • <backup > 替换为未加密的卷备份的名称或 ID。
    • <encrypted_volume > 替换为新加密卷的 ID。

如果 cinder-backup 服务不可用,请使用 upload-to-image 命令创建未加密的卷的镜像,然后从镜像创建一个新的加密卷。

  1. 创建未加密的卷的镜像服务镜像:

    $ cinder upload-to-image <unencrypted_volume> <new_image>
    • <unencrypted_volume > 替换为未加密的卷的名称或 ID。
    • <new_image > 替换为新镜像的名称。
  2. 从比镜像大 1 GB 的镜像创建一个新卷:

    $ cinder volume create --size <size> --volume-type luks --image <new_image> <encrypted_volume_name>
    • < size> 替换为新卷的大小。这个值必须比旧的未加密的卷大 1GB。
    • <new_image > 替换为您从未加密的卷创建的镜像的名称。
    • <encrypted_volume_name > 替换为新加密卷的名称。

2.5. 多路径配置

使用多路径将服务器节点和存储阵列间的多个 I/O 路径配置为单一设备,以创建冗余并提高性能。您可以在新的和现有的 overcloud 部署中配置多路径。

图描述了使用 cinder 多路径 I/O 配置的 Red Hat OpenStack Platform 部署的逻辑输入/输出数据路径

2.5.1. 在新部署中配置多路径

完成此流程,以在新的 overcloud 部署中配置多路径。

有关如何在现有 overcloud 部署中配置多路径的详情,请参考 第 2.5.2 节 “在现有部署中配置多路径”

前提条件

overcloud Controller 和 Compute 节点必须有权访问 Red Hat Enterprise Linux 服务器存储库。如需更多信息,请参阅 Director 安装和使用指南中的下载基本云镜像

流程

  1. 配置 overcloud。

    注意

    有关更多信息,请参阅 Director 安装和使用指南中的使用 CLI 工具配置基本的 overcloud

  2. 更新 heat 模板以启用多路径:

    parameter_defaults:
      NovaLibvirtVolumeUseMultipath:  true
      NovaComputeOptVolumes:
        - /etc/multipath.conf:/etc/multipath.conf:ro
        - /etc/multipath/:/etc/multipath/:rw
      CinderVolumeOptVolumes:
        - /etc/multipath.conf:/etc/multipath.conf:ro
        - /etc/multipath/:/etc/multipath/:rw
  3. 可选:如果您使用 Block Storage (cinder)作为镜像服务(glance)后端,还必须完成以下步骤:

    1. 将以下 GlanceApiOptVolumes 配置添加到 heat 模板中:

      parameter_defaults:
        GlanceApiOptVolumes:
          - /etc/multipath.conf:/etc/multipath.conf:ro
          - /etc/multipath/:/etc/multipath/:rw
    2. 使用以下方法设置 ControllerExtraConfig 参数:

      parameter_defaults:
        ControllerExtraConfig:
          glance::config::api_config:
            default_backend/cinder_use_multipath:
              value: true
      备注
      确保 default_backendGlanceBackendID heat 模板默认值都匹配。
  4. 对于每个配置的后端,将 use_multipath_for_image_xfer 设置为 true

    parameter_defaults:
      ExtraConfig:
        cinder::config::cinder_config:
          <backend>/use_multipath_for_image_xfer:
            value: true
  5. 部署 overcloud:

    $ openstack overcloud deploy
    注意

    有关使用 overcloud 参数创建 overcloud 的详情,请参考 Director 安装和使用指南中的使用 CLI 工具创建 Overcloud

  6. 在容器运行前,在所有 Controller 和 Compute 节点上安装多路径:

    $ sudo dnf install -y device-mapper-multipath
    注意

    director 提供了一组 hook,以便在第一次引导完成后以及核心配置开始前支持特定节点角色的自定义配置。有关自定义 overcloud 配置的更多信息,请参阅高级 Overcloud 自定义指南中的 Pre-Configuration: 自定义特定 Overcloud 角色

  7. 在所有 Controller 和 Compute 节点上配置 multipath 守护进程:

    $ mpathconf --enable --with_multipathd y --user_friendly_names n --find_multipaths y
    注意

    示例代码创建适用于大多数环境的基本多路径配置。但是,检查您的存储供应商以获得建议,因为有些供应商有特定于硬件的优化配置。有关多路径的更多信息,请参阅配置设备映射器多路径 指南。

  8. 在所有 Controller 和 Compute 节点上运行以下命令以防止分区创建:

    $ sed -i "s/^defaults {/defaults {\n\tskip_kpartx yes\n\trecheck_wwid yes/" /etc/multipath.conf
    注意

    skip_kpartx 设置为 yes 可防止 Compute 节点上的 kpartx 自动在设备上创建分区,这可以防止不必要的设备映射器条目。有关配置属性的更多信息,请参阅配置设备映射器多路径 指南中的 修改 DM-Multipath 配置文件

  9. 在所有 Controller 和 Compute 节点上启动多路径守护进程:

    $ systemctl enable --now multipathd

2.5.2. 在现有部署中配置多路径

在现有部署中配置多路径,以便您的工作负载可以使用多路径功能。

注意

在现有部署中配置多路径后创建的所有新工作负载都是多路径感知。如果您有任何已存在的工作负载,您必须检查并取消缩小实例以便在这些实例上启用多路径。

有关如何在新 overcloud 部署中配置多路径的更多信息,请参阅 第 2.5.1 节 “在新部署中配置多路径”

前提条件

overcloud Controller 和 Compute 节点必须有权访问 Red Hat Enterprise Linux 服务器存储库。如需更多信息,请参阅 Director 安装和使用指南中的下载基本云镜像

流程

  1. 验证所有 Controller 和 Compute 节点上安装多路径:

    $ rpm -qa | grep device-mapper-multipath
    
    device-mapper-multipath-0.4.9-127.el8.x86_64
    device-mapper-multipath-libs-0.4.9-127.el8.x86_64

    如果没有安装多路径,请在所有 Controller 和 Compute 节点上安装它:

    $ sudo dnf install -y device-mapper-multipath
  2. 在所有 Controller 和 Compute 节点上配置 multipath 守护进程:

    $ mpathconf --enable --with_multipathd y --user_friendly_names n --find_multipaths y
    注意

    示例代码创建适用于大多数环境的基本多路径配置。但是,检查您的存储供应商以获得建议,因为有些供应商已针对其硬件优化配置。有关多路径的更多信息,请参阅配置设备映射器多路径 指南。

  3. 在所有 Controller 和 Compute 节点上运行以下命令以防止分区创建:

    $ sed -i "s/^defaults {/defaults {\n\tskip_kpartx yes\n\trecheck_wwid yes/" /etc/multipath.conf
    注意

    skip_kpartx 设置为 yes 可防止 Compute 节点上的 kpartx 自动在设备上创建分区,这可以防止不必要的设备映射器条目。有关配置属性的更多信息,请参阅配置设备映射器多路径 指南中的 修改 DM-Multipath 配置文件

  4. 在所有 Controller 和 Compute 节点上启动多路径守护进程:

    $ systemctl enable --now multipathd
  5. 更新 heat 模板以启用多路径:

    parameter_defaults:
      NovaLibvirtVolumeUseMultipath:  true
      NovaComputeOptVolumes:
        - /etc/multipath.conf:/etc/multipath.conf:ro
        - /etc/multipath/:/etc/multipath/:rw
      CinderVolumeOptVolumes:
        - /etc/multipath.conf:/etc/multipath.conf:ro
        - /etc/multipath/:/etc/multipath/:rw
  6. 可选:如果您使用 Block Storage (cinder)作为镜像服务(glance)后端,还必须完成以下步骤:

    1. 将以下 GlanceApiOptVolumes 配置添加到 heat 模板中:

      parameter_defaults:
        GlanceApiOptVolumes:
          - /etc/multipath.conf:/etc/multipath.conf:ro
          - /etc/multipath/:/etc/multipath/:rw
    2. 使用以下方法设置 ControllerExtraConfig 参数:

      parameter_defaults:
        ControllerExtraConfig:
          glance::config::api_config:
            default_backend/cinder_use_multipath:
              value: true
      备注
      确保 default_backendGlanceBackendID heat 模板默认值都匹配。
  7. 对于每个配置的后端,将 use_multipath_for_image_xfer 设置为 true

    parameter_defaults:
      ExtraConfig:
        cinder::config::cinder_config:
          <backend>/use_multipath_for_image_xfer:
            value: true
  8. 运行以下命令以更新 overcloud:

    $ openstack overcloud deploy
    注意

    当您运行 openstack overcloud deploy 命令来安装和配置多路径时,您必须传递用于部署 overcloud 的所有之前角色和环境文件,如 --templates--roles-file、--e 用于所有环境文件和 --timeout。无法传递所有以前的角色和环境文件可能会导致您的 overcloud 部署出现问题。有关使用 overcloud 参数的更多信息,请参阅 Director 安装和使用指南中的使用 CLI 工具创建 Overcloud

2.5.3. 验证多路径配置

此流程描述了如何在新的或现有 overcloud 部署中验证多路径配置。

流程

  1. 创建虚拟机。
  2. 将非加密卷附加到虚拟机。
  3. 获取包含实例的 Compute 节点的名称:

    $ nova show INSTANCE | grep OS-EXT-SRV-ATTR:host

    INSTANCE 替换为您引导的虚拟机的名称。

  4. 检索实例的 virsh 名称:

    $ nova show INSTANCE | grep instance_name

    INSTANCE 替换为您引导的虚拟机的名称。

  5. 获取 Compute 节点的 IP 地址:

    $ . stackrc
    $ nova list | grep compute_name

    compute_name 替换为 nova show INSTANCE 命令的输出中的名称。

  6. SSH 到运行虚拟机的 Compute 节点:

    $ ssh heat-admin@COMPUTE_NODE_IP

    COMPUTE_NODE_IP 替换为 Compute 节点的 IP 地址。

  7. 登录到运行 virsh 的容器:

    $ podman exec -it nova_libvirt /bin/bash
  8. 在 Compute 节点实例中输入以下命令,以验证它是否在 cinder 卷主机位置中使用多路径:

    virsh domblklist VIRSH_INSTANCE_NAME | grep /dev/dm

    VIRSH_INSTANCE_NAME 替换为 nova show INSTANCE | grep instance_name 命令的输出。

    如果实例显示 /dev/dm- 以外的值,则连接是非多路径,您需要使用 nova shelvenova unshelve 命令刷新连接信息:

    $ nova shelve <instance>
    $ nova unshelve <instance>
    注意

    如果您有多种后端,您必须验证所有后端上的实例和卷,因为每个后端返回的连接信息可能有所不同。

第 3 章 对象存储服务

OpenStack Object Storage (swift)将其对象(数据)存储在容器中,它们与文件系统中目录类似,尽管它们无法嵌套。容器为用户提供了一种简单的方法来存储任何非结构化数据。例如,对象可能包含 photos、文本文件或镜像。存储的对象不会被压缩。

3.1. 对象存储环

对象存储使用名为 Ring 的数据结构来跨集群分布分区空间。这个分区空间是对象存储服务中的数据持久性引擎的核心。它允许对象存储服务快速轻松地在集群间同步每个分区。

Ring 包含有关对象存储分区的信息,以及如何在不同的节点和磁盘间分布分区。当任何对象存储组件与数据交互时,会在环中本地执行快速查找来确定每个对象的可能的分区。

对象存储服务有三个环来存储不同类型的数据:一个用于帐户信息,另一个用于容器(有助于组织帐户下的对象),另一个用于对象副本。

3.1.1. 重新平衡环

当您通过添加或删除存储容量、节点或磁盘来更改对象存储环境时,您必须重新平衡环。您可以运行 openstack overcloud deploy 来重新平衡环,但此方法重新部署整个 overcloud。这很繁琐,特别是当您有大型 overcloud 时。或者,在 undercloud 上运行以下命令以重新平衡环:

source ~/stackrc
ansible-playbook -i /usr/bin/tripleo-ansible-inventory
/usr/share/openstack-tripleo-common/playbooks/swift_ring_rebalance.yaml

3.1.2. 检查集群健康状况

对象存储服务在后台运行多个进程,以确保长期数据可用性、持久性和持久性。例如:

  • 审核员会持续重新读取数据库和对象文件,并使用校验和进行比较,以确保没有静默的位。任何不再匹配其校验和的数据库或对象文件都是 quarantined,且在该节点上不可读取。然后,replicators 复制另一个副本,以便再次提供本地副本。
  • 当您替换磁盘或节点或对象是 quarantined 时,对象和文件可能会消失。当发生这种情况时,replicators 会将缺少的对象或数据库文件复制到其他节点之一。

对象存储服务包含一个名为 swift-recon 的工具,用于从所有节点收集数据并检查整个集群健康状况。

要使用 swift-recon,请登录其中一个控制器节点并运行以下命令:

[root@overcloud-controller-2 ~]# sudo podman exec -it -u swift swift_object_server /usr/bin/swift-recon -arqlT --md5

======================================================================--> Starting reconnaissance on 3 hosts (object)
======================================================================[2018-12-14 14:55:47] Checking async pendings
[async_pending] - No hosts returned valid data.
======================================================================[2018-12-14 14:55:47] Checking on replication
[replication_failure] low: 0, high: 0, avg: 0.0, total: 0, Failed: 0.0%, no_result: 0, reported: 3
[replication_success] low: 0, high: 0, avg: 0.0, total: 0, Failed: 0.0%, no_result: 0, reported: 3
[replication_time] low: 0, high: 0, avg: 0.0, total: 0, Failed: 0.0%, no_result: 0, reported: 3
[replication_attempted] low: 0, high: 0, avg: 0.0, total: 0, Failed: 0.0%, no_result: 0, reported: 3
Oldest completion was 2018-12-14 14:55:39 (7 seconds ago) by 172.16.3.186:6000.
Most recent completion was 2018-12-14 14:55:42 (4 seconds ago) by 172.16.3.174:6000.
======================================================================[2018-12-14 14:55:47] Checking load averages
[5m_load_avg] low: 1, high: 2, avg: 2.1, total: 6, Failed: 0.0%, no_result: 0, reported: 3
[15m_load_avg] low: 2, high: 2, avg: 2.6, total: 7, Failed: 0.0%, no_result: 0, reported: 3
[1m_load_avg] low: 0, high: 0, avg: 0.8, total: 2, Failed: 0.0%, no_result: 0, reported: 3
======================================================================[2018-12-14 14:55:47] Checking ring md5sums
3/3 hosts matched, 0 error[s] while checking hosts.
======================================================================[2018-12-14 14:55:47] Checking swift.conf md5sum
3/3 hosts matched, 0 error[s] while checking hosts.
======================================================================[2018-12-14 14:55:47] Checking quarantine
[quarantined_objects] low: 0, high: 0, avg: 0.0, total: 0, Failed: 0.0%, no_result: 0, reported: 3
[quarantined_accounts] low: 0, high: 0, avg: 0.0, total: 0, Failed: 0.0%, no_result: 0, reported: 3
[quarantined_containers] low: 0, high: 0, avg: 0.0, total: 0, Failed: 0.0%, no_result: 0, reported: 3
======================================================================[2018-12-14 14:55:47] Checking time-sync
3/3 hosts matched, 0 error[s] while checking hosts.
======================================================================
注意

作为替代方案,使用 --all 选项返回其他输出。

此命令查询 ring 上的所有服务器以获取以下数据:

  • async pendings :如果集群负载过高,且进程无法快速更新数据库文件,一些更新会异步进行。这些数字应该会随时间减少。
  • 复制指标 :注意复制时间戳;应经常出现完整复制通过,应该会有一些错误。旧条目(例如,带有 6 个月前的时间戳的条目)表示节点上的复制还没有在最后的六个月内完成。
  • Ring md5sums:这样可确保所有环文件在所有节点上都一致。
  • swift.conf md5sums:这样可确保所有环文件在所有节点上都一致。
  • Quarantined 文件:对于所有节点,应该没有(或很少)四倍的文件。
  • time-sync :所有节点必须同步。

3.1.3. 增加环分区电源

Ring power 决定资源(帐户、容器或对象)映射到的分区。分区包含在资源存储在后端文件系统中的路径中。因此,更改分区电源需要将资源重新定位到后端文件系统中的新路径。

在大量填充的集群中,重新定位过程会非常耗时。为避免停机,在集群仍在运行时重新定位资源。您必须在不临时丢失数据访问或损害进程性能(如复制和审核)的情况下执行此操作。如需增加环分区电源的帮助,请联系红帽支持。

3.1.4. 创建自定义环

随着技术进步和存储容量的增加,创建自定义环是更新现有 Object Storage 集群的方法。

当您向集群添加新节点时,它们的特征可能与原始节点的不同。如果没有自定义调整,新节点的较大的容量可能会使用率不足。或者,如果对环中的权重发生变化,数据分布可能会变得不均匀,这会降低安全性。

自动化可能无法与未来的技术趋势保持同步。例如,现在使用的一些较旧的 Object Storage 集群以前源自在 SSD 可用之前。

在集群不断增长和技术时,ring 构建器有助于管理对象存储。如需创建自定义环的帮助,请联系红帽支持。

3.2. 对象存储服务管理

以下流程描述了如何自定义对象存储服务。

3.2.1. 配置 fast-post

默认情况下,当其元数据的任何部分更改时,对象存储服务都会对对象进行整个复制。您可以使用 fast-post 功能来防止这种情况。当更改多个大型对象的内容类型时,fast-post 功能会节省时间。

要启用 fast-post 功能,请执行以下操作在 Object Storage 代理服务中禁用 object_post_as_copy 选项:

  1. 编辑 swift_params.yaml

    cat > swift_params.yaml << EOF
    parameter_defaults:
        ExtraConfig:
          swift::proxy::copy::object_post_as_copy: False
    EOF
  2. 部署或更新 overcloud 时包含参数文件:

    openstack overcloud deploy [... previous args ...] -e swift_params.yaml

3.2.2. 启用 at-rest 加密

默认情况下,上传到 Object Storage 的对象是未加密的。因此,可以从文件系统中直接访问对象。如果在磁盘被丢弃前没有正确清除磁盘,这可能会带来安全风险。

您可以使用 OpenStack Key Manager (barbican)加密 at-rest swift 对象。如需更多信息,请参阅 加密 at-rest swift 对象

3.2.3. 部署独立对象存储集群

您可以使用可组合角色概念来部署独立 Object Storage (openstack-swift)集群,其最小其他服务(如 Keystone、HAProxy)。创建 roles_data File 部分包含角色的信息。

3.2.3.1. 创建 roles_data.yaml 文件

  1. /usr/share/openstack-tripleo-heat-templates 复制 roles_data.yaml
  2. 编辑新文件。
  3. 删除不需要的控制器角色,如 Aodh*、Ceilometer、Ceph*、Cinder*、Glance*、Ironic*、Manila*、Mistral*、Nova*、Octavia*、Swift*。
  4. roles_data.yaml 中查找 ObjectStorage 角色。
  5. 将此角色复制到同一文件中的新角色,并将其命名为 ObjectProxy
  6. SwiftStorage 替换为此角色中的 SwiftProxy

以下 roles_data.yaml 文件示例显示了示例角色。

- name: Controller
  description: |
	Controller role that has all the controller services loaded and handles
	Database, Messaging and Network functions.
  CountDefault: 1
  tags:
	- primary
	- controller
  networks:
	- External
	- InternalApi
	- Storage
	- StorageMgmt
	- Tenant
  HostnameFormatDefault: '%stackname%-controller-%index%'
  ServicesDefault:
	- OS::TripleO::Services::AuditD
	- OS::TripleO::Services::CACerts
	- OS::TripleO::Services::CertmongerUser
	- OS::TripleO::Services::Clustercheck
	- OS::TripleO::Services::Docker
	- OS::TripleO::Services::Ec2Api
	- OS::TripleO::Services::Etcd
	- OS::TripleO::Services::HAproxy
	- OS::TripleO::Services::Keepalived
	- OS::TripleO::Services::Kernel
	- OS::TripleO::Services::Keystone
	- OS::TripleO::Services::Memcached
	- OS::TripleO::Services::MySQL
	- OS::TripleO::Services::MySQLClient
	- OS::TripleO::Services::Ntp
	- OS::TripleO::Services::Pacemaker
	- OS::TripleO::Services::RabbitMQ
	- OS::TripleO::Services::Securetty
	- OS::TripleO::Services::Snmp
	- OS::TripleO::Services::Sshd
	- OS::TripleO::Services::Timezone
	- OS::TripleO::Services::TripleoFirewall
	- OS::TripleO::Services::TripleoPackages
	- OS::TripleO::Services::Vpp

- name: ObjectStorage
  CountDefault: 1
  description: |
	Swift Object Storage node role
  networks:
	- InternalApi
	- Storage
	- StorageMgmt
  disable_upgrade_deployment: True
  ServicesDefault:
	- OS::TripleO::Services::AuditD
	- OS::TripleO::Services::CACerts
	- OS::TripleO::Services::CertmongerUser
	- OS::TripleO::Services::Collectd
	- OS::TripleO::Services::Docker
	- OS::TripleO::Services::FluentdClient
	- OS::TripleO::Services::Kernel
	- OS::TripleO::Services::MySQLClient
	- OS::TripleO::Services::Ntp
	- OS::TripleO::Services::Securetty
	- OS::TripleO::Services::SensuClient
	- OS::TripleO::Services::Snmp
	- OS::TripleO::Services::Sshd
	- OS::TripleO::Services::SwiftRingBuilder
	- OS::TripleO::Services::SwiftStorage
	- OS::TripleO::Services::Timezone
	- OS::TripleO::Services::TripleoFirewall
	- OS::TripleO::Services::TripleoPackages

- name: ObjectProxy
  CountDefault: 1
  description: |
	Swift Object proxy node role
  networks:
	- InternalApi
	- Storage
	- StorageMgmt
  disable_upgrade_deployment: True
  ServicesDefault:
	- OS::TripleO::Services::AuditD
	- OS::TripleO::Services::CACerts
	- OS::TripleO::Services::CertmongerUser
	- OS::TripleO::Services::Collectd
	- OS::TripleO::Services::Docker
	- OS::TripleO::Services::FluentdClient
	- OS::TripleO::Services::Kernel
	- OS::TripleO::Services::MySQLClient
	- OS::TripleO::Services::Ntp
	- OS::TripleO::Services::Securetty
	- OS::TripleO::Services::SensuClient
	- OS::TripleO::Services::Snmp
	- OS::TripleO::Services::Sshd
	- OS::TripleO::Services::SwiftRingBuilder
	- OS::TripleO::Services::SwiftProxy
	- OS::TripleO::Services::Timezone
	- OS::TripleO::Services::TripleoFirewall
	- OS::TripleO::Services::TripleoPackages

3.2.3.2. 部署新角色

使用常规的 openstack deploy 命令部署 overcloud,包括新角色。

openstack overcloud deploy --templates -r roles_data.yaml -e [...]

3.2.4. 使用外部 SAN 磁盘

默认情况下,当 Red Hat OpenStack Platform director 部署 Object Storage 服务(swift)时,对象存储会被配置和优化以使用独立本地磁盘。此配置可确保工作负载在所有磁盘上分布,这有助于在节点故障或其他系统问题期间最大程度降低性能影响。

在类似的性能影响事件时,使用单个 SAN 的环境可能会遇到所有 LUN 的性能降低。对象存储服务无法缓解使用 SAN 磁盘的环境中的性能问题。

因此,红帽强烈建议您为对象存储使用额外的本地磁盘来满足性能和磁盘空间要求。如需更多信息,请参阅特定 Red Hat OpenStack Platform 服务指南中的部署建议 中的 对象存储

将外部 SAN 用于对象存储需要根据具体情况进行评估。如需更多信息,请联系红帽支持团队。

重要

如果您选择将外部 SAN 用于对象存储,请注意以下条件:

  • 对象存储服务默认存储遥测数据和镜像服务(glance)镜像。Glance 镜像需要更多磁盘空间,但从性能角度而言,存储 glance 镜像的影响比存储遥测数据的影响要小。存储和处理遥测数据需要提高性能。红帽不为与使用外部 SAN 进行对象存储造成的性能相关的问题提供支持。
  • 红帽不提供对核心对象存储服务产品之外的问题提供支持。要获得高可用性和性能的支持,请联系您的存储厂商。
  • 红帽没有使用对象存储服务测试 SAN 解决方案。有关第三方产品的兼容性、指导和支持的更多信息,请联系您的存储供应商。
  • 红帽建议您使用部署评估和测试性能需求。要确认您的 SAN 部署经过测试、受支持并满足您的性能要求,请联系您的存储供应商。

3.2.4.1. SAN 磁盘部署配置

此模板是用于对象存储存储的两个设备(/dev/mapper/vdb/dev/mapper/vdc)的示例:

parameter_defaults:
  SwiftMountCheck: true
  SwiftUseLocalDir: false
  SwiftRawDisks: {"vdb": {"base_dir":"/dev/mapper/"}, "vdc": {"base_dir":"/dev/mapper/"}}

3.3. 为 Red Hat Enterprise Linux 安装和配置存储节点

要在外部存储节点上使用 Red Hat OpenStack Platform Object Storage 服务(swift),您必须安装并配置运行帐户、容器和对象服务进程的存储节点。此配置引用了两个存储节点,每个节点包含两个空的本地块存储设备。

注意

对象存储服务的内部网络没有进行身份验证。为了安全起见,红帽建议您将存储节点保留在专用网络或 VLAN 中。

注意

这些说明使用 /dev/sdb/dev/sdc 作为设备名称,但您可以替换环境中特定节点的值。

3.3.1. 准备存储设备

在存储节点上安装和配置对象存储服务前,您必须准备存储设备。

注意

在每个存储节点上执行这些步骤。

流程

  1. 安装支持工具软件包:

    # yum install xfsprogs rsync
  2. /dev/sdb/dev/sdc 设备格式化为 XFS:

    # mkfs.xfs /dev/sdb
    # mkfs.xfs /dev/sdc
  3. 创建挂载点目录结构:

    # mkdir -p /srv/node/sdb
    # mkdir -p /srv/node/sdc
  4. 编辑 /etc/fstab 文件并在其中添加以下数据:

    /dev/sdb /srv/node/sdb xfs defaults 0 2
    /dev/sdc /srv/node/sdc xfs defaults 0 2
  5. 挂载设备:

    # mount /srv/node/sdb
    # mount /srv/node/sdc
  6. 创建或编辑 /etc/rsyncd.conf 文件,使其包含以下数据:

    uid = swift
    gid = swift
    log file = /var/log/rsyncd.log
    pid file = /var/run/rsyncd.pid
    address = MANAGEMENT_INTERFACE_IP_ADDRESS
    
    [account]
    max connections = 2
    path = /srv/node/
    read only = False
    lock file = /var/lock/account.lock
    
    [container]
    max connections = 2
    path = /srv/node/
    read only = False
    lock file = /var/lock/container.lock
    
    [object]
    max connections = 2
    path = /srv/node/
    read only = False
    lock file = /var/lock/object.lock

    MANAGEMENT_INTERFACE_IP_ADDRESS 替换为存储节点上管理网络的 IP 地址。

  7. 启动 rsyncd 服务并将其配置为在系统引导时启动:

    # systemctl enable rsyncd.service
    # systemctl start rsyncd.service

3.3.2. 配置组件

配置帐户、容器和对象存储服务器。

流程

  1. 安装软件包:

    # yum install openstack-swift-account openstack-swift-container \
      openstack-swift-object
  2. 编辑 /etc/swift/account-server.conf 文件并完成以下操作:

    1. [DEFAULT] 部分中,配置绑定 IP 地址、绑定端口、用户、配置目录和挂载点目录:

      [DEFAULT]
      ...
      bind_ip = MANAGEMENT_INTERFACE_IP_ADDRESS
      bind_port = 6202
      user = swift
      swift_dir = /etc/swift
      devices = /srv/node
      mount_check = True

      MANAGEMENT_INTERFACE_IP_ADDRESS 替换为存储节点上管理网络的 IP 地址。

    2. [pipeline:main] 部分中,启用 healthcheckrecon 模块:

      [pipeline:main]
      pipeline = healthcheck recon account-server
    3. [filter:recon] 部分中,配置 recon 缓存目录:

      [filter:recon]
      use = egg:swift#recon
      ...
      recon_cache_path = /var/cache/swift
  3. 为帐户服务打开默认防火墙端口:

    # firewall-cmd --permanent --add-port=6202/tcp
  4. 编辑 /etc/swift/container-server.conf 文件并完成以下操作:

    1. [DEFAULT] 部分中,配置绑定 IP 地址、绑定端口、用户、配置目录和挂载点目录:

      [DEFAULT]
      ...
      bind_ip = MANAGEMENT_INTERFACE_IP_ADDRESS
      bind_port = 6201
      user = swift
      swift_dir = /etc/swift
      devices = /srv/node
      mount_check = True

      MANAGEMENT_INTERFACE_IP_ADDRESS 替换为存储节点上管理网络的 IP 地址。

    2. [pipeline:main] 部分中,启用 healthcheckrecon 模块:

      [pipeline:main]
      pipeline = healthcheck recon container-server
    3. [filter:recon] 部分中,配置 recon 缓存目录:

      [filter:recon]
      use = egg:swift#recon
      ...
      recon_cache_path = /var/cache/swift
  5. 为容器服务打开默认防火墙端口:

    # firewall-cmd --permanent --add-port=6201/tcp
  6. 编辑 /etc/swift/object-server.conf 文件并完成以下操作:

    1. [DEFAULT] 部分中,配置绑定 IP 地址、绑定端口、用户、配置目录和挂载点目录:

      [DEFAULT]
      ...
      bind_ip = MANAGEMENT_INTERFACE_IP_ADDRESS
      bind_port = 6200
      user = swift
      swift_dir = /etc/swift
      devices = /srv/node
      mount_check = True

      MANAGEMENT_INTERFACE_IP_ADDRESS 替换为存储节点上管理网络的 IP 地址。

    2. [pipeline:main] 部分中,启用 healthcheckrecon 模块:

      [pipeline:main]
      pipeline = healthcheck recon object-server
    3. [filter:recon] 部分中,配置 recon_cache_pathrecon_lock_path 目录:

      [filter:recon]
      use = egg:swift#recon
      ...
      recon_cache_path = /var/cache/swift
      recon_lock_path = /var/lock
  7. 为对象服务打开默认防火墙端口:

    # firewall-cmd --permanent --add-port=6200/tcp
  8. 确保挂载点目录结构的所有权正确:

    # chown -R swift:swift /srv/node
  9. 创建 recon 目录并确保正确所有权:

    # mkdir -p /var/cache/swift
    # chown -R root:swift /var/cache/swift
    # chmod -R 775 /var/cache/swift

3.4. 基本容器管理

为了帮助组织,伪文件夹是可包含对象(并可嵌套)的逻辑设备。例如,您可以创建一个 Images 文件夹,在其中存储图片和用于存储视频的 Media 文件夹。

您可以在各个项目中创建一个或多个容器,以及每个容器中的一个或多个对象或伪文件夹。

3.4.1. 创建容器

  1. 在控制面板中,选择 Project > Object Store > Containers
  2. Create Container
  3. 指定 Container Name,然后在 Container Access 字段中选择以下之一。

    类型描述

    私有

    限制当前项目中用户的访问权限。

    公开

    允许 API 访问具有公共 URL 的任何人。但是,在控制面板中,项目用户无法看到来自其他项目的公共容器和数据。

  4. Create Container

新容器使用默认存储策略。如果您定义了多个存储策略(例如,默认策略,另一个启用纠删代码),您可以将容器配置为通过命令行使用非默认存储策略。为此,请运行:

# swift post -H "X-Storage-Policy:POLICY" CONTAINERNAME

其中:

  • POLICY 是您希望容器使用的策略的名称或别名。
  • containerNAME 是容器的名称。

3.4.2. 为容器创建伪文件夹

  1. 在控制面板中,选择 Project > Object Store > Containers
  2. 单击您要添加伪文件夹的容器的名称。
  3. 单击 Create Pseudo-folder
  4. Pseudo-folder Name 字段中指定名称,然后单击 Create

3.4.3. 删除容器

  1. 在控制面板中,选择 Project > Object Store > Containers
  2. 浏览 Containers 部分中的容器,并确保所有对象都已被删除(请参阅 第 3.4.6 节 “删除对象”)。
  3. 在容器的箭头菜单中选择 Delete Container
  4. Delete Container 以确认容器被删除。

3.4.4. 上传对象

如果没有上传实际文件,则对象仍然创建(作为占位符),之后可用于上传该文件。

  1. 在控制面板中,选择 Project > Object Store > Containers
  2. 单击从中上传对象的容器名称;如果容器中已存在伪文件夹,您可以单击其名称。
  3. 浏览您的文件,然后单击 Upload Object
  4. Object Name 字段中指定名称:

    • 可以使用 / 字符(如 Images/myImage.jpg)在名称中指定伪文件夹。如果指定的文件夹不存在,则会在对象上传时创建它。
    • 不是位置唯一的名称(即对象已存在)会覆盖对象的内容。
  5. 单击 Upload Object

3.4.5. 复制对象

  1. 在控制面板中,选择 Project > Object Store > Containers
  2. 单击对象的容器或文件夹的名称(以显示对象)。
  3. 单击 Upload Object
  4. 浏览要复制的文件,然后在其箭头菜单中选择 Copy
  5. 指定以下内容:

    字段描述

    目标容器

    新对象的目标容器。

    路径

    目标容器中的伪文件夹;如果文件夹尚不存在,则会创建它。

    目标对象名称

    新对象的名称。如果您使用不对位置唯一的名称(即对象已存在),它会覆盖对象之前的内容。

  6. 单击 Copy Object

3.4.6. 删除对象

  1. 在控制面板中,选择 Project > Object Store > Containers
  2. 浏览对象,然后在其箭头菜单中选择 Delete Object
  3. 单击 Delete Object 以确认对象的移除。

第 4 章 共享文件系统服务

使用共享文件系统服务(manila),您可以置备多个计算实例、裸机节点或容器可以使用的共享文件系统。云管理员创建共享类型,以准备共享服务,并使最终用户能够创建和管理共享。

先决条件

  • 最终用户至少需要一种共享类型才能使用共享文件系统服务。
  • 对于 driver_handles_share_servers=False 的后端,云管理员会提前配置必要的网络,而不是在共享文件系统后端中动态配置。
  • 对于 CephFS through NFS 后端,云管理员使用隔离网络和环境参数以及自定义 network_data 文件部署 Red Hat OpenStack Platform (RHOSP) director,以便为 NFS 导出创建隔离的 StorageNFS 网络。部署后,在 overcloud 使用之前,管理员创建对应的 Networking 服务(neutron) StorageNFS 共享提供商网络,映射到数据中心的隔离 StorageNFS 网络。
  • 要使 Compute 实例连接到此共享提供商网络,用户必须添加额外的 neutron 端口。

使用以下概念和程序了解和使用共享文件系统服务:

4.1. 共享文件系统服务(manila)后端

当云管理员使用 Red Hat OpenStack Platform (RHOSP) director 部署共享文件系统服务时,他们可以选择以下支持的后端之一:

有关支持的后端设备和驱动程序的完整列表,请参阅 RHEL OpenStack 平台中的组件、插件和驱动程序支持

4.1.1. 共享文件系统的网络

共享文件系统通过网络访问。规划云上的网络非常重要,以确保最终用户客户端将其共享连接到在 Red Hat OpenStack Platform (RHOSP)虚拟机、裸机服务器和容器上运行的工作负载。

根据最终用户所需的安全性和隔离级别,作为管理员,您可以将 driver_handles_share_servers 参数设置为 true 或 false。

如果将 driver_handles_share_servers 参数设置为 true,这将使服务能够将共享导出到最终用户定义的共享网络,并帮助隔离共享服务器。

driver_handles_share_servers 参数等于 true 时,用户可以在自助服务共享网络上置备其工作负载。这样可确保其共享由在专用网络段中完全隔离的 NAS 文件服务器导出。

最终用户使用的共享网络可以与他们可以创建的私有项目网络相同。作为管理员,您必须确保将这些隔离网络映射到的物理网络扩展至您的存储基础架构。

您还必须确保使用的系统支持项目网络的网络分段样式。存储系统,如 NetApp ONTAP 和 Dell EMC PowerMax、Unity 和 VNX,不支持 GENEVE 或 VXLAN 等虚拟覆盖分段样式。

作为替代方案,您可以在顶层交换机终止覆盖网络,并为项目网络使用更原语形式的网络,如 VLAN。另一种选择是允许共享提供商网络上的 VLAN 段,或提供对已连接到您的存储系统的预先存在的网段网络的访问。

如果将 driver_handles_share_servers 参数设置为 false,用户无法在自己的共享网络上创建共享。相反,它们必须将其客户端连接到云管理员所配置的网络。

driver_handles_share_servers 参数等于 false 时,director 可以为您创建专用的共享存储网络。例如,当使用标准 director 模板部署原生 CephFS 后端时,director 会创建一个名为 Storage 的共享提供商网络。当您通过 NFS 后端部署 CephFS 时,共享提供商网络称为 StorageNFS。您的最终用户必须将自己的客户端连接到共享存储网络,才能访问其共享。

并非所有共享文件系统存储驱动程序都支持这两种操作模式。无论您选择哪种模式,该服务都确保硬数据路径多租户隔离保证。

如果要提供硬网络路径多租户隔离保证,作为自助服务模型的一部分,则必须部署支持 driver_handles_share_servers 驱动程序模式的后端。

有关与共享的网络连接的详情,请参考 第 4.2 节 “确保到共享的网络连接”

4.1.2. 创建共享类型

共享类型充当共享文件系统服务调度程序的提示,以执行放置决策。Red Hat OpenStack Platform (RHOSP) director 使用名为 default 的默认共享类型配置共享文件系统服务,但不会创建共享类型。

重要
最终用户至少需要一种共享类型才能使用共享文件系统服务。

流程

  1. 部署 overcloud 后,以云管理员身份运行以下命令来创建共享类型:

    # manila type-create default <spec_driver_handles_share_servers>

    & lt;spec_driver_handles_share_servers > 参数是一个布尔值:

    • 对于 CephFS through NFS 或原生 CephFS,值为 false。
    • 对于其他后端,值可以是 true 或 false;将 < spec_driver_handles_share_servers > 设置为与 Manila<backend>DriverHandlesShareServers 参数的值 匹配。例如,如果您使用 NetApp 后端,则该参数名为 ManilaNetappDriverHandlesShareServers
  2. 向默认共享类型添加规格,或创建额外的共享类型以用于多个配置的后端。例如,将默认共享类型配置为选择 CephFS 后端,并使用 NetApp driver_handles_share_servers=True 后端的额外共享类型:

    (overcloud) [stack@undercloud-0 ~]$ manila type-create default false --extra-specs share_backend_name='cephfs'
    (overcloud) [stack@undercloud-0 ~]$ manila type-create netapp true --extra-specs share_backend_name='tripleo_netapp'
注意

默认情况下,共享类型是公共的,这意味着它们对所有云项目可见且可供所有云项目使用,但您可以创建专用共享类型以用于特定项目。有关如何进行私有共享类型或设置其他共享类型选项的更多信息,请参阅 安全性和强化指南

4.1.3. 共享类型的常见功能

共享类型定义了共享的常见功能。查看共享类型的常见功能,以了解您可以与共享相关的内容。

表 4.1. 共享类型的功能

功能描述

driver_handles_share_servers

true 或 false

授予使用共享网络创建共享的权限。

snapshot_support

true 或 false

授予创建共享快照的权限。

create_share_from_snapshot_support

true 或 false

授予创建共享快照克隆的权限。

revert_to_snapshot_support

true 或 false

授予将共享恢复到最新快照的权限。

mount_snapshot_support

true 或 false

授予导出和挂载快照的权限。

replication_type

dr

授予为灾难恢复创建副本的权限。一次只允许一个活跃的导出。

可读

授予创建只读副本的权限。一次只允许一个可写的、活跃的导出。

writable

授予创建读/写副本的权限。每个共享允许任意数量活跃的导出。

availability_zones

一个或多个可用区的列表

授予仅在列出的可用区上创建共享的权限。

4.1.4. 发现共享类型

作为云用户,在创建共享时必须指定共享类型。

流程

  1. 发现可用的共享类型:

    $ manila type-list

    命令输出列出了共享类型的名称和 ID。

4.1.5. 创建共享

创建用于读取和写入数据的共享。

要创建共享,请使用类似如下的命令:

$ manila create [--share-type <sharetype>] [--name <sharename>] proto GB

替换以下值:

  • sharetype 应用与指定共享类型关联的设置。

    • 可选:如果没有提供,则使用 default 共享类型。
  • sharename 是共享的名称。

    • 可选:不需要共享来具有名称,也不能保证名称是唯一的。
  • proto 是您要使用的共享协议。

    • 对于带有 NFS 的 CephFS,protonfs
    • 对于 CephFS 原生,protocephfs
    • 对于 NetApp 和 Dell EMC 存储后端,protonfscifs
  • GB 是共享的大小(以 GB 为单位)。

例如,在 第 4.1.2 节 “创建共享类型” 中,云管理员会创建一个 默认共享类型,该类型选择 CephFS 后端,另一个名为 netapp 的共享类型选择 NetApp 后端。

流程

  1. 使用示例共享类型,在 CephFS NFS 后端上创建一个名为 share-01 的 10 GB NFS 共享。本例将 CephFS 与 NFS 搭配使用:

    (user) [stack@undercloud-0 ~]$ manila create --name share-01 nfs 10
  2. 可选:在 NetApp 后端上创建一个名为 share-02 的 20 GB NFS 共享:

    (user) [stack@undercloud-0 ~]$ manila create --name share-02 --share-type netapp --share-network mynet nfs 20

4.1.6. 列出共享和导出信息

要验证您是否已成功创建了共享,请完成以下步骤。

流程

  1. 列出共享:

    (user) [stack@undercloud-0 ~]$ manila list
    
    +--------------------------------------+----------+-----+-----------+           | ID                                   | Name     | ... | Status    ...
    +--------------------------------------+----------+-----+-----------+
    | 8c3bedd8-bc82-4100-a65d-53ec51b5fe81 | share-01 | ... | available ...
    +--------------------------------------+----------+-----+-----------+
  2. 查看共享的导出位置:

    (user) [stack@undercloud-0 ~]$ manila share-export-location-list share-01
    
     +------------------------------------------------------------------
     | Path
     |  172.17.5.13:/volumes/_nogroup/e840b4ae-6a04-49ee-9d6e-67d4999fbc01
     +------------------------------------------------------------------
  3. 查看共享的参数:

    manila share-export-location-show <id>
    注意

    此信息用于在 第 4.4.2 节 “挂载共享” 中挂载共享。

4.2. 确保到共享的网络连接

需要连接到文件共享的客户端必须具有到该共享的一个或多个导出位置的网络连接。

可以通过多种方式使用共享文件系统服务配置网络,包括使用网络插件。

当共享类型的 driver_handles_share_servers 参数等于 true 时,云用户可以使用计算实例附加的网络详情创建共享网络,然后在创建共享时引用它。

当共享类型的 driver_handles_share_servers 参数等于 false 时,云用户必须将其计算实例连接到共享存储网络。

有关如何配置并验证到共享网络的网络连接的详情,请参考 第 4.2.1 节 “连接到共享网络以访问共享共享”

4.2.1. 连接到共享网络以访问共享共享

driver_handles_share_servers 参数等于 false 时,共享将导出到管理员提供的共享提供商网络。作为最终用户,您必须将您的客户端(如 Compute 实例)连接到共享提供商网络,以访问您的共享。

在本例中,共享供应商网络称为 StorageNFS。当 director 通过 NFS 后端使用 CephFS 部署共享文件系统服务时,会配置 StorageNFS。按照以下步骤连接到您的云管理员可用的网络。

注意

在示例中,客户端的 IP 地址系列版本不重要。此流程中的步骤使用 IPv4 地址,但步骤与 IPv6 相同。

流程

  1. 为 StorageNFS 端口创建一个安全组,它允许数据包出站端口,但不允许来自未建立的连接的入口数据包:

    (user) [stack@undercloud-0 ~]$ openstack security group create no-ingress -f yaml
    created_at: '2018-09-19T08:19:58Z'
    description: no-ingress
    id: 66f67c24-cd8b-45e2-b60f-9eaedc79e3c5
    name: no-ingress
    project_id: 1e021e8b322a40968484e1af538b8b63
    revision_number: 2
    rules: 'created_at=''2018-09-19T08:19:58Z'', direction=''egress'', ethertype=''IPv4'',
     id=''6c7f643f-3715-4df5-9fef-0850fb6eaaf2'', updated_at=''2018-09-19T08:19:58Z''
    
     created_at=''2018-09-19T08:19:58Z'', direction=''egress'', ethertype=''IPv6'',                                                          id=''a8ca1ac2-fbe5-40e9-ab67-3e55b7a8632a'', updated_at=''2018-09-19T08:19:58Z'''
    updated_at: '2018-09-19T08:19:58Z'
  2. 在 StorageNFS 网络中创建一个端口,其安全性由 no-ingress 安全组强制使用。

    (user) [stack@undercloud-0 ~]$ openstack port create nfs-port0 --network StorageNFS --security-group no-ingress -f yaml
    
    admin_state_up: UP
    allowed_address_pairs: ''
    binding_host_id: null
    binding_profile: null
    binding_vif_details: null
    binding_vif_type: null
    binding_vnic_type: normal
    created_at: '2018-09-19T08:03:02Z'
    data_plane_status: null
    description: ''
    device_id: ''
    device_owner: ''
    dns_assignment: null
    dns_name: null
    extra_dhcp_opts: ''
    fixed_ips: ip_address='172.17.5.160', subnet_id='7bc188ae-aab3-425b-a894-863e4b664192'
    id: 7a91cbbc-8821-4d20-a24c-99c07178e5f7
    ip_address: null
    mac_address: fa:16:3e:be:41:6f
    name: nfs-port0
    network_id: cb2cbc5f-ea92-4c2d-beb8-d9b10e10efae
    option_name: null
    option_value: null
    port_security_enabled: true
    project_id: 1e021e8b322a40968484e1af538b8b63
    qos_policy_id: null
    revision_number: 6
    security_group_ids: 66f67c24-cd8b-45e2-b60f-9eaedc79e3c5
    status: DOWN
    subnet_id: null
    tags: ''
    trunk_details: null
    updated_at: '2018-09-19T08:03:03Z'
    注意

    StorageNFSSubnet 分配 IP 地址 172.17.5.160 到 nfs-port0

  3. nfs-port0 添加到 Compute 实例。

    (user) [stack@undercloud-0 ~]$ openstack server add port instance0 nfs-port0
    (user) [stack@undercloud-0 ~]$ openstack server list -f yaml
    - Flavor: m1.micro
      ID: 0b878c11-e791-434b-ab63-274ecfc957e8
      Image: manila-test
      Name: demo-instance0
      Networks: demo-network=172.20.0.4, 10.0.0.53; StorageNFS=172.17.5.160
      Status: ACTIVE

    除了其私有和浮动地址外,计算实例还会分配在 StorageNFS 网络上 IP 地址为 172.17.5.160 的端口,当对有问题的共享授予该地址时,您可以用来挂载 NFS 共享。

    注意

    您可能需要调整 Compute 实例上的网络配置,并重启 Compute 实例的服务来激活使用此地址的接口。

4.2.2. 在网络和实例之间配置 IPv6 接口

当导出共享的共享网络使用 IPv6 寻址时,您可能会遇到次要接口上 DHCPv6 的问题。使用这个流程在实例上手动配置 IPv6 接口。如需更多信息,请参阅 BZmvapich695

前提条件

  • 连接到共享网络以访问共享。

流程

  1. 登录实例。
  2. 配置 IPv6 接口地址:

    $ ip address add fd00:fd00:fd00:7000::c/64 dev eth1
  3. 激活接口:

    $ ip link set dev eth1 up
  4. 在共享的导出位置 ping IPv6 地址来测试接口连接:

    $ ping -6  fd00:fd00:fd00:7000::21
  5. 或者,验证您可以通过 Telnet 访问 NFS 服务器:

    $ dnf install -y telnet
    $ telnet fd00:fd00:fd00:7000::21 2049

4.3. 授予共享访问权限

在客户端(如计算实例)上挂载共享前,您必须使用类似如下的命令授予客户端对共享的访问权限:

# manila access-allow <share> <accesstype> --access-level <accesslevel>  <clientidentifier>

替换以下值:

  • 共享 - 第 4.1.5 节 “创建共享” 中创建的共享的共享名称或 ID。
  • accesstype - 共享上要请求的访问权限类型。有些类型包括:

    • 用户 :使用 按用户或组名进行身份验证。
    • IP :使用 通过其 IP 地址对实例进行身份验证。
    • cephx: 使用 通过原生 CephFS 客户端用户名进行身份验证。

      注意

      访问类型取决于共享的协议。对于 NFS 共享,只允许 ip 访问类型。对于 CIFS,用户访问 类型适当。对于原生 CephFS 共享,您必须使用 cephx

  • accesslevel - 可选,默认为 rw

    • rw :对共享的读写访问权限.
    • ro: 共享的只读访问权限。
  • clientidentifier - 因 accesstype 而异。

    • ip accesstype 使用 IP 地址。
    • 对于 user accesstype,使用 CIFS 用户或组。
    • cephx accesstype 使用用户名字符串。

4.3.1. 授予对共享的访问权限

您必须向最终用户客户端授予对共享的访问权限,以便用户可以从共享中读取数据并写入数据。

使用这个流程通过实例的 IP 地址授予客户端计算实例对 NFS 共享的访问权限。CIFS 共享的 user 规则和 CephFS 共享的 cephx 规则有类似的特征。对于 用户和 cephx 访问类型,如果需要,您可以在 多个客户端间使用相同的客户端标识符

注意

在示例中,客户端的 IP 地址系列版本不重要。此流程中的步骤使用 IPv4 地址,但步骤与 IPv6 相同。

流程

  1. 检索您计划挂载共享的客户端计算实例的 IP 地址。请确定您选择了与可以访问共享的网络对应的 IP 地址。在本例中,它是 StorageNFS 网络的 IP 地址:

    (user) [stack@undercloud-0 ~]$ openstack server list -f yaml
    - Flavor: m1.micro
      ID: 0b878c11-e791-434b-ab63-274ecfc957e8
      Image: manila-test
      Name: demo-instance0
      Networks: demo-network=172.20.0.4, 10.0.0.53;
      StorageNFS=172.17.5.160
      Status: ACTIVE
    
    (user) [stack@undercloud-0 ~]$ manila access-allow share-01 ip 172.17.5.160
    注意

    对共享的访问权限具有自己的 ID (accessid)。

    +-----------------+---------------------------------------+
    | Property        | Value                                 |
    +-----------------+---------------------------------------+
    | access_key      | None
    | share_id        | db3bedd8-bc82-4100-a65d-53ec51b5cba3
    | created_at      | 2018-09-17T21:57:42.000000
    | updated_at      | None
    | access_type     | ip
    | access_to       | 172.17.5.160
    | access_level    | rw
    | state           | queued_to_apply
    | id              | 875c6251-c17e-4c45-8516-fe0928004fff
    +-----------------+---------------------------------------+
  2. 验证访问配置是否成功:

    (user) [stack@undercloud-0 ~]$ manila access-list share-01
    
    +--------------+-------------+--------------+--------------+--------+ ...
    | id           | access_type | access_to    | access_level | state  | ...
    +--------------+-------------+--------------+--------------+--------+
    | 875c6251-... | ip          | 172.17.5.160 | rw       	   | active | ...
    +--------------+------------+--------------+--------------+---------+ ...

4.3.2. 撤销对共享的访问

共享的所有者可以撤销对共享的访问的原因。完成以下步骤以撤销之前对共享的访问。

流程

  1. 撤销对共享的访问权限:

    # manila access-deny <share> <accessid>
    注意

    <share > 替换为共享名称或共享 ID。

    例如:

    (user) [stack@undercloud-0 ~]$ manila access-list share-01
    +--------------+-------------+--------------+--------------+--------+
    | id           | access_type | access_to    | access_level | state  | ...
    +--------------+-------------+--------------+--------------+--------+ ...
    | 875c6251-... | ip          | 172.17.5.160 | rw       	   | active | ...
    +--------------+-------------+--------------+--------------+--------+
    
    (user) [stack@undercloud-0 ~]$ manila access-deny share-01 875c6251-c17e-4c45-8516-fe0928004fff
    
    (user) [stack@undercloud-0 ~]$ manila access-list share-01
    
    +--------------+------------+--------------+--------------+--------+ ...
    | id           | access_type| access_to    | access_level | state  | ...
    +--------------+------------+--------------+--------------+--------+ ...
    +--------------+------------+--------------+--------------+--------+ ...
注意

如果您有一个具有读写权限的现有客户端,则必须撤销其对共享的访问权限,并在您希望客户端具有只读权限时添加只读规则。

4.4. 在计算实例上挂载共享

在授予对客户端的访问权限后,可以挂载并使用共享。任何类型的客户端都可以访问共享,只要有与客户端的网络连接。

在虚拟计算实例上挂载 NFS 共享的步骤与在裸机计算实例上挂载 NFS 共享的步骤类似。有关如何在 OpenShift 容器上挂载共享的更多信息,请参阅 OpenShift Container Platform 产品文档

注意

用于不同协议的客户端软件包必须安装在挂载共享的 Compute 实例上。例如,对于通过 NFS 使用 CephFS 的共享文件系统服务,NFS 客户端软件包必须支持 NFS 4.1。

4.4.1. 列出共享导出位置

检索共享的导出位置,以便您可以挂载共享。

流程

  1. 检索共享的导出位置:

    (user) [stack@undercloud-0 ~]$ manila share-export-location-list share-01

    当存在多个导出位置时,请选择第一个 metadata 字段的值 等于 True。如果没有首选位置,您可以使用任何导出位置。

4.4.2. 挂载共享

在客户端上挂载共享以启用数据访问权限。

有关创建和授予共享访问权限的详情,请参考以下步骤:

流程

  1. 登录实例并运行以下命令:

    (user) [stack@undercloud-0 ~]$ openstack server ssh demo-instance0 --login root
    # hostname
    demo-instance0
  2. 使用导出位置在 IPv4 网络上挂载共享:

    # mount -t nfs -v  172.17.5.13:/volumes/_nogroup/e840b4ae-6a04-49ee-9d6e-67d4999fbc01 /mnt

4.5. 删除共享

共享文件系统服务(manila)不提供保护来防止您删除数据。共享文件系统服务不会检查客户端是否连接或工作负载是否正在运行。当您删除共享时,您无法检索它。

WARNING
在删除共享前备份您的数据。

流程

  1. 删除共享:

    # manila delete <share>
    注意

    在示例命令中,<share> 可以是共享名称或共享 ID。

    例如:

    # manila delete share-01

4.6. 更改共享文件系统服务中的默认配额

为防止系统容量在没有通知的情况下耗尽,云管理员可以配置配额。配额是操作限制。

4.6.1. 列出配额

作为云管理员,您可以使用 manila quota-show 命令列出项目或用户的配额。如果包含可选的 --user 参数,您可以在指定项目中查看此用户的配额。如果省略此参数,您可以获取指定项目的配额。

您可以更新和删除配额。您可以更新共享、快照、GB、GB、snapshot-gigabytes、share-networks、share_groups、share_group_snapshots 和 share-type 配额。

流程

  1. 要查看 usage 语句,请运行以下命令:

    # manila help quota-show
    # manila help quota-update
    # manila help quota-delete

4.7. 故障排除失败

如果共享文件系统服务(manila)操作(如创建共享或创建共享组)异步失败,您可以作为最终用户从命令行运行查询,以了解更多有关错误的信息。

4.7.1. 修复创建共享或创建共享组失败

在本例中,最终用户的目标是在多个虚拟机上创建一个共享来托管软件库。示例错误地引入了两个共享创建失败,以说明如何使用命令行来检索用户支持消息。

流程

  1. 要创建共享,您可以使用共享类型指定您希望共享具有的一些功能。云管理员可以创建共享类型。查看可用的共享类型:

    clouduser1@client:~$ manila type-list
    +--------------------------------------+-------------+------------+------------+--------------------------------------+--------------------------------------------+-------------+
    | ID                                   | Name        | visibility | is_default | required_extra_specs                 | optional_extra_specs                       | Description |
    +--------------------------------------+-------------+------------+------------+--------------------------------------+--------------------------------------------+-------------+
    | 1cf5d45a-61b3-44d1-8ec7-89a21f51a4d4 | dhss_false  | public     | YES        | driver_handles_share_servers : False | create_share_from_snapshot_support : True  | None        |
    |                                      |             |            |            |                                      | mount_snapshot_support : False             |             |
    |                                      |             |            |            |                                      | revert_to_snapshot_support : False         |             |
    |                                      |             |            |            |                                      | snapshot_support : True                    |             |
    | 277c1089-127f-426e-9b12-711845991ea1 | dhss_true   | public     | -          | driver_handles_share_servers : True  | create_share_from_snapshot_support : True  | None        |
    |                                      |             |            |            |                                      | mount_snapshot_support : False             |             |
    |                                      |             |            |            |                                      | revert_to_snapshot_support : False         |             |
    |                                      |             |            |            |                                      | snapshot_support : True                    |             |
    +--------------------------------------+-------------+------------+------------+--------------------------------------+--------------------------------------------+-------------+

    在本例中,有两个共享类型可用。

  2. 要使用指定 driver_handles_share_servers=True 功能的共享类型,您必须创建一个共享网络来导出共享。从专用项目网络创建共享网络。

    clouduser1@client:~$ openstack subnet list
    +--------------------------------------+---------------------+--------------------------------------+---------------------+
    | ID                                   | Name                | Network                              | Subnet              |
    +--------------------------------------+---------------------+--------------------------------------+---------------------+
    | 78c6ac57-bba7-4922-ab81-16cde31c2d06 | private-subnet      | 74d5cfb3-5dd0-43f7-b1b2-5b544cb16212 | 10.0.0.0/26         |
    | a344682c-718d-4825-a87a-3622b4d3a771 | ipv6-private-subnet | 74d5cfb3-5dd0-43f7-b1b2-5b544cb16212 | fd36:18fc:a8e9::/64 |
    +--------------------------------------+---------------------+--------------------------------------+---------------------+
    
    clouduser1@client:~$ manila share-network-create --name mynet --neutron-net-id 74d5cfb3-5dd0-43f7-b1b2-5b544cb16212 --neutron-subnet-id 78c6ac57-bba7-4922-ab81-16cde31c2d06
    +-------------------+--------------------------------------+
    | Property          | Value                                |
    +-------------------+--------------------------------------+
    | network_type      | None                                 |
    | name              | mynet                                |
    | segmentation_id   | None                                 |
    | created_at        | 2018-10-09T21:32:22.485399           |
    | neutron_subnet_id | 78c6ac57-bba7-4922-ab81-16cde31c2d06 |
    | updated_at        | None                                 |
    | mtu               | None                                 |
    | gateway           | None                                 |
    | neutron_net_id    | 74d5cfb3-5dd0-43f7-b1b2-5b544cb16212 |
    | ip_version        | None                                 |
    | cidr              | None                                 |
    | project_id        | cadd7139bc3148b8973df097c0911016     |
    | id                | 0b0fc320-d4b5-44a1-a1ae-800c56de550c |
    | description       | None                                 |
    +-------------------+--------------------------------------+
    
    clouduser1@client:~$ manila share-network-list
    +--------------------------------------+-------+
    | id                                   | name  |
    +--------------------------------------+-------+
    | 6c7ef9ef-3591-48b6-b18a-71a03059edd5 | mynet |
    +--------------------------------------+-------+
  3. 创建共享:

    clouduser1@client:~$ manila create nfs 1 --name software_share --share-network mynet --share-type dhss_true
    +---------------------------------------+--------------------------------------+
    | Property                              | Value                                |
    +---------------------------------------+--------------------------------------+
    | status                                | creating                             |
    | share_type_name                       | dhss_true                            |
    | description                           | None                                 |
    | availability_zone                     | None                                 |
    | share_network_id                      | 6c7ef9ef-3591-48b6-b18a-71a03059edd5 |
    | share_server_id                       | None                                 |
    | share_group_id                        | None                                 |
    | host                                  |                                      |
    | revert_to_snapshot_support            | False                                |
    | access_rules_status                   | active                               |
    | snapshot_id                           | None                                 |
    | create_share_from_snapshot_support    | False                                |
    | is_public                             | False                                |
    | task_state                            | None                                 |
    | snapshot_support                      | False                                |
    | id                                    | 243f3a51-0624-4bdd-950e-7ed190b53b67 |
    | size                                  | 1                                    |
    | source_share_group_snapshot_member_id | None                                 |
    | user_id                               | 61aef4895b0b41619e67ae83fba6defe     |
    | name                                  | software_share                       |
    | share_type                            | 277c1089-127f-426e-9b12-711845991ea1 |
    | has_replicas                          | False                                |
    | replication_type                      | None                                 |
    | created_at                            | 2018-10-09T21:12:21.000000           |
    | share_proto                           | NFS                                  |
    | mount_snapshot_support                | False                                |
    | project_id                            | cadd7139bc3148b8973df097c0911016     |
    | metadata                              | {}                                   |
    +---------------------------------------+--------------------------------------+
  4. 查看共享的状态:

    clouduser1@client:~$ manila list
    +--------------------------------------+----------------+------+-------------+--------+-----------+-----------------+------+-------------------+
    | ID                                   | Name           | Size | Share Proto | Status | Is Public | Share Type Name | Host | Availability Zone |
    +--------------------------------------+----------------+------+-------------+--------+-----------+-----------------+------+-------------------+
    | 243f3a51-0624-4bdd-950e-7ed190b53b67 | software_share | 1    | NFS         | error  | False     | dhss_true       |      | None              |
    +--------------------------------------+----------------+------+-------------+--------+-----------+-----------------+------+-------------------+

    在本例中,共享创建过程中出现错误。

  5. 要查看用户支持消息,请运行 message-list 命令。使用 --resource-id 过滤到您要查找的特定共享。

    clouduser1@client:~$ manila message-list
    +--------------------------------------+---------------+--------------------------------------+-----------+----------------------------------------------------------------------------------------------------------+-----------+----------------------------+
    | ID                                   | Resource Type | Resource ID                          | Action ID | User Message                                                                                             | Detail ID | Created At                 |
    +--------------------------------------+---------------+--------------------------------------+-----------+----------------------------------------------------------------------------------------------------------+-----------+----------------------------+
    | 7d411c3c-46d9-433f-9e21-c04ca30b209c | SHARE         | 243f3a51-0624-4bdd-950e-7ed190b53b67 | 001       | allocate host: No storage could be allocated for this share request, Capabilities filter didn't succeed. | 008       | 2018-10-09T21:12:21.000000 |
    +--------------------------------------+---------------+--------------------------------------+-----------+----------------------------------------------------------------------------------------------------------+-----------+----------------------------+

    User Message 列中,请注意,由于功能不匹配,共享文件系统服务无法创建共享。

  6. 要查看更多信息,请运行 message-show 命令,后跟 message-list 命令中的消息的 ID:

    clouduser1@client:~$ manila message-show 7d411c3c-46d9-433f-9e21-c04ca30b209c
    +---------------+----------------------------------------------------------------------------------------------------------+
    | Property      | Value                                                                                                    |
    +---------------+----------------------------------------------------------------------------------------------------------+
    | request_id    | req-0a875292-6c52-458b-87d4-1f945556feac                                                                 |
    | detail_id     | 008                                                                                                      |
    | expires_at    | 2018-11-08T21:12:21.000000                                                                               |
    | resource_id   | 243f3a51-0624-4bdd-950e-7ed190b53b67                                                                     |
    | user_message  | allocate host: No storage could be allocated for this share request, Capabilities filter didn't succeed. |
    | created_at    | 2018-10-09T21:12:21.000000                                                                               |
    | message_level | ERROR                                                                                                    |
    | id            | 7d411c3c-46d9-433f-9e21-c04ca30b209c                                                                     |
    | resource_type | SHARE                                                                                                    |
    | action_id     | 001                                                                                                      |
    +---------------+----------------------------------------------------------------------------------------------------------+
  7. 作为云用户,您可以通过共享类型检查功能,以便您可以查看可用的共享类型。两种共享类型之间的区别是 driver_handles_share_servers 的值:

    clouduser1@client:~$ manila type-list
    +--------------------------------------+-------------+------------+------------+--------------------------------------+--------------------------------------------+-------------+
    | ID                                   | Name        | visibility | is_default | required_extra_specs                 | optional_extra_specs                       | Description |
    +--------------------------------------+-------------+------------+------------+--------------------------------------+--------------------------------------------+-------------+
    | 1cf5d45a-61b3-44d1-8ec7-89a21f51a4d4 | dhss_false  | public     | YES        | driver_handles_share_servers : False | create_share_from_snapshot_support : True  | None        |
    |                                      |             |            |            |                                      | mount_snapshot_support : False             |             |
    |                                      |             |            |            |                                      | revert_to_snapshot_support : False         |             |
    |                                      |             |            |            |                                      | snapshot_support : True                    |             |
    | 277c1089-127f-426e-9b12-711845991ea1 | dhss_true   | public     | -          | driver_handles_share_servers : True  | create_share_from_snapshot_support : True  | None        |
    |                                      |             |            |            |                                      | mount_snapshot_support : False             |             |
    |                                      |             |            |            |                                      | revert_to_snapshot_support : False         |             |
    |                                      |             |            |            |                                      | snapshot_support : True                    |             |
    +--------------------------------------+-------------+------------+------------+--------------------------------------+--------------------------------------------+-------------+
  8. 使用其他可用共享类型创建共享:

    clouduser1@client:~$ manila create nfs 1 --name software_share --share-network mynet --share-type dhss_false
    +---------------------------------------+--------------------------------------+
    | Property                              | Value                                |
    +---------------------------------------+--------------------------------------+
    | status                                | creating                             |
    | share_type_name                       | dhss_false                           |
    | description                           | None                                 |
    | availability_zone                     | None                                 |
    | share_network_id                      | 6c7ef9ef-3591-48b6-b18a-71a03059edd5 |
    | share_group_id                        | None                                 |
    | revert_to_snapshot_support            | False                                |
    | access_rules_status                   | active                               |
    | snapshot_id                           | None                                 |
    | create_share_from_snapshot_support    | True                                 |
    | is_public                             | False                                |
    | task_state                            | None                                 |
    | snapshot_support                      | True                                 |
    | id                                    | 2d03d480-7cba-4122-ac9d-edc59c8df698 |
    | size                                  | 1                                    |
    | source_share_group_snapshot_member_id | None                                 |
    | user_id                               | 5c7bdb6eb0504d54a619acf8375c08ce     |
    | name                                  | software_share                       |
    | share_type                            | 1cf5d45a-61b3-44d1-8ec7-89a21f51a4d4 |
    | has_replicas                          | False                                |
    | replication_type                      | None                                 |
    | created_at                            | 2018-10-09T21:24:40.000000           |
    | share_proto                           | NFS                                  |
    | mount_snapshot_support                | False                                |
    | project_id                            | cadd7139bc3148b8973df097c0911016     |
    | metadata                              | {}                                   |
    +---------------------------------------+--------------------------------------+

    在本例中,第二个共享创建尝试失败。

  9. 查看用户支持消息:

    clouduser1@client:~$ manila list
    +--------------------------------------+----------------+------+-------------+--------+-----------+-----------------+------+-------------------+
    | ID                                   | Name           | Size | Share Proto | Status | Is Public | Share Type Name | Host | Availability Zone |
    +--------------------------------------+----------------+------+-------------+--------+-----------+-----------------+------+-------------------+
    | 2d03d480-7cba-4122-ac9d-edc59c8df698 | software_share | 1    | NFS         | error  | False     | dhss_false      |      | nova              |
    | 243f3a51-0624-4bdd-950e-7ed190b53b67 | software_share | 1    | NFS         | error  | False     | dhss_true       |      | None              |
    +--------------------------------------+----------------+------+-------------+--------+-----------+-----------------+------+-------------------+
    
    clouduser1@client:~$ manila message-list
    +--------------------------------------+---------------+--------------------------------------+-----------+----------------------------------------------------------------------------------------------------------+-----------+----------------------------+
    | ID                                   | Resource Type | Resource ID                          | Action ID | User Message                                                                                             | Detail ID | Created At                 |
    +--------------------------------------+---------------+--------------------------------------+-----------+----------------------------------------------------------------------------------------------------------+-----------+----------------------------+
    | ed7e02a2-0cdb-4ff9-b64f-e4d2ec1ef069 | SHARE         | 2d03d480-7cba-4122-ac9d-edc59c8df698 | 002       | create: Driver does not expect share-network to be provided with current configuration.                  | 003       | 2018-10-09T21:24:40.000000 |
    | 7d411c3c-46d9-433f-9e21-c04ca30b209c | SHARE         | 243f3a51-0624-4bdd-950e-7ed190b53b67 | 001       | allocate host: No storage could be allocated for this share request, Capabilities filter didn't succeed. | 008       | 2018-10-09T21:12:21.000000 |
    +--------------------------------------+---------------+--------------------------------------+-----------+----------------------------------------------------------------------------------------------------------+-----------+----------------------------+

    该服务不会预期您所使用的共享类型的共享网络。

  10. 如果没有咨询管理员,您可以发现管理员尚未提供支持直接将共享导出到私有 neutron 网络的存储后端。创建没有 share-network 参数的共享:

    clouduser1@client:~$ manila create nfs 1 --name software_share --share-type dhss_false
    +---------------------------------------+--------------------------------------+
    | Property                              | Value                                |
    +---------------------------------------+--------------------------------------+
    | status                                | creating                             |
    | share_type_name                       | dhss_false                           |
    | description                           | None                                 |
    | availability_zone                     | None                                 |
    | share_network_id                      | None                                 |
    | share_group_id                        | None                                 |
    | revert_to_snapshot_support            | False                                |
    | access_rules_status                   | active                               |
    | snapshot_id                           | None                                 |
    | create_share_from_snapshot_support    | True                                 |
    | is_public                             | False                                |
    | task_state                            | None                                 |
    | snapshot_support                      | True                                 |
    | id                                    | 4d3d7fcf-5fb7-4209-90eb-9e064659f46d |
    | size                                  | 1                                    |
    | source_share_group_snapshot_member_id | None                                 |
    | user_id                               | 5c7bdb6eb0504d54a619acf8375c08ce     |
    | name                                  | software_share                       |
    | share_type                            | 1cf5d45a-61b3-44d1-8ec7-89a21f51a4d4 |
    | has_replicas                          | False                                |
    | replication_type                      | None                                 |
    | created_at                            | 2018-10-09T21:25:40.000000           |
    | share_proto                           | NFS                                  |
    | mount_snapshot_support                | False                                |
    | project_id                            | cadd7139bc3148b8973df097c0911016     |
    | metadata                              | {}                                   |
    +---------------------------------------+--------------------------------------+
  11. 确保共享创建成功:

    clouduser1@client:~$ manila list
    +--------------------------------------+----------------+------+-------------+-----------+-----------+-----------------+------+-------------------+
    | ID                                   | Name           | Size | Share Proto | Status    | Is Public | Share Type Name | Host | Availability Zone |
    +--------------------------------------+----------------+------+-------------+-----------+-----------+-----------------+------+-------------------+
    | 4d3d7fcf-5fb7-4209-90eb-9e064659f46d | software_share | 1    | NFS         | available | False     | dhss_false      |      | nova              |
    | 2d03d480-7cba-4122-ac9d-edc59c8df698 | software_share | 1    | NFS         | error     | False     | dhss_false      |      | nova              |
    | 243f3a51-0624-4bdd-950e-7ed190b53b67 | software_share | 1    | NFS         | error     | False     | dhss_true       |      | None              |
    +--------------------------------------+----------------+------+-------------+-----------+-----------+-----------------+------+-------------------+
  12. 删除共享和支持信息:

    clouduser1@client:~$ manila message-list
    +--------------------------------------+---------------+--------------------------------------+-----------+----------------------------------------------------------------------------------------------------------+-----------+----------------------------+
    | ID                                   | Resource Type | Resource ID                          | Action ID | User Message                                                                                             | Detail ID | Created At                 |
    +--------------------------------------+---------------+--------------------------------------+-----------+----------------------------------------------------------------------------------------------------------+-----------+----------------------------+
    | ed7e02a2-0cdb-4ff9-b64f-e4d2ec1ef069 | SHARE         | 2d03d480-7cba-4122-ac9d-edc59c8df698 | 002       | create: Driver does not expect share-network to be provided with current configuration.                  | 003       | 2018-10-09T21:24:40.000000 |
    | 7d411c3c-46d9-433f-9e21-c04ca30b209c | SHARE         | 243f3a51-0624-4bdd-950e-7ed190b53b67 | 001       | allocate host: No storage could be allocated for this share request, Capabilities filter didn't succeed. | 008       | 2018-10-09T21:12:21.000000 |
    +--------------------------------------+---------------+--------------------------------------+-----------+----------------------------------------------------------------------------------------------------------+-----------+----------------------------+
    
    clouduser1@client:~$ manila delete 2d03d480-7cba-4122-ac9d-edc59c8df698 243f3a51-0624-4bdd-950e-7ed190b53b67
    clouduser1@client:~$ manila message-delete ed7e02a2-0cdb-4ff9-b64f-e4d2ec1ef069 7d411c3c-46d9-433f-9e21-c04ca30b209c
    
    clouduser1@client:~$ manila message-list
    +----+---------------+-------------+-----------+--------------+-----------+------------+
    | ID | Resource Type | Resource ID | Action ID | User Message | Detail ID | Created At |
    +----+---------------+-------------+-----------+--------------+-----------+------------+
    +----+---------------+-------------+-----------+--------------+-----------+------------+

4.7.2. 调试共享挂载失败

如果您在挂载共享时遇到问题,请使用这些验证步骤来识别问题的根本原因。

流程

  1. 验证共享的访问控制列表,以确保与您的客户端对应的规则正确且已成功应用。

    $ manila access-list share-01

    在成功规则中,state 属性等于 active

  2. 如果共享类型参数被配置为 driver_handles_share_servers=False,请从导出位置复制主机名或 IP 地址,并 ping 以确认与 NAS 服务器的连接:

    # ping -c 1 172.17.5.13
    PING 172.17.5.13 (172.17.5.13) 56(84) bytes of data.
    64 bytes from 172.17.5.13: icmp_seq=1 ttl=64 time=0.048 ms--- 172.17.5.13 ping statistics ---
    1 packets transmitted, 1 received, 0% packet loss, time 0ms
    rtt min/avg/max/mdev = 7.851/7.851/7.851/0.000 ms
    If using the NFS protocol, you may verify that the NFS server is ready to respond to NFS rpcs on the proper port:
    # rpcinfo -T tcp -a 172.17.5.13.8.1 100003 4
    program 100003 version 4 ready and waiting
    注意

    IP 地址以通用地址格式(uaddr)编写,它添加了两个额外的 octets (8.1)来代表 NFS 服务端口 2049。

如果这些验证步骤失败,则可能存在网络连接问题,或者您的共享文件系统后端存储失败。收集日志并联系红帽支持。

法律通告

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.