创建和管理实例

Red Hat OpenStack Platform 17.1

使用 CLI 创建和管理实例

OpenStack Documentation Team

摘要

本指南提供创建和管理实例的步骤。

前言

注意

您无法在实例创建过程中将基于角色的访问控制 (RBAC) 共享安全组直接应用到实例。要将 RBAC 共享安全组应用到实例,您必须首先创建端口,将共享安全组应用到该端口,然后将该端口分配给实例。请参阅向端口添加安全组

使开源包含更多

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

对红帽文档提供反馈

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

在 JIRA 中提供文档反馈

使用 Create Issue 表单对文档提供反馈。JIRA 问题将在 Red Hat OpenStack Platform Jira 项目中创建,您可以在其中跟踪您的反馈进度。

  1. 确保您已登录到 JIRA。如果您没有 JIRA 帐户,请创建一个帐户来提交反馈。
  2. 点击以下链接打开 Create Issue 页面: Create Issue
  3. 完成 SummaryDescription 字段。在 Description 字段中,包含文档 URL、章节或章节号以及问题的详细描述。不要修改表单中的任何其他字段。
  4. Create

第 1 章 关于实例

实例是在云内物理 Compute 节点上运行的独立虚拟机。若要启动实例,您需要一个类别,以及镜像或可引导卷。当使用镜像启动实例时,提供的镜像将变成基础镜像,其中包含安装有可引导操作系统的虚拟磁盘。每个实例都需要一个根磁盘,我们将其称为实例磁盘。计算服务(nova)调整实例磁盘的大小,以匹配您为实例指定的类别规格。

镜像由镜像服务(glance)管理。镜像服务镜像存储包含多个预定义的镜像。Compute 节点为实例提供可用的 vCPU、内存和本地磁盘资源。Block Storage 服务(cinder)提供预定义的卷。实例磁盘数据存储在临时存储中,当您删除实例时或由块存储服务提供的持久卷中删除。

计算服务是按需提供实例的中央组件。Compute 服务创建、调度和管理实例,并与用于身份验证的身份服务、用于启动实例的镜像的镜像服务以及用户和管理界面的 Dashboard 服务(horizon)交互。作为云用户,当您创建和管理实例时,您可以与计算服务交互。您可以使用 OpenStack CLI 或控制面板创建和管理实例。

第 2 章 实例引导源

实例的引导源可以是镜像或可引导卷。从镜像引导的实例实例磁盘由计算服务控制,并在实例被删除时删除。从卷引导的实例实例磁盘由块存储服务控制,并存储。

镜像包含可引导操作系统。镜像服务(glance)控制镜像存储管理。您可以从同一基础镜像启动任意数量的实例。每个实例从基础镜像的副本运行。对实例所做的任何更改都不会影响基础镜像。

可引导卷是从包含可引导操作系统的镜像创建的块存储卷。实例在实例被删除时,可以使用可引导卷来持久保留实例数据。在启动实例时,您可以使用现有的持久性卷。您还可以在从镜像启动实例时创建持久性存储,以便在删除实例时保存实例数据。从卷快照创建实例时,会自动创建一个新的持久性存储卷。

下图显示了在启动实例时可创建的实例磁盘和存储。创建的实际实例磁盘和存储取决于所使用的引导源和类别。

Instance storage overview

第 3 章 实例存储的类型

可用于实例的虚拟存储由用于启动实例的类别定义。以下虚拟存储资源可以与实例关联:

  • 实例磁盘
  • 临时存储
  • 交换存储
  • 持久性块存储卷
  • 配置驱动器

3.1. 实例磁盘

为存储实例数据创建的实例磁盘取决于您用于创建实例的引导源。从镜像引导的实例实例磁盘由计算服务控制,并在实例被删除时删除。从卷引导的实例实例磁盘是一个由块存储服务提供的持久卷。

3.2. 实例临时存储

您可以通过选择配置临时磁盘的类别来指定为实例创建临时磁盘。此临时存储是一个空的额外磁盘,可供实例使用。此存储值由实例类别定义。默认值为 0,表示没有创建辅助临时存储。

临时磁盘与 插入硬盘或缩略驱动器相同。它可作为块设备使用,您可以使用 lsblk 命令检查。您可以挂载并使用它,但通常使用块设备。您不能在附加到的实例外保留或引用该磁盘。

注意

实例快照中不包含临时存储数据,在 shelved 的实例上不可用,然后取消shelved。

3.3. 实例交换存储

您可以通过选择配置交换磁盘的类别来指定为实例创建交换磁盘。此交换空间是额外的磁盘,可供实例用作正在运行的操作系统的交换空间。

3.4. 实例块存储

块存储卷是永久存储,无论正在运行的实例的状态如何,都可供实例使用。您可以将多个块设备附加到实例,其中一个可以是可引导卷。

注意

当您将块存储卷用于实例磁盘数据时,块存储卷会针对任何实例重建保留,即使实例被重新构建使用需要创建新卷的新镜像。

3.5. 配置驱动器

您可以在启动时将配置驱动器附加到实例。将配置驱动器作为只读驱动器提供给实例。实例可以挂载此驱动器并从中读取文件。您可以使用 config 驱动器作为 cloud-init 信息的来源。当与 cloud-init 结合使用以进行服务器 bootstrap 时,配置驱动器很有用,以及您想要将大型文件传递给您的实例时非常有用。例如,您可以将 cloud-init 配置为自动挂载配置驱动器,并在初始实例引导期间运行设置脚本。使用 config-2 的卷标签创建配置驱动器,并在引导时附加到实例。传递给配置驱动器的任何额外文件的内容都添加到配置驱动器的 openstack/{version}/ 目录中的 user_data 文件中。cloud-init 从此文件检索用户数据。

第 4 章 实例的类别

实例类别是指定实例的虚拟硬件配置文件的资源模板。在启动实例时,您可以选择一个类别,以指定要分配给实例的虚拟资源。类别定义虚拟 CPU 的数量、RAM 大小、根磁盘大小和虚拟存储的大小(包括次要临时存储和交换磁盘)来创建实例。您可以从为云中项目定义的可用类别集合中选择该类别。

第 5 章 创建实例

在创建实例前,必须有其他 Red Hat OpenStack Platform (RHOSP)组件可用,如类别、引导源、网络、密钥对和安全组。这些组件在创建实例时使用,默认不可用。

当您创建实例时,您可以选择具有实例所需的可引导操作系统的引导源、具有实例所需的硬件配置文件的类别、您要将实例连接到的网络以及您需要的额外存储,如数据卷和临时存储。

5.1. 先决条件

  • 所需的镜像或卷作为引导源提供:

  • 可以使用类别来指定所需的 CPU、内存和存储容量。类别设置必须满足您选择的镜像指定的磁盘和内存大小的最低要求,否则实例将无法启动。
  • 所需的网络可用。有关如何创建网络的更多信息,请参阅配置 Red Hat OpenStack Platform 网络指南中的创建网络

5.2. 从镜像创建实例

您可以使用镜像作为引导源来创建实例。

流程

  1. 检索具有实例所需硬件配置集的类别的名称或 ID:

    $ openstack flavor list
    注意

    选择足够大小以便镜像成功引导的类别,否则实例将无法启动。

  2. 检索具有实例所需软件配置文件的镜像的名称或 ID:

    $ openstack image list

    如果不需要的镜像不可用,您可以下载或创建新镜像。有关如何创建或下载云镜像的详情,请参考 创建镜像

    注意

    如果您需要将超过 26 个卷附加到您的实例,则用于创建实例的镜像必须具有以下属性:

    • hw_scsi_model=virtio-scsi
    • hw_disk_bus=scsi
  3. 检索您要将实例连接到的网络的名称或 ID:

    $ openstack network list
  4. 创建实例:

    $ openstack server create --flavor <flavor> \
      --image <image> --network <network> \
      --wait myInstanceFromImage
    • <flavor > 替换为在第 1 步中获得的类别的名称或 ID。
    • <image > 替换为在第 2 步中获得的镜像的名称或 ID。
    • <network > 替换为在第 3 步中获得的网络的名称或 ID。您可以根据需要,使用 --network 选项将实例连接到多个网络。

5.3. 从可引导卷创建实例

您可以使用可引导卷作为引导源来创建实例。在出现故障时,您需要提高实例数据的可用性时,从卷引导您的实例。

注意

当您将块存储卷用于实例磁盘数据时,块存储卷会针对任何实例重建保留,即使实例被重新构建使用需要创建新卷的新镜像。

流程

  1. 检索具有实例所需软件配置文件的镜像的名称或 ID:

    $ openstack image list

    如果不需要的镜像不可用,您可以下载或创建新镜像。有关如何创建或下载云镜像的详情,请参考 创建镜像

    注意

    如果您需要将超过 26 个卷附加到您的实例,则用于创建实例的镜像必须具有以下属性:

    • hw_scsi_model=virtio-scsi
    • hw_disk_bus=scsi
  2. 从镜像创建可引导卷:

    $ openstack volume create --image <image> \
    --size <size_gb> --bootable myBootableVolume
    • <image > 替换为要写入卷的镜像名称或 ID,在第 1 步中获得。
    • <size_gb> 替换为卷的大小(以 GB 为单位)。
  3. 检索具有实例所需硬件配置集的类别的名称或 ID:

    $ openstack flavor list
  4. 检索您要将实例连接到的网络的名称或 ID:

    $ openstack network list
  5. 使用可引导卷创建实例:

    $ openstack server create --flavor <flavor> \
     --volume myBootableVolume --network <network> \
     --wait myInstanceFromVolume
    • <flavor > 替换为在第 3 步中获得的类别的名称或 ID。
    • <network > 替换为在第 4 步中获得的网络的名称或 ID。您可以根据需要,使用 --network 选项将实例连接到多个网络。

5.4. 使用 SR-IOV 网络接口创建实例

要创建具有单一根 I/O 虚拟化(SR-IOV)网络接口的实例,您需要创建所需的 SR-IOV 端口。

流程

  1. 检索具有实例所需硬件配置集的类别的名称或 ID:

    $ openstack flavor list
    注意

    选择足够大小以便镜像成功引导的类别,否则实例将无法启动。

    提示

    您可以通过选择具有所需策略的类别,指定应用于 PCI 透传设备和 SR-IOV 接口的实例的 NUMA 关联性策略。如需有关可用策略的更多信息,请参阅配置计算服务以进行实例创建指南中的类别元数据中的实例 PCI NUMA 关联性策略。如果您选择了带有 NUMA 关联性策略的类别,则您使用的镜像必须具有相同的 NUMA 关联性策略,或者没有 NUMA 关联性策略。

  2. 检索具有实例所需软件配置文件的镜像的名称或 ID:

    $ openstack image list

    如果不需要的镜像不可用,您可以下载或创建新镜像。有关如何创建或下载云镜像的详情,请参考 创建镜像

    提示

    您可以通过选择具有所需策略的镜像,指定应用于 PCI 透传设备和 SR-IOV 接口的实例的 NUMA 关联性策略。如需有关可用策略的更多信息,请参阅配置计算服务以进行实例创建指南中的类别元数据中的实例 PCI NUMA 关联性策略。如果选择具有 NUMA 关联性策略的镜像,则您使用的类别必须具有相同的 NUMA 关联性策略,或者没有 NUMA 关联性策略。

  3. 检索您要将实例连接到的网络的名称或 ID:

    $ openstack network list
  4. 创建 SR-IOV 接口所需的端口类型:

    $ openstack port create --network <network> \
     --vnic-type <vnic_type> mySriovPort
    • <network > 替换为在第 3 步中获得的网络的名称或 ID。
    • <vnic_type > 替换为以下值之一:

      • direct :创建一个直接模式 SR-IOV 虚拟功能(VF)端口。
      • 直接物理 :创建直接模式 SR-IOV 物理功能(PF)端口。
      • macvtap :创建一个间接模式 SR-IOV VF 端口,它使用 macvtap 向实例公开 virtio 接口。
  5. 创建实例:

    $ openstack server create --flavor <flavor> \
      --image <image> --port <port> \
      --wait mySriovInstance
    • <flavor > 替换为在第 1 步中获得的类别的名称或 ID。
    • <image > 替换为在第 2 步中获得的镜像的名称或 ID。
    • <port > 替换为在第 4 步中创建的端口的名称或 ID。

5.5. 在端口上创建带有 NUMA 关联性的实例

要在使用所需 NUMA 关联性策略创建端口上使用 NUMA 关联性创建实例,可在创建实例时指定端口。

注意

端口 NUMA 关联性策略的优先级高于类型、镜像和 PCI NUMA 关联性策略。云操作员可以为每个 PCI 透传设备设置默认 NUMA 关联性策略。您可以使用实例类别、镜像或端口来覆盖应用到实例的默认 NUMA 关联性策略。

先决条件

  • port-numa-affinity-policy 扩展必须在云平台中启用。
  • 服务插件必须在 Networking 服务(neutron)中配置。

流程

  1. 使用您需要的 NUMA 关联性策略创建端口:

    $ openstack port create --network <network> \
      [--numa-policy-required | --numa-policy-preferred | --numa-policy-legacy] \
      myNUMAAffinityPort
    • 将 < network > 替换为您要连接实例的租户网络的名称或 ID。
    • 使用以下选项之一指定要应用到端口的 NUMA 关联性策略:

      • --NUMA-policy-required - 调度此端口所需的 NUMA 关联性策略。
      • --NUMA-policy-preferred - 首选 NUMA 关联性策略来调度此端口。
      • --NUMA-policy-legacy - 使用传统模式调度此端口的 NUMA 关联性策略。
  2. 创建实例:

    $ openstack server create --flavor <flavor> \
      --image <image> --port <port> \
      --wait myNUMAAffinityInstance
    • 将 & lt;flavor > 替换为具有实例所需硬件配置集的类别名称或 ID。
    • 将 & lt;image > 替换为具有实例所需软件配置文件的镜像的名称或 ID。
    • <port > 替换为在第 1 步中创建的端口的名称或 ID。

5.6. 其他资源

第 6 章 创建具有保证最小带宽 QoS 的实例

您可以使用服务质量(QoS)策略创建请求保证最小带宽的实例。

具有保证最小带宽规则的 QoS 策略被分配给特定物理网络上的端口。当您创建使用配置端口的实例时,计算调度服务会为满足此请求的实例选择主机。计算调度服务会在选择部署实例的主机之前,检查放置服务中由其他实例保留的带宽数量。

限制/限制

  • 您只能在创建新实例时分配保证最小带宽 QoS 策略。您无法为已在运行的实例分配保证最小带宽 QoS 策略,因为计算服务仅在创建或移动操作期间更新实例的资源使用情况,这意味着无法保证实例可用的最少带宽。

先决条件

  • 具有最低带宽规则的 QoS 策略可用。如需更多信息,请参阅配置 Red Hat OpenStack Platform 网络指南中的配置服务质量(QoS)策略

流程

  1. 列出可用的 QoS 策略:

    (overcloud)$ openstack network qos policy list
    ----------------------------------------------------------------+
    | ID                                   | Name    | Shared | Default | Project                          |
    ----------------------------------------------------------------+
    | 6d771447-3cf4-4ef1-b613-945e990fa59f | policy2 | True   | False   | ba4de51bf7694228a350dd22b7a3dc24 |
    | 78a24462-e3c1-4e66-a042-71131a7daed5 | policy1 | True   | False   | ba4de51bf7694228a350dd22b7a3dc24 |
    | b80acc64-4fc2-41f2-a346-520d7cfe0e2b | policy0 | True   | False   | ba4de51bf7694228a350dd22b7a3dc24 |
    ----------------------------------------------------------------+
  2. 检查每个可用策略的规则,以确定哪个最小带宽:

    (overcloud)$ openstack network qos policy show policy0
    ----------------------------------------------------------------------------------------------------+
    | Field       | Value                                                                                 |
    ----------------------------------------------------------------------------------------------------+
    | description |                                                                                                                                                                                                                                                                                                                                                                     |
    | id          | b80acc64-4fc2-41f2-a346-520d7cfe0e2b                                                                                                                                                                                                                                                                                                                                |
    | is_default  | False                                                                                                                                                                                                                                                                                                                                                               |
    | location    | cloud=', project.domain_id=, project.domain_name='Default, project.id=ba4de51bf7694228a350dd22b7a3dc24, project.name=admin, region_name=regionOne, zone=                                                                                                                                                                                                    |
    | name        | policy0                                                                                                                                                                                                                                                                                                                                                             |
    | project_id  | ba4de51bf7694228a350dd22b7a3dc24                                                                                                                                                                                                                                                                                                                                    |
    | rules       | [{min_kbps: 100000, direction: egress, id: d46218fe-9218-4e96-952b-9f45a5cb3b3c, qos_policy_id: b80acc64-4fc2-41f2-a346-520d7cfe0e2b, type: minimum_bandwidth}, {min_kbps: 100000, direction: ingress, id: 1202c4e3-a03a-464c-80d5-0bf90bb74c9d, qos_policy_id: b80acc64-4fc2-41f2-a346-520d7cfe0e2b, type: minimum_bandwidth}] |
    | shared      | True                                                                                                                                                                                                                                                                                                                                                                |
    | tags        | []                                                                                                                                                                                                                                                                                                                                                                  |
    ----------------------------------------------------------------------------------------------------+
  3. 从适当的策略创建端口:

    (overcloud)$ openstack port create port-normal-qos --network net0 --qos-policy policy0
  4. 创建一个实例,指定要使用的 NIC 端口:

    $ openstack server create --flavor cirros256 --image cirros-0.3.5-x86_64-disk --nic port-id=port-normal-qos --wait qos_instance

    输出中的"ACTIVE"状态表示您已在能够提供请求的最低带宽的主机上成功创建了实例。

6.1. 从实例中删除保证最小带宽 QoS

如果要将保证最小带宽 QoS 策略与实例分离,您可以分离接口。

流程

  • 要分离接口,请输入以下命令:

    $ openstack server remove port <vm_name|vm_id> <port_name|port_id>

第 7 章 使用 VDPA 接口创建实例

您可以通过请求具有 vNIC 类型的 VDPA 的端口,使用 VDPA 接口创建实例。

限制

  • 您无法挂起或实时迁移具有 VDPA 接口的实例。
  • 您无法将 VDPA 接口从实例分离,然后将其重新关联到实例。

流程

  1. 创建映射到物理网络的网络:

    $ openstack network create vdpa_network \
     --provider-physical-network tenant \
     --provider-network-type vlan \
     --provider-segment 1337
  2. 为网络创建子网:

    $ openstack subnet create vdpa_subnet \
     --network vdpa_net1 \
     --subnet-range 192.0.2.0/24 \
     --dhcp
  3. 从支持 VDPA 的 NIC 创建端口:

    $ openstack port create vdpa_direct_port \
     --network vdpa_network \
     --vnic-type vdpa \
  4. 创建一个实例,指定要使用的 NIC 端口:

    $ openstack server create vdpa_instance \
     --flavor cirros256 --image cirros-0.3.5-x86_64-disk \
     --nic port-id=vdpa_direct_port --wait

    输出中的"ACTIVE"状态表示您已在可以提供请求的 VDPA 接口的主机上成功创建了实例。

第 8 章 更新实例

您可以从正在运行的实例中添加和删除其他资源,如持久性卷存储、网络接口或公共 IP 地址。您还可以更新实例元数据以及实例所属的安全组。

8.1. 将网络附加到实例

您可以将网络附加到正在运行的实例。将网络附加到实例时,计算服务会在网络上为实例创建端口。当您要使用默认安全组且网络上只有一个子网时,请使用网络将网络接口附加到实例。

流程

  1. 确定可用的网络,并记录您要附加到您的实例的网络的名称或 ID:

    (overcloud)$ openstack network list

    如果不需要的网络不可用,请创建一个新网络:

    (overcloud)$ openstack network create <network>
  2. 将网络附加到您的实例:

    $ openstack server add network [--tag <tag_name>] <instance> <network>
    • 可选:包含 --tag 选项,将 <tag_name > 替换为虚拟 NIC 设备的标签名称。
    • 将 & lt;instance > 替换为您要将网络附加到的实例的名称或 ID。
    • &lt;network> 替换为您要附加到实例的网络的名称或 ID。

      提示

      要在服务器创建时标记虚拟设备,请参阅 标记虚拟设备

其他资源

  • 命令行界面参考 中的 OpenStack network create 命令。
  • 配置 Red Hat OpenStack Platform 网络指南中的创建网络

8.2. 从实例分离网络

您可以从实例分离网络。

注意

分离网络分离所有网络端口。如果实例在网络上有多个端口,并且只想分离其中一个端口,请按照 从实例流程分离端口 来分离端口。

流程

  1. 识别附加到实例的网络:

    (overcloud)$ openstack server show <instance>
  2. 将网络从实例分离:

    $ openstack server remove network <instance> <network>
    • &lt;instance> 替换为您要从中删除网络的实例的名称或 ID。
    • 将 & lt;network > 替换为您要从实例中删除的网络的名称或 ID。

8.3. 将端口附加到实例

您可以使用端口将网络接口附加到正在运行的实例。一次只能将端口附加到一个实例。当您要使用自定义安全组或网络上有多个子网时,请使用端口将网络接口附加到实例。

提示

如果您使用网络附加网络接口,则会自动创建端口。如需更多信息 ,请参阅将网络附加到实例

注意

Red Hat OpenStack Platform (RHOSP)为每个实例提供最多 24 个接口。默认情况下,您可以在实例中添加 16 PCIe 设备,然后才能重启实例来添加更多。RHOSP 管理员可以使用 NovaLibvirtNumPciePorts 参数配置可添加到实例的 PCIe 设备数量,然后才能重启实例来添加更多设备。

先决条件

  • 如果将带有 SR-IOV vNIC 的端口附加到实例,则适当物理网络的主机上必须有一个空闲的 SR-IOV 设备,实例必须具有可用的 PCIe 插槽。

流程

  1. 创建您要附加到实例的端口:

    $ openstack port create --network <network> [--vnic-type <vnic-type>] <port>
    • <network > 替换为要在其上创建端口的网络名称或 ID。
    • 可选: 要创建 SR-IOV 端口,将 & lt;vnic-type > 替换为以下值之一:

      • direct :创建一个直接模式 SR-IOV 虚拟功能(VF)端口。
      • 直接物理 :创建直接模式 SR-IOV 物理功能(PF)端口。
      • macvtap :创建一个通过 macvtap 设备附加到实例的 SR-IOV 端口。
    • &lt;port> 替换为您要附加到实例的端口的名称或 ID。
  2. 将端口附加到您的实例:

    $ openstack server add port <instance> <port>
    • 将 & lt;instance > 替换为您要将端口附加到的实例的名称或 ID。
    • &lt;port> 替换为您要附加到实例的端口的名称或 ID。
  3. 验证端口是否已附加到您的实例中:

    $ openstack port list --device-id <instance_UUID>

    <instance_UUID > 替换为您要将端口附加到的实例的 UUID。

其他资源

8.4. 从实例分离端口

您可以从实例分离端口。

流程

  1. 识别附加到实例的端口:

    (overcloud)$ openstack server show <instance>
  2. 从实例分离端口:

    $ openstack server remove port <instance> <port>
    • &lt;instance> 替换为您要从中删除端口的实例的名称或 ID。
    • 将 & lt;port > 替换为您要从实例中删除的端口的名称或 ID。

8.5. 将卷附加到实例

您可以将卷附加到持久性存储的实例。您可以一次将卷附加到一个实例,除非卷已配置为 multi-attach 卷。有关创建多附加卷的更多信息 ,请参阅可以附加到多个实例 的卷。

先决条件

  • 要附加一个多附件卷,环境变量 OS_COMPUTE_API_VERSION 被设置为 2.60 或更高版本。
  • 实例完全可正常运行,或者完全停止。当实例处于启动或关闭过程中,您无法将卷附加到实例。
  • 要将超过 26 个卷附加到您的实例,您用于创建实例的镜像必须具有以下属性:

    • hw_scsi_model=virtio-scsi
    • hw_disk_bus=scsi

流程

  1. 确定可用的卷,并记录您要附加到您的实例的卷的名称或 ID:

    (overcloud)$ openstack volume list
  2. 将卷附加到您的实例中:

    $ openstack server add volume [--tag <tag_name>] <instance> <volume>
    • 可选:包含 --tag 选项,将 < tag_name > 替换为虚拟存储设备的标签名称。
    • &lt;instance> 替换为您要将卷附加到的实例的名称或 ID。
    • &lt;volume> 替换为您要附加到实例的卷的名称或 ID。

      注意

      要在服务器创建时标记虚拟设备,请参阅 标记虚拟设备

      注意

      如果命令返回以下错误,您选择附加到实例的卷是一个多附件卷,因此您必须使用 Compute API 版本 2.60 或更高版本:

      Multiattach volumes are only supported starting with compute API version 2.60. (HTTP 400) (Request-ID: req-3a969c31-e360-4c79-a403-75cc6053c9e5)

      您可以将环境变量 OS_COMPUTE_API_VERSION=2.72 设置,或者在将卷添加到实例时包含 --os-compute-api-version 参数:

      $ openstack --os-compute-api-version 2.72 server add volume <instance> <volume>
    提示

    指定 --os-compute-api-version 2.20 或更高版本,将卷添加到状态为 SHELVED 或 SHEL VED_OFFLOADED 的实例

  3. 确认卷已附加到实例或实例:

    $ openstack volume show <volume>

    <volume > 替换为要显示的卷的名称或 ID。

    输出示例:

    +-----------------------------------------------------+----------------------+---------+-----+-----------------------------------------------------------------------------------------------+
    | ID                                                             | Name                | Status | Size| Attached to
    +-----------------------------------------------------+---------------------+---------+------+---------------------------------------------------------------------------------------------+
    | f3fb92f6-c77b-429f-871d-65b1e3afa750 | volMultiattach | in-use |   50 | Attached to instance1 on /dev/vdb Attached to instance2 on /dev/vdb  |
    +-----------------------------------------------------+----------------------+---------+-----+-----------------------------------------------------------------------------------------------+

8.6. 查看附加到实例的卷

您可以查看附加到特定实例的卷。

先决条件

  • 您使用 python-openstackclient 5.5.0

流程

  • 列出附加到实例的卷:

    $ openstack server volume list <instance>
    +---------------------+----------+---------------------+-----------------------+
    | ID                  | Device   | Server ID           | Volume ID             |
    +---------------------+----------+---------------------+-----------------------+
    | 1f9dcb02-9a20-4a4b- | /dev/vda | ab96b635-1e63-4487- | 1f9dcb02-9a20-4a4b-9f |
    | 9f25-c7846a1ce9e8   |          | a85c-854197cd537b   | 25-c7846a1ce9e8       |
    +---------------------+----------+---------------------+-----------------------+

8.7. 从实例分离卷

您可以从实例分离卷。

注意

分离网络分离所有网络端口。如果实例在网络上有多个端口,并且只想分离其中一个端口,请按照 从实例流程分离端口 来分离端口。

先决条件

  • 实例完全可正常运行,或者完全停止。当实例处于引导或关闭过程中,您无法将卷从实例分离。

流程

  1. 识别附加到实例的卷:

    (overcloud)$ openstack server show <instance>
  2. 将卷从实例分离:

    $ openstack server remove volume <instance> <volume>
    • &lt;instance> 替换为您要从中删除卷的实例的名称或 ID。
    • 将 & lt;volume > 替换为您要从实例中删除的卷的名称或 ID。

      注意

      指定 --os-compute-api-version 2.20 或更高版本,从状态为 SHELVEDSHELVED_OFFLOADED 的实例中删除卷。

第 9 章 为实例提供公共访问权限

新实例自动接收具有实例分配到的网络上的固定 IP 地址的端口。此 IP 地址是私有的,并在实例被删除之前永久与实例关联。固定 IP 地址用于实例之间的通信。

您可以将公共实例直接连接到直接分配给实例的公共 IP 地址的共享外部网络。如果您在私有云中工作,这将非常有用。

您还可以通过具有到外部提供商网络的路由连接的项目网络提供对实例的公共访问。如果您在公有云或公共 IP 地址有限的情况下,这是首选的方法。要通过项目网络提供公共访问权限,项目网络必须连接到将网关设置为外部网络的路由器。要使外部流量到达实例,云用户必须将浮动 IP 地址与实例关联。

要提供对实例的访问,无论是连接到共享外部网络还是路由提供商网络,您必须使用具有所需协议的安全组,如 SSH、ICMP 或 HTTP。您还必须在创建过程中将密钥对传递给实例,以便您可以远程访问实例。

9.1. 先决条件

  • 外部网络必须具有子网来提供浮动 IP 地址。
  • 项目网络必须连接到将外部网络配置为网关的路由器。
  • 项目必须可以使用具有所需协议的安全组。如需更多信息,请参阅配置 Red Hat OpenStack Platform 网络中的配置安全组

9.2. 使用安全组和密钥对保护实例访问

安全组是 IP 过滤规则的集合,用于控制网络和协议访问实例,如 ICMP,允许您 ping 实例,以及允许您连接实例的 SSH。

所有项目都有一个名为 default 的默认安全组,当您没有为实例指定安全组时使用。默认情况下,默认安全组允许所有传出流量,并拒绝来自同一安全组中实例以外的任何来源的所有传入流量。您可以在实例创建过程中将一个或多个安全组应用到实例。要将安全组应用到正在运行的实例,请将安全组应用到与实例连接的端口。

如需更多有关安全组的信息,请参阅配置 Red Hat OpenStack Platform 网络中的配置安全组

注意

您无法在实例创建过程中将基于角色的访问控制 (RBAC) 共享安全组直接应用到实例。要将 RBAC 共享安全组应用到实例,您必须首先创建端口,将共享安全组应用到该端口,然后将该端口分配给实例。请参阅向端口添加安全组

密钥对是 SSH 或 x509 凭证,它们在启动时注入到实例中,以启用对实例的远程访问。您可以在 RHOSP 中创建新密钥对,或导入现有的密钥对。每个用户应至少有一个密钥对。密钥对可用于多个实例。

注意

您无法在项目中的用户间共享密钥对,因为每个密钥对都属于创建或导入密钥对的单独用户,而不是与项目共享。

9.2.1. 将安全组添加到端口

默认安全组 应用到没有指定替代安全组的实例。您可以将其他安全组应用到正在运行的实例上的端口。

流程

  1. 确定您要将安全组应用到的实例上的端口:

    $ openstack port list --server myInstancewithSSH
  2. 将安全组应用到端口:

    $ openstack port set --security-group <sec_group> <port>

    将 &lt ;sec_group > 替换为您要应用到运行中实例上端口的安全组的名称或 ID。您可以根据需要,多次使用 --security-group 选项来应用多个安全组。

9.2.2. 从端口中删除安全组

要从端口中删除安全组,您需要首先删除所有安全组,然后重新添加您要分配给端口的安全组。

流程

  1. 列出与端口关联的所有安全组,并记录您要与端口关联的安全组 ID:

    $ openstack port show <port>
  2. 删除与端口关联的所有安全组:

    $ openstack port set --no-security-group <port>
  3. 将安全组重新应用到端口:

    $ openstack port set --security-group <sec_group> <port>

    将 &lt ;sec_group > 替换为您要重新应用到运行实例上端口的安全组 ID。您可以根据需要,多次使用 --security-group 选项来应用多个安全组。

9.2.3. 生成一个新的 SSH 密钥对

您可以创建新的 SSH 密钥对,以便在项目内使用。

注意

使用 x509 证书为 Windows 实例创建密钥对。

流程

  1. 创建密钥对,并将私钥保存到本地 .ssh 目录中:

    $ openstack keypair create <keypair> > ~/.ssh/<keypair>.pem

    <keypair > 替换为您的新密钥对的名称。

  2. 保护私钥:

    $ chmod 600 ~/.ssh/<keypair>.pem

9.2.4. 导入现有的 SSH 密钥对

您可以在创建新密钥对时提供公钥文件,将 SSH 密钥导入到您在 Red Hat OpenStack Platform (RHOSP)外创建的项目中。

流程

  1. 从现有密钥文件创建密钥对,并将私钥保存到本地 .ssh 目录中:

    • 要从现有公钥文件导入密钥对,请输入以下命令:

      $ openstack keypair create --public-key ~/.ssh/<public_key>.pub \
       <keypair> > ~/.ssh/<keypair>.pem
      • 将 < public_key > 替换为您要用于创建密钥对的公钥文件的名称。
      • <keypair > 替换为您的新密钥对的名称。
    • 要从现有的私钥文件导入密钥对,请输入以下命令:

      $ openstack keypair create --private-key ~/.ssh/<private_key> \
       <keypair> > ~/.ssh/<keypair>.pem
      • 将 < private_key > 替换为您要用于创建密钥对的公钥文件的名称。
      • <keypair > 替换为您的新密钥对的名称。
  2. 保护私钥:

    $ chmod 600 ~/.ssh/<keypair>.pem

9.2.5. 其他资源

9.3. 为实例分配浮动 IP 地址

您可以为实例分配一个公共浮动 IP 地址,以启用与云外的网络的通信,包括互联网。云管理员为外部网络配置可用的浮动 IP 地址池。您可以从这个池中分配浮动 IP 地址到您的项目,然后将浮动 IP 地址与您的实例关联。

项目对浮动 IP 地址有有限的配额,可供项目中的实例使用,默认为 50。因此,当不再需要 IP 地址时,可以重复使用发行版本 IP 地址。

先决条件

  • 实例必须在外部网络上,或者连接到配置了网关的外部网络的路由器上的项目网络。
  • 实例要连接的外部网络必须具有子网来提供浮动 IP 地址。

流程

  1. 检查分配给当前项目的浮动 IP 地址:

    $ openstack floating ip list

    如果没有要使用的浮动 IP 地址,请从外部网络分配池中分配一个浮动 IP 地址到当前项目:

    $ openstack floating ip create <provider-network>

    将 &lt ;provider-network > 替换为您要用来提供外部访问的外部网络的名称或 ID。

    提示

    默认情况下,浮动 IP 地址是从外部网络池随机分配的。云管理员可以使用 --floating-ip-address 选项从外部网络分配特定的浮动 IP 地址。

  2. 为实例分配浮动 IP 地址:

    $ openstack server add floating ip [--fixed-ip-address <ip_address>] \
     <instance> <floating_ip>
    • 将 & lt;instance > 替换为您要提供公共访问权限的实例的名称或 ID。
    • <floating_ip > 替换为您要分配给实例的浮动 IP 地址。
    • 可选:将 < ip_address > 替换为您要将浮动 IP 附加到的接口的 IP 地址。默认情况下,这会将浮动 IP 地址附加到第一个端口。
  3. 验证浮动 IP 地址是否已分配给实例:

    $ openstack server show <instance>

其他资源

9.4. 从实例取消关联浮动 IP 地址

当实例不再需要公共访问权限时,将其与实例解除关联,并将它返回到分配池。

流程

  1. 从实例取消关联浮动 IP 地址:

    $ openstack server remove floating ip <instance> <ip_address>
    • 将 & lt;instance > 替换为您要从中删除公共访问权限的实例的名称或 ID。
    • <floating_ip > 替换为分配给实例的浮动 IP 地址。
  2. 将浮动 IP 地址释放回分配池:

    $ openstack floating ip delete <ip_address>
  3. 确认浮动 IP 地址已被删除,不再可用于分配:

    $ openstack floating ip list

9.5. 创建具有 SSH 访问的实例

在创建实例时,您可以通过指定密钥对来提供实例的 SSH 访问。密钥对是 SSH 或 x509 凭证,它们在启动时注入到实例中。每个项目应至少有一个密钥对。密钥对属于单个用户,而不是项目。

注意

在创建实例后,您无法将密钥对与实例关联。

您可以在实例创建过程中直接将安全组应用到实例,或应用到正在运行的实例上的端口。

注意

您无法在实例创建过程中将基于角色的访问控制 (RBAC) 共享安全组直接应用到实例。要将 RBAC 共享安全组应用到实例,您必须首先创建端口,将共享安全组应用到该端口,然后将该端口分配给实例。请参阅向端口添加安全组

先决条件

  • 您可以使用一个密钥对来通过 SSH 连接到您的实例。如需更多信息,请参阅生成新 SSH 密钥对
  • 您计划在其中创建实例的网络必须是外部网络,或者连接到将外部网络配置为网关的路由器连接的项目网络。如需更多信息,请参阅配置 Red Hat OpenStack Platform 网络指南中的 添加路由器
  • 实例连接到的外部网络必须具有子网来提供浮动 IP 地址。
  • 安全组允许 SSH 访问实例。如需更多信息,请参阅使用安全组和密钥对保护实例访问
  • 实例基于的镜像包含 cloud-init 软件包,用于将 SSH 公钥注入到实例中。
  • 可分配给您的实例的浮动 IP 地址。有关更多信息,请参阅将浮动 IP 地址分配给实例

流程

  1. 检索具有实例所需硬件配置集的类别的名称或 ID:

    $ openstack flavor list
    注意

    选择足够大小以便镜像成功引导的类别,否则实例将无法启动。

  2. 检索具有实例所需软件配置文件的镜像的名称或 ID:

    $ openstack image list

    如果不需要的镜像不可用,您可以下载或创建新镜像。有关创建或下载云镜像的详情,请参考 创建镜像

  3. 检索您要将实例连接到的网络的名称或 ID:

    $ openstack network list
  4. 检索您要用于远程访问实例的密钥对名称:

    $ openstack keypair list
  5. 创建具有 SSH 访问的实例:

    $ openstack server create --flavor <flavor> \
      --image <image> --network <network> \
      [--security-group <secgroup>] \
      --key-name <keypair> --wait myInstancewithSSH
    • <flavor > 替换为在第 1 步中获得的类别的名称或 ID。
    • <image > 替换为在第 2 步中获得的镜像的名称或 ID。
    • <network > 替换为在第 3 步中获得的网络的名称或 ID。您可以根据需要,使用 --network 选项将实例连接到多个网络。
    • 可选: 默认安全组 应用到没有指定替代安全组的实例。您可以在实例创建过程中直接将替代安全组应用到实例,或应用到正在运行的实例上的端口。使用 --security-group 选项指定创建实例时的替代安全组。有关将安全组添加到正在运行的实例上的端口的详情,请参考 将安全组添加到端口
    • <keypair > 替换为在第 4 步中获取的密钥对的名称或 ID。
  6. 为实例分配一个浮动 IP 地址:

    $ openstack server add floating ip myInstancewithSSH <floating_ip>

    <floating_ip > 替换为您要分配给实例的浮动 IP 地址。

  7. 使用自动创建的 cloud-user 帐户来验证您可以使用 SSH 登录到您的实例:

    $ ssh -i ~/.ssh/<keypair>.pem cloud-user@<floatingIP>
    [cloud-user@demo-server1 ~]$

9.6. 其他资源

第 10 章 连接到实例

当您允许实例安全组规则中的协议时,您可以使用 SSH 或 WinRM 等远程 shell 从云外部访问实例。您还可以直接连接到实例的控制台,以便在网络连接失败时也可以调试。

注意

如果您没有向实例提供密钥对,或者为实例分配安全组,则只能使用 VNC 从云内部访问实例。您无法 ping 实例。

10.1. 访问实例控制台

您可以通过在浏览器中输入 VNC 控制台 URL 来直接连接到实例的 VNC 控制台。

流程

  1. 要显示实例的 VNC 控制台 URL,请输入以下命令:

    $ openstack console url show <vm_name>
    +-------+------------------------------------------------------+
    | Field | Value					     	        |
    +-------+------------------------------------------------------+
    | type  | novnc					               |
    | url	| http://172.25.250.50:6080/vnc_auto.html?token=       |
    |	| 962dfd71-f047-43d3-89a5-13cb88261eb9         	  |
    +-------+-------------------------------------------------------+
  2. 要直接连接到 VNC 控制台,请在浏览器中输入显示的 URL。

10.2. 登录实例

您可以远程登录到公共实例。

先决条件

  • 您有实例的密钥对证书。创建密钥对时下载证书。如果您没有自行创建密钥对,请询问您的管理员。
  • 实例配置为公共实例。有关公共实例要求的更多信息,请参阅 提供实例的公共访问
  • 您有云用户帐户。

流程

  1. 检索您要登录的实例的浮动 IP 地址:

    $ openstack server show <instance>

    将 & lt;instance > 替换为您要连接的实例的名称或 ID。

  2. 使用自动创建的 cloud-user 帐户登录到您的实例:

    $ ssh -i ~/.ssh/<keypair>.pem cloud-user@<floatingIP>
    [cloud-user@demo-server1 ~]$
    • <keypair > 替换为密钥对的名称。
    • <floating_ip > 替换为实例的浮动 IP 地址。

      提示

      您可以使用以下命令在没有浮动 IP 地址的情况下登录实例:

      $ openstack server ssh --login cloud-user \
       --identity ~/.ssh/<keypair>.pem --private <instance>
      • <keypair > 替换为密钥对的名称。
      • 将 & lt;instance > 替换为您要连接的实例的名称或 ID。

第 11 章 管理实例

您可以在实例上执行管理操作,如重新定义实例大小或清空实例。有关管理操作的完整列表,请参阅 实例管理操作

11.1. 调整实例大小

如果需要增加或减少实例的内存或 CPU 计数,您可以调整实例大小。若要调整实例大小,请为具有所需容量的实例选择一个新类别。重新调整实例重建并重启实例的大小。

流程

  1. 检索您要调整大小的实例的名称或 ID:

    $ openstack server list
  2. 检索您要用来调整实例大小的新类别的名称或 ID:

    $ openstack flavor list
    注意

    在调整实例大小时,您必须使用新类别。

  3. 调整实例大小:

    $ openstack server resize --flavor <flavor> \
      --wait <instance>
    • <flavor > 替换为在第 2 步中获得的类别的名称或 ID。
    • <instance > 替换为您要调整大小的实例的名称或 ID。
    注意

    调整大小可能需要时间。实例上的操作系统在实例关闭前执行受控的关闭,实例会调整大小。在此期间,实例状态为 RESIZE

    $ openstack server list
    +----------------------+----------------+--------+----------------------------+
    | ID                   | Name           | Status | Networks                                |
    +----------------------+----------------+--------+----------------------------+
    | 67bc9a9a-5928-47c... | myCirrosServer | RESIZE | admin_internal_net=192.168.111.139    |
    +----------------------+----------------+--------+----------------------------+
  4. 完成调整大小后,实例状态将变为 VERIFY_RESIZE。现在,您必须确认或恢复调整大小:

    • 要确认调整大小,请输入以下命令:

      $ openstack server resize confirm <instance>
    • 要恢复调整大小,请输入以下命令:

      $ openstack server resize revert <instance>

      实例恢复为原始类别,状态更改为 ACTIVE

注意

如果您没有在配置的时间范围内确认或恢复,云可能会配置为自动确认实例大小。

11.2. 创建实例快照

快照是一个镜像,用于捕获实例的运行磁盘状态。您可以对实例执行快照,以创建可用作模板的镜像来创建新实例。通过快照,您可以从另一个实例创建新实例,并恢复实例的状态。如果删除了基于快照的实例,您可以使用快照镜像创建新实例到与快照相同的状态。

流程

  1. 检索您要创建快照的实例的名称或 ID:

    $ openstack server list
  2. 创建快照:

    $ openstack server image create --name <image_name> <instance>
    • <image_name > 替换为新快照镜像的名称。
    • 将 & lt;instance > 替换为您要从中创建快照的实例的名称或 ID。
  3. 可选: 要在使用实例快照作为模板创建新实例时,要确保磁盘状态一致,请启用 QEMU 客户机代理,并通过向快照镜像中添加以下元数据来指定在快照处理过程中必须静止文件系统:

    $ openstack image set --property hw_qemu_guest_agent=yes \
     --property os_require_quiesce=yes <image_name>

    QEMU 客户机代理是一个后台进程,可帮助管理应用程序执行实例操作系统级别命令。启用此代理向实例添加另一个设备,它使用 PCI 插槽,并限制您可以分配给实例的其他设备数量。它还会导致 Windows 实例显示有关未知硬件设备的警告信息。

11.3. 停用实例

在紧急情况下,如系统故障或访问失败,您可以将实例置于救援模式。这会关闭实例,使用新实例磁盘重启它,并将原始实例磁盘和配置驱动器挂载为重启实例中的卷。您可以连接到重启的实例,以查看原始实例磁盘,以修复系统并恢复您的数据。

流程

  1. 执行实例救援:

    $ openstack server rescue [--image <image>] <instance>
    • 可选: 默认情况下,实例从云管理员提供的救援镜像引导,或者原始实例镜像的新副本。使用 --image 选项指定在救援模式中重启实例时要使用的替代镜像。
    • 将 & lt;instance > 替换为您要救援的实例的名称或 ID。
  2. 连接到 rescued 实例,以修复问题。
  3. 从正常引导磁盘重启实例:

    $ openstack server unrescue <instance>

11.4. 填充实例

如果您有一个不使用的实例,但您不想删除的实例,则 shelving 非常有用。当您粘贴一个实例时,您需要保留实例数据和资源分配,但清除实例内存。根据云配置,她的实例会立即或经过时间延迟移到 SHELVED_OFFLOADED 状态。当 SHELVED_OFFLOADED 时,实例数据和资源分配会被删除。

当您填充实例时,计算服务会生成快照镜像来捕获实例的状态,并以以下格式为镜像分配一个名称: < instance>-shelved。当实例被删除时,会删除此快照镜像。

如果您不再需要一个 shelved 实例,您可以将其删除。您可以一次检查多个实例。

流程

  1. 检索您要 shelve 的实例的名称或 ID:

    $ openstack server list
  2. 填充实例或实例:

    $ openstack server shelve <instance> [<instance> ...]

    将 & lt;instance > 替换为您要 shelve 的实例的名称或 ID。您可以根据需要指定多个实例来 shelve。

  3. 验证实例是否已 shelved:

    $ openstack server list

    shelved 实例的状态为 SHELVED_OFFLOADED

11.5. 实例管理操作

创建实例后,您可以执行以下管理操作。

表 11.1. 管理操作

操作描述命令

停止实例

停止实例。

OpenStack 服务器停止

启动一个实例

启动已停止的实例。

OpenStack 服务器启动

暂停正在运行的实例

立即暂停正在运行的实例。实例的状态存储在内存中(RAM)。已暂停的实例继续以冻结状态运行。您不会被提示您确认暂停操作。

OpenStack 服务器 pause

恢复运行暂停的实例

立即恢复暂停的实例。您不会被提示确认恢复操作。

OpenStack 服务器取消暂停

挂起正在运行的实例

立即暂停正在运行的实例。实例的状态存储在实例磁盘上。您不会被提示确认 suspend 操作。

OpenStack 服务器挂起

恢复运行挂起的实例

立即恢复暂停的实例。实例的状态存储在实例磁盘上。您不会被提示确认恢复操作。

OpenStack 服务器恢复

删除实例

永久销毁实例。您不会被提示您确认 destroy 操作。除非云已配置为启用软删除,否则删除的实例将无法恢复。

注意

删除实例不会删除其附加的卷。您必须单独删除附加的卷。如需更多信息,请参阅 配置持久性存储 指南中的 删除块存储服务卷

OpenStack server delete

编辑实例元数据

您可以使用实例元数据来指定实例的属性。如需更多信息,请参阅 创建自定义实例

openstack server set --property <key=value> [--property <key=value>] <instance>

添加安全组

将指定的安全组添加到实例。

OpenStack 服务器添加安全组

删除安全组

从实例移除指定的安全组。

OpenStack remove 安全组

救援实例

在紧急情况下,如系统故障或访问失败,您可以将实例置于救援模式。这会关闭实例,并将根磁盘挂载到临时服务器。您可以连接到临时服务器来修复系统并恢复您的数据。

也可以将正在运行的实例重新引导到救援模式。例如,如果实例的文件系统损坏,可能需要此操作。

OpenStack 服务器救援

恢复救援实例

重启救援实例。

OpenStack server unrescue

查看实例日志

查看实例控制台日志的最新部分。

OpenStack 控制台日志显示

装置实例

当您填充一个实例时,您要保留实例数据和资源分配,但清除实例内存。根据云配置,她的实例会立即或经过时间延迟移到 SHELVED_OFFLOADED 状态。当一个实例处于 SHELVED_OFFLOADED 状态时,实例数据和资源分配会被删除。实例的状态存储在实例磁盘上。如果实例从卷引导,它会立即进入 SHELVED_OFFLOADED。您不会被提示您确认 shelve 操作。

OpenStack 服务器 shelve

取消缩小实例

使用 shelved 实例的磁盘镜像恢复实例。

OpenStack 服务器 unshelve

锁定实例

锁定实例,以防止非管理员用户对实例执行操作。

OpenStack 服务器锁定

OpenStack server unlock

软重启实例

正常停止并重新启动实例。软重启会在重启实例前安全地关闭所有进程。默认情况下,当您重启实例时,它是软重启。

openstack server reboot --soft <server>

硬重启实例

停止并重启实例。硬重启会关闭实例电源,然后将其重新打开。

openstack server reboot --hard <server>

重建实例

使用新镜像和 disk-partition 选项重建实例,这涉及实例关闭、重新镜像和重启。如果您遇到操作系统问题,而不是终止实例并启动,则使用此选项。

OpenStack 服务器重建

第 12 章 创建自定义实例

云用户可以指定在启动实例时要使用的额外数据,如实例在引导时运行的 shell 脚本。云用户可以使用以下方法将数据传递给实例:

用户数据
使用 在实例启动命令中包含要执行的 cloud-init 的说明。
实例元数据
创建或更新实例时可以指定的键值对列表。

您可以使用配置驱动器或元数据服务访问传递给实例的额外数据。

配置驱动器
您可以在启动时将配置驱动器附加到实例。将配置驱动器作为只读驱动器提供给实例。实例可以挂载此驱动器并从中读取文件。您可以使用 config 驱动器作为 cloud-init 信息的来源。当与 cloud-init 结合使用以进行服务器 bootstrap 时,配置驱动器很有用,以及您想要将大型文件传递给您的实例时非常有用。例如,您可以将 cloud-init 配置为自动挂载配置驱动器,并在初始实例引导期间运行设置脚本。使用 config-2 的卷标签创建配置驱动器,并在引导时附加到实例。传递给配置驱动器的任何额外文件的内容都添加到配置驱动器的 openstack/{version}/ 目录中的 user_data 文件中。cloud-init 从此文件检索用户数据。
元数据服务
提供 REST API 来检索特定于实例的数据。实例通过 169.254.169.254fe80::a9fe:a9fe 访问此服务。

cloud-init 可以使用配置驱动器和元数据服务来消耗额外的数据来自定义实例。cloud-init 软件包支持多种数据输入格式。Shell 脚本和 cloud-config 格式是最常见的输入格式:

  • Shell 脚本:数据声明以 #!Content-Type: text/x-shellscript 开头。在引导过程中会调用 shell 脚本。
  • cloud-config 格式:数据声明以 #cloud-configContent-Type: text/cloud-config 开头。cloud-config 文件必须是有效的 YAML,才能被 cloud-init 解析并执行。
注意

对于传递到实例的数据,cloud-init 的最大用户数据大小为 16384 字节。您无法更改大小限制,因此当您需要超过大小限制时,请使用 gzip 压缩。

特定于供应商的数据

RHOSP 管理员也可以在创建数据时将数据传递给实例。这些数据可能无法作为云用户可见,例如,将实例注册到 Active Directory 的加密令牌。

RHOSP 管理员使用 vendordata 功能将数据传递给实例。vendordata 配置是只读的,位于以下文件中:

  • /openstack/{version}/vendor_data.json
  • /openstack/{version}/vendor_data2.json

您可以使用元数据服务或实例上的配置驱动器查看这些文件。要使用元数据服务访问文件,请对 http://169.254.169.254/openstack/{version}/vendor_data.jsonhttp://169.254.169.254/openstack/{version}/vendor_data2.json 发出 GET 请求。

12.1. 使用用户数据自定义实例

您可以使用用户数据在 instance launch 命令中包含指令。cloud-init 执行这些命令,以作为引导过程中的最后一步自定义实例。

流程

  1. 创建包含 cloud-init 指令的文件。例如,创建一个 bash 脚本,用于在实例上安装并启用 Web 服务器:

    $ vim /home/scripts/install_httpd
    #!/bin/bash
    
    yum -y install httpd python-psycopg2
    systemctl enable httpd --now
  2. 使用 --user-data 选项启动实例,以传递 bash 脚本:

    $ openstack server create \
    --image rhel8 \
    --flavor default \
    --nic net-id=web-server-network \
    --security-group default \
    --key-name web-server-keypair \
    --user-data /home/scripts/install_httpd \
    --wait web-server-instance
  3. 当实例状态为 active 时,附加一个浮动 IP 地址:

    $ openstack floating ip create web-server-network
    $ openstack server add floating ip web-server-instance 172.25.250.123
  4. 使用 SSH 登录实例:

    $ ssh -i ~/.ssh/web-server-keypair cloud-user@172.25.250.123
  5. 检查自定义是否已成功执行。例如,要检查 web 服务器是否已安装并启用,请输入以下命令:

    $ curl http://localhost | grep Test
    <title>Test Page for the Apache HTTP Server on Red Hat Enterprise Linux</title>
    <h1>Red Hat Enterprise Linux <strong>Test Page</strong></h1>
  6. 查看 /var/log/cloud-init.log 文件,以了解相关消息,如 cloud-init 是否执行:

    $ sudo less /var/log/cloud-init.log
    ...output omitted...
    ...util.py[DEBUG]: Cloud-init v. 0.7.9 finished at Sat, 23 Jun 2018 02:26:02 +0000. Datasource DataSourceOpenStack [net,ver=2].  Up 21.25 seconds

12.2. 使用元数据自定义实例

您可以使用实例元数据在 instance launch 命令中指定实例的属性。

流程

  1. 使用 --property <key=value > 选项启动实例。例如,要将实例标记为 webserver,请设置以下属性:

    $ openstack server create \
    --image rhel8 \
    --flavor default \
    --property role=webservers \
    --wait web-server-instance
  2. 可选:在创建实例后为实例添加一个额外的属性,例如:

    $ openstack server set \
    --property region=emea \
    --wait web-server-instance

12.3. 使用配置驱动器自定义实例

您可以为实例引导过程中附加的实例创建配置驱动器。您可以将内容传递给配置驱动器提供给实例使用。

流程

  1. 启用 config 驱动器,并指定包含要在 config 驱动器中提供的内容的文件。例如,以下命令会创建一个名为 config-drive-instance 的新实例,并附加包含文件 my-user-data.txt 内容的 config 驱动器:

    (overcloud)$ openstack server create --flavor m1.tiny \
      --config-drive true \
      --user-data ./my-user-data.txt \
      --image cirros config-drive-instance

    此命令使用 config-2 的卷标签创建配置驱动器,它在启动时附加到实例,并将 my-user-data.txt 的内容添加到配置驱动器的 openstack/{version}/ 目录中的 user_data 文件中。

  2. 登录实例。
  3. 挂载配置驱动器:

    • 如果实例操作系统使用 udev

      # mkdir -p /mnt/config
      # mount /dev/disk/by-label/config-2 /mnt/config
    • 如果实例操作系统没有使用 udev,您需要首先识别与配置驱动器对应的块设备:

      # blkid -t LABEL="config-2" -odevice
      /dev/vdb
      # mkdir -p /mnt/config
      # mount /dev/vdb /mnt/config

第 13 章 标记虚拟设备

在 Red Hat OpenStack Platform (RHOSP)中,如果您将多个网络接口或块设备附加到实例,您可以使用设备标记将每个设备的预期角色与实例操作系统通信。标签在实例引导时分配给设备,并在启用时通过元数据 API 和配置驱动器提供给实例操作系统。

您还可以将虚拟设备标记到正在运行的实例。如需更多信息,请参阅以下步骤:

流程

  1. 使用虚拟块设备标签和虚拟网络设备标签创建您的实例:

    $ openstack server create --flavor m1.tiny --image cirros \
      --network <network_UUID>
      --nic net-id=<network_UUID>,tag=<myNicTag> \
      --block-device id=<volume_ID>,bus=virtio,tag=<myVolumeTag> myTaggedDevicesInstance
    • <myNicTag > 替换为虚拟 NIC 设备的标签名称。您可以根据需要添加任意数量的标记的虚拟设备。
    • <myVolumeTag > 替换为虚拟存储设备的标签名称。您可以根据需要添加任意数量的标记的虚拟设备。
  2. 使用以下方法之一验证虚拟设备标签是否已添加到实例元数据中:

    • 使用 GET /openstack/latest/meta_data.json 从元数据 API 检索设备标签元数据。
    • 如果在实例操作系统上启用并挂载到 /configdrive 下,请查看 /configdrive/openstack/latest/meta_data.json 文件。

    meta_data.json 文件示例:

{
  "devices": [
    {
        "type": "nic",
        "bus": "pci",
        "address": "0030:00:02.0",
        "mac": "aa:00:00:00:01",
        "tags": ["myNicTag"]
    },
    {
        "type": "disk",
        "bus": "pci",
        "address": "0030:00:07.0",
        "serial": "disk-vol-227",
        "tags": ["myVolumeTag"]
    }
  ]
}

法律通告

Copyright © 2024 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.