> 技术文档 > Openstack 云计算秘籍(二)_openstack port create

Openstack 云计算秘籍(二)_openstack port create


原文:annas-archive.org/md5/2ca02d976e2dad8eba9e4b7090f2058d

译者:飞龙

协议:CC BY-NC-SA 4.0

第四章:Neutron – OpenStack 网络

在本章中,我们将涵盖以下主题:

  • OpenStack 网络介绍

  • 管理网络、子网和端口

  • 创建提供商网络

  • 创建租户网络

  • 创建端口

  • 更新网络属性

  • 删除端口

  • 删除网络

  • 管理路由器和浮动 IP

  • 将网络附加到路由器

  • 创建和分配浮动 IP

  • 删除路由器

  • 管理安全组

  • 管理负载均衡器

OpenStack 网络介绍

OpenStack 中的网络由一个名为 Neutron 的项目提供。Neutron 是一个由 API 驱动的系统,用于管理 OpenStack 云中的物理和虚拟网络资源。操作员和用户可以利用 Neutron API 来构建适合其应用需求的丰富网络架构。

Neutron 利用一个可插拔和可扩展的架构,允许开发人员编写强大的驱动程序,以实现和配置虚拟和物理网络资源,包括交换机、路由器、防火墙和负载均衡器。Neutron 由一个 API 服务器和各种代理组成,这些代理负责实现用户架构的虚拟网络。以下图示展示了 Neutron API 服务器如何与各种插件和代理交互,构建云中的网络:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00036.jpeg

图 4.1

图示展示了 Neutron API 服务、Neutron 插件和驱动程序,以及如 L2 和 L3 代理等服务之间的交互。在通过 API 或代理执行网络操作时,Neutron 会发布消息到队列,代理会消费并实现这些消息。

本章将涵盖许多常见的网络相关任务,但不会深入探讨任何特定主题的细节。有关 Neutron 网络基础的介绍,请参阅 OpenStack Networking EssentialsPackt Publishing,2016 年。要深入了解 Neutron 特性,包括交换和路由的核心功能、负载均衡、VPN 等,请参阅 Learning OpenStack Networking, Second EditionPackt Publishing,2015 年。

管理网络、子网和端口

网络、子网和端口构成了 Neutron 逻辑网络架构的基础。一个网络描述了一个二层段,通常用于定义一个边界,如 VLAN。子网是与网络相关联的 IPv4 或 IPv6 地址块。一个网络可以与一个或多个子网关联。最后,端口表示跨越整个云的逻辑交换机上的交换机端口。一个端口对象包含与其关联的设备的信息,包括其 MAC 地址、IP 地址和设备 ID。设备可以是虚拟机实例接口、虚拟路由器接口或将连接到虚拟网络的其他设备。

OpenStack 中的网络对象有许多属性,用于描述该网络如何连接物理和虚拟基础设施。以下表格描述了其中的一些细节:

属性 描述 provider:physical_network 这描述了用于此网络的物理接口。这里的标签是像 eth0bond1 这样的接口的别名。这个别名被称为提供者标签,并在相应的插件和代理配置文件中进行配置。主要由 flatvlan 类型的网络使用。 provider:segmentation_id 这描述了段 ID,如 VLAN ID 或 VXLAN VNI。并非所有网络类型都使用此项。 provider:network_type 这描述了网络类型,如 Flat、VLAN、VXLAN 和 GRE。 router:external 布尔值(真或假),用于确定网络是否有资格作为浮动 IP 池使用。

创建网络的用户角色决定了该用户在创建网络时可以指定哪些属性。管理员用户可以在创建网络时指定诸如物理网络或分段 ID 等详细信息。普通用户必须依赖 Neutron 自动配置网络,基于 Neutron 配置文件中设置的细节,包括为每个物理网络选择分段 ID 的池。专门用于将虚拟设备连接到物理网络基础设施的网络通常被称为提供者网络,因为它们的属性是根据其所在环境或数据中心故意设置的。提供者网络通常跨项目或租户共享,并且通常为上游设备提供连接,以便在环境中进行路由。普通用户创建的网络被称为租户网络,通常仅由创建它们的项目或租户使用。在大多数情况下,租户网络必须连接到虚拟路由器,而虚拟路由器又连接到提供者网络,并可以提供租户网络的进出连接。在接下来的章节中,我们将讨论涉及这些资源的常见任务。

创建提供者网络

在 OpenStack 中创建提供者网络时,必须提供描述网络如何连接到物理基础设施的属性。这些属性包括网络类型、服务器使用的网络接口和网络的分段 ID。通常,只有具有管理员级别权限的用户才能创建和管理提供者网络。提供者网络可以是共享的,也可以是私有的,当网络的 router:external 属性被设置为 True 时,它们还可以作为浮动 IP 网络连接到 Neutron 路由器。

准备就绪

创建提供者网络时,您必须以管理员身份进行身份验证。至少需要以下信息来配置该网络:

  • 网络名称

  • 提供者标签

  • 网络类型

  • 分段 ID

对于我们的示例,将使用以下内容:

  • 网络名称:COOKBOOK_PROVIDER_NET

  • 提供者标签:vlan

  • 网络类型:vlan

  • 分段 ID:200

至少需要以下信息来配置相应的子网:

  • 子网名称

  • 网络名称或 ID

  • 子网范围(CIDR)

对于我们的示例,将使用以下内容:

  • 子网名称:COOKBOOK_PROVIDER_SUBNET

  • 网络名称或 ID:COOKBOOK_PROVIDER_NET

  • 子网范围(CIDR):192.168.200.0/24

如何操作…

在我们的系统上安装了 OpenStack 客户端后,我们可以通过以下步骤创建提供者网络:

  1. 创建网络:

    openstack network create COOKBOOK_PROVIDER_NET \\--provider-network-type vlan \\--provider-physical-network vlan \\--provider-segment 200

    输出将类似于以下内容:

    https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00037.jpeg

  2. 创建子网:

    openstack subnet create COOKBOOK_PROVIDER_SUBNET \\--network COOKBOOK_PROVIDER_NET \\--subnet-range 192.168.200.0/24

    输出将类似于以下内容:

    https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00038.jpeg

它是如何工作的…

提供者网络使用以下语法创建:

openstack network create NETWORK_NAME \\--provider-network-type NETWORK_TYPE \\--provider-physical-network PROVIDER_LABEL \\--provider-segment SEGMENTATION_ID \\[--external | --internal]

创建网络会创建一个逻辑的二层段,其细节用于在云中构建虚拟网络连接,这些连接将虚拟机和其他虚拟网络对象与物理基础设施连接起来。

provider-network-type 参数定义了网络的类型。选项包括 vlanvxlangreflatgenevelocal,这些选项必须得到配置的网络驱动程序的支持。

provider-physical-network 参数定义了用于网络的接口。在 Neutron 中,接口不是直接引用的,而是映射到 提供者标签。在 OpenStack-Ansible 部署中,默认的提供者标签是 vlan,并映射到如 bond1eth1 的物理接口。

provider-segment 参数定义了网络使用的二层分段 ID。对于 vlan 网络类型,分段 ID 是 VLAN ID。对于 vxlan 网络类型,分段 ID 是 VXLAN VNI。并非所有网络类型都使用分段 ID,如果没有指定,Neutron 可能会在需要时自动分配。

当指定时,--external 选项将网络标记为路由器的网关网络。该网络将作为附加实例的浮动 IP 网络。网络默认被认为是 内部 网络。

还有其他可选的网络参数,可以通过以下 --help 标志来发现:

openstack network create --help

提示

--help 标志可以附加到 OpenStack 命令行工具的大多数命令中,在本章节中构建命令时将非常有用。

子网使用以下语法创建:

openstack subnet create SUBNET_NAME \\--network NETWORK_NAME \\--subnet-range SUBNET_RANGE

创建子网会创建一个逻辑层 3 路由域,其详细信息用于向虚拟机和其他虚拟网络对象提供 IP 服务。network 参数将子网映射到 OpenStack 中定义的层 2 网络。subnet-range 参数定义了子网使用的 L3 地址范围,并以 CIDR 表示法编写。一个网络可以关联多个子网,这通常发生在特定子网中的所有地址都已被使用时。尽管在逻辑上是分离的,网络中的多个子网仍然是同一个层 2 广播域的一部分。

当在 OpenStack 中创建网络和子网并启用 DHCP 时,会在运行 DHCP 代理的一个或多个节点上创建一个相应的网络命名空间。可以使用以下 ip netns 命令识别该命名空间:

# ip netns list...qdhcp-c881ce20-1649-4f03-bea7-40da536e21b2...

DHCP 命名空间的前缀为 qdhcp-,后缀对应于网络 ID。

注意

ip netns 命令必须由 root 用户或具有 sudo 权限的用户运行。

创建租户网络

当在 OpenStack 中创建租户网络时,描述网络如何连接到物理基础设施的提供者属性会根据配置文件中硬编码的设置由 Neutron 自动确定。通常,租户网络由特定项目中的用户创建和管理,并且不会与其他项目共享。

准备就绪

至少需要以下网络信息:

  • 网络名称

在我们的示例中,将使用以下网络名称:

  • 网络名称:COOKBOOK_TENANT_NET_1

至少需要以下信息来创建对应的子网:

  • 子网名称

  • 网络名称或 ID

  • 子网范围(CIDR)

在我们的示例中,将使用以下内容:

  • 子网名称:COOKBOOK_TENANT_SUBNET_1

  • 网络名称或 ID:COOKBOOK_TENANT_NET_1

  • 子网范围(CIDR):172.16.200.0/24

如何操作…

在我们的系统上安装了 openstack 客户端后,我们可以通过以下步骤创建租户网络:

  1. 创建网络:

    openstack network create COOKBOOK_TENANT_NET_1

    输出将类似于以下内容:

    https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00039.jpeg

    注意

    作为非管理员用户,某些网络属性可能不可见。

  2. 创建子网:

    openstack subnet create COOKBOOK_TENANT_SUBNET_1 \\--network COOKBOOK_TENANT_NET_1 \\--subnet-range 172.16.200.0/24

    输出将类似于以下内容:

    https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00040.jpeg

它是如何工作的…

租户网络的创建遵循以下语法:

openstack network create NETWORK_NAME

当作为非管理员用户创建时,网络的提供者属性会根据相应网络插件配置文件中定义的设置由 Neutron 自动确定。租户网络与创建它们的项目关联,默认情况下,其他项目无法看到或使用这些网络。

提示

Neutron 基于角色的访问控制 (RBAC) 可用于在需要时与其他项目共享网络。有关在 OpenStack Pike 版本中使用 RBAC 的更多信息,请访问以下网站:

docs.openstack.org/neutron/pike/admin/config-rbac.html

创建端口

在 OpenStack 中可以使用 openstack port create 命令创建端口。OpenStack 在创建服务器时会自动创建端口,也可以在稍后创建并附加到实例上。用户还可以创建端口,以便预留 IP 地址供以后使用,或者避免 OpenStack 分配某些地址。

准备中

至少需要以下详细信息来创建端口:

  • 网络名称或 ID

  • 端口名称

对于我们的示例,将使用以下内容:

  • 网络名称:COOKBOOK_TENANT_NET_1

  • 端口名称:COOKBOOK_TEST_PORT_1

如何操作…

安装了 OpenStack 客户端后,我们现在可以使用以下命令创建端口:

openstack port create COOKBOOK_TEST_PORT_1 \\--network COOKBOOK_TENANT_NET_1

输出将类似于以下内容:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00041.jpeg

它是如何工作的…

当在 OpenStack 中创建端口并与实例或其他虚拟网络设备关联时,它会绑定到托管实例或设备的相应节点上的 Neutron 代理。使用端口提供的详细信息,OpenStack 服务可以在主机上构建 虚拟机接口 (vif) 或 虚拟以太网接口 (veth),供虚拟机、网络命名空间或其他应用使用。

更新网络属性

网络属性可以通过 openstack network setopenstack network unset 命令进行更新。

准备中

更新网络时,确保你已认证为管理员或是网络的所有者。你将需要以下详细信息:

  • 网络名称或 ID

  • 更新的属性

对于我们的示例,将使用以下内容:

  • 网络名称:COOKBOOK_PROVIDER_NET

  • 更新的属性:router:external

如何操作…

安装了 OpenStack 客户端后,我们现在可以使用以下命令来更新网络:

openstack network set COOKBOOK_PROVIDER_NET --external

不会返回任何输出。

它是如何工作的…

网络更新的语法如下:

openstack network set NETWORK \\[--share | --no-share] \\[--description ] \\[--external | --internal] openstack network unset [--tag  | --all-tag] NETWORK

shareno-share 参数决定网络是否可以在项目之间共享,或者仅限于网络的所有者使用。

description 参数允许用户提供网络的有用描述。

当指定时,--external 选项将网络标识为路由器的网关网络。该网络将作为附加实例的浮动 IP 网络。默认情况下,网络被视为内部网络。

注意

并非所有网络插件都支持更新现有网络的某些网络属性。如果需要更改,可能需要删除并重新创建网络。

删除端口

在 OpenStack 中可以使用 openstack port delete 命令删除端口。OpenStack 会自动删除它创建的端口,例如,当创建服务器或浮动 IP 时,但可能不会删除用户创建并与实例关联的端口。

注意

删除与活动实例关联的端口可能导致实例崩溃或造成实例中的意外行为。

准备工作

删除端口时,确保你已经通过管理员身份验证或是端口的所有者。你需要以下信息:

  • 端口名称或 ID

对于我们的示例,将使用以下内容:

  • 端口名称:COOKBOOK_TEST_PORT_1

如何操作…

安装了 OpenStack 客户端后,我们现在可以使用以下命令删除端口:

openstack port delete COOKBOOK_TEST_PORT_1

不会返回任何输出。

删除网络

在 OpenStack 中删除网络与调用 openstack network delete 命令一样简单。Neutron 会删除与该网络相关的所有自动创建的端口,如由 DHCP 或路由器命名空间创建的端口,并将任何自动分配的分段 ID 归还到相应的池中,以供分配给其他网络。

准备工作

在 OpenStack 中删除网络时,确保所有相关的用户创建端口已被删除。这可能需要删除实例、从实例中分离并删除端口,或从路由器中分离并删除端口。删除网络时,以下信息是必需的:

  • 网络名称或 ID

如何操作…

安装了 OpenStack 客户端后,我们现在可以使用以下命令删除网络:

openstack network delete COOKBOOK_TENANT_NETWORK_3

不会返回任何输出。

工作原理…

当调用 openstack network delete 命令时,它会指示 Neutron 删除指定的网络以及所有相关的子网(子网),前提是所有用户管理的端口都已被删除。在参考架构中,第二层代理负责删除在主机上配置的相应虚拟桥接和接口,所有网络记录都会从 OpenStack 数据库中清除。

注意

一旦这些对象被删除,Neutron 不再在数据库中维护网络信息。虽然 OpenStack API 的请求可能会被记录,但如果需要审计跟踪,强烈建议使用第三方工具或代理。

管理路由器和浮动 IP

在 OpenStack 中,路由器代表一个虚拟路由设备,为直接连接的网络提供路由功能。为了为虚拟机提供端到端的连接,路由器必须连接到外部提供者网络以及实例所在的租户网络。通常,路由器由单独的项目创建和管理。默认情况下,外部提供者网络是共享的,所有项目都可以使用。以下图示表示一个由 ADMIN 项目拥有并被其他三个项目使用的外部提供者网络:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00042.jpeg

图 4.2

图 4.2中,三个项目的路由器连接到外部提供商网络。外部提供商网络不仅提供路由器及其后方网络的连接,还提供一个可以派发浮动 IP 的网络。浮动 IP 提供 1 对 1 的地址转换,允许外部客户端直接连接到实例。

创建路由器

在 OpenStack 中,路由器可以使用openstack router create命令创建。默认情况下,路由器被认为是内部的,只能在直接连接的租户网络之间进行路由。另一方面,外部路由器能够路由到外部网关,并能为连接的网络提供网络地址转换NAT)服务。

在 OpenStack 参考架构中,可以创建三种类型的路由器:

  • 独立路由器

  • 高可用HA

  • 分布式(DVR)

独立路由器不提供任何级别的容错性,而高可用路由器通过实现 VRRP 来提供冗余,以应对一个或多个 Neutron 节点故障。分布式虚拟路由器驻留在计算节点上,而不是集中式网络节点上,提供比其同类更高的性能,特别是在东西向流量或不同网络中实例间的流量时,因为这类流量是通过计算节点转发的,无需经过网络节点。

对于非管理员用户,通过openstack router create命令创建的路由器类型由 Neutron 配置文件中定义的设置自动决定。只有拥有管理员权限的用户才能在创建路由器时指定路由器类型。

准备中

至少需要以下详细信息,用于路由器:

  • 路由器名称

对于我们的示例,将使用以下内容:

  • 路由器名称:COOKBOOK_ROUTER_STANDALONE

  • 路由器名称:COOKBOOK_ROUTER_HA

  • 路由器名称:COOKBOOK_ROUTER_DVR

至少需要以下详细信息,用于连接到路由器的网络:

  • 外部提供商网络名称或 ID

  • 租户子网名称或 ID

对于我们的示例,将使用以下内容:

  • 外部提供商网络名称:COOKBOOK_PROVIDER_NET

  • 租户子网名称:COOKBOOK_TENANT_SUBNET

如何操作…

在系统上安装了openstack客户端后,我们现在可以按照以下步骤创建一个路由器:

  1. 创建独立路由器:

    openstack router create COOKBOOK_ROUTER_STANDALONE

    输出将类似于以下内容:

    https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00043.jpeg

  2. 创建一个 HA 路由器:

    openstack router create COOKBOOK_ROUTER_HA --ha

    输出将类似于以下内容:

    https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00044.jpeg

  3. 创建分布式路由器:

    openstack router create COOKBOOK_ROUTER_DVR --distributed

    输出将类似于以下内容:

    https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00045.jpeg

它是如何工作的…

当在 OpenStack 中使用原生路由服务创建任何路由器时,会在运行neutron-l3-agent服务的一个或多个节点上创建一个相应的网络命名空间。可以使用以下ip netns命令来识别该命名空间:

# ip netns list...qrouter-058ea6a3-ca86-46f8-80c8-d63bbc195212...

路由器的命名空间以qrouter-为前缀,并且后缀与路由器 ID 相对应。在配置了分布式虚拟路由器的环境中,可能还会有其他命名空间用于促进正确的网络配置,例如fip-snat-命名空间。

默认情况下,非管理员用户无法指定正在创建的路由器类型。路由器类型由 Neutron 根据第 3 层代理配置文件自动确定。作者建议尽可能使用 HA 或分布式虚拟路由器,以限制虚拟路由器所在物理节点故障的影响。

注意

云操作员可以修改 Neutron 配置文件来更改默认行为。Neutron API 服务使用的policy.json文件可以被修改,以允许用户和角色执行通常仅限管理员的操作。有关修改policy.json文件的指南和注意事项,请参考社区文档。

将网络连接到路由器

在 OpenStack 中,路由器可以连接到单一的外部提供者网络和一个或多个租户网络,如下图所示:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00046.jpeg

图 4.3

图 4.3中,外部提供者网络提供外部连接,而租户网络则为项目内的虚拟机和其他虚拟网络设备提供连接。路由器的任务是通过路由和有时通过浮动 IP 的 NAT 来促进端到端连接。

将网络连接到路由器所需的命令可能会根据网络和需求的不同而有所变化:

  • 将路由器连接到外部网络:

    openstack router set --external-gateway  
  • 使用子网 ID 或名称将路由器连接到租户网络:

    openstack router add subnet  
  • 使用特定端口 ID 或名称将路由器连接到租户网络:

    openstack router add port  

准备工作

在将路由器连接到网络时,以下信息是必需的:

  • 路由器名称或 ID

  • 网络名称或 ID,或子网名称或 ID,或端口名称或 ID

请记住,当将路由器连接到外部提供者网络时,网络的router:external属性必须设置为ExternalTrue

如何操作……

在 OpenStack 中将网络连接到路由器,请按以下步骤操作:

  1. 将路由器连接到外部提供者网络COOKBOOK_PROVIDER_NET

    openstack router set --external-gateway COOKBOOK_PROVIDER_NET COOKBOOK_ROUTER_STANDALONE

    没有输出提供。

  2. 使用子网名称将路由器连接到COOKBOOK_TENANT_SUBNET子网:

    openstack router add subnet COOKBOOK_ROUTER_STANDALONE COOKBOOK_TENANT_SUBNET_1

    没有输出提供。

它是如何工作的……

当路由器连接到外部提供者网络时,路由器将从网络中可分配的 IP 地址池中分配一个 IP 地址。路由器还会配置一个默认网关,该网关对应于各自提供者子网的指定网关。

当路由器连接到租户网络时,路由器就成为该网络及其所有实例的网关。它会被分配一个指定为各自租户子网网关的 IP 地址。

可以使用以下命令列出连接到路由器的端口:

openstack port list --router ROUTER_NAME_OR_ID

在本例中,以下端口和相应子网已附加到路由器:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00047.jpeg

使用 ip netns exec 命令,并结合相应路由器命名空间的名称,我们可以看到路由器有两个附加的接口,分别是 qg-ed006ed1-b8qr-c69005cb-aa

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00048.jpeg

注意

路由器命名空间中的接口名称与相应端口 ID 的前 10 个字符相对应。外部或网关端接口以 qg- 为前缀,而内部或路由器端接口以 qr- 为前缀。这种命名方案可以追溯到 Neutron 项目被称为 Quantum 时。

创建并分配浮动 IP

OpenStack 中的浮动 IP 是静态 IPv4 地址,它们与 Neutron 路由器后面的实例进行映射,为这些实例提供直接的入站连接。浮动 IP 的使用方式与 Amazon Web Services 中的弹性 IP 类似,用户可以在实例故障时快速重新映射 IP 地址。这个功能的核心是网络地址转换(NAT)。浮动 IP 通常被视为外部地址,映射到实例上配置的内部地址。NAT 在连接到实例网络的 Neutron 路由器上实现。浮动 IP 提供了对那些通常会被隔离在 Neutron 路由器后非路由网络上的实例的连接。

准备工作

回想一下,实例通过端口连接到反映连接网络和关联 IP 地址的端口。当创建浮动 IP 时,需要以下信息:

  • 外部网络名称或 ID

分配浮动 IP 到端口时,需进行以下操作:

  • 浮动 IP ID

  • 内部端口名称或 ID

在本例中,创建一个新的端口,命名为 COOKBOOK_TEST_PORT_2,并放置在现有的租户网络中:

openstack port create COOKBOOK_TEST_PORT_2 \\--network COOKBOOK_TENANT_NET_1

如何操作…

要在 OpenStack 中创建浮动 IP,请执行以下命令:

openstack floating ip create --port COOKBOOK_TEST_PORT_2 COOKBOOK_PROVIDER_NET

输出将类似于以下内容:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00049.jpeg

如何操作…

浮动 IP 的创建语法如下:

openstack floating ip create EXTERNAL_NETWORK_NAME_OR_ID \\[--port PORT_NAME_OR_ID]

浮动 IP 可以通过以下语法与端口关联:

openstack floating ip associate FLOATING_IP_NAME_OR_ID \\PORT_NAME_OR_ID

当浮动 IP 与端口关联时,Neutron 使用端口信息来确定要在哪个路由器上配置 NAT。一旦 NAT 配置完成,连接到浮动 IP 的请求将被转换为内部 IP 并转发到相应实例。实例的响应将被转发到路由器,从内部 IP 转换为浮动 IP,然后路由回原始地址。

在我们的例子中,实例的端口与 COOKBOOK_TENANT_NET 网络关联,而该网络又与 COOKBOOK_ROUTER_STANDALONE 路由器连接。在各自的 qrouter 网络命名空间中,我们可以看到通过 iptables 应用的源 NAT 和目标 NAT:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00050.jpeg

删除路由器

在 OpenStack 中,可以使用 openstack router delete 命令删除路由器。在删除路由器之前,必须先断开所有连接到该路由器的子网/端口。这会导致任何连接到路由器后面的网络的实例的流量中断。可以使用 openstack router remove subnetopenstack router remove port 命令来断开子网。

准备工作

删除路由器时,将需要以下信息:

  • 路由器名称或 ID

如何操作……

要在 OpenStack 中删除路由器,请执行以下命令:

openstack router delete COOKBOOK_ROUTER_DVR

没有输出。然而,可以使用 openstack router list 命令来验证操作:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00051.jpeg

被删除的路由器将不再出现在列表中。

它是如何工作的……

当调用 openstack router delete 命令时,将指示 Neutron 删除指定的路由器及其关联的资源。在参考架构中,第三层代理负责删除主机上配置的相应网络命名空间和虚拟接口,且所有与路由器相关的记录都会从 OpenStack 数据库中清除。

管理安全组

在 OpenStack 中,安全组描述了具有相似安全要求的端口的组合。安全组规则与安全组关联,并为该组提供入站和出站过滤能力。安全组规则可以使用 CIDR 表示法引用其他组或远程网络。实际的过滤操作发生在计算节点的“端口”级别,并且可以通过 iptables 或作为 OpenFlow 规则来实现,具体取决于在特定节点上配置的防火墙驱动程序。每个新创建的项目都包含一个名为 default 的安全组,只允许出站通信。入站通信被拒绝。

创建安全组

可以使用 openstack security group create 命令在 OpenStack 中创建安全组。安全组是项目拥有的对象,不能被其他项目共享或引用。

准备工作

创建安全组时,与该组关联的每个端口将继承应用于该组的规则。至少需要以下详细信息来创建该组:

  • 安全组名称

对于我们的示例,将使用以下内容:

  • 安全组名称:COOKBOOK_SG_WEB

如何操作……

在我们的系统上安装了 OpenStack 客户端后,我们现在可以使用以下命令创建安全组:

openstack security group create COOKBOOK_SG_WEB

输出将类似于以下内容:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00052.jpeg

它是如何工作的……

安全组使用以下语法创建:

openstack security group create SECURITY_GROUP_NAME

当创建安全组时,OpenStack 会将一组默认规则应用于该组,这些规则允许端口通过 IPv4 和 IPv6 进行出站通信(egress)。默认情况下,所有入站流量会被拒绝。

创建安全组只是为实例提供过滤的第一步。接下来的步骤,即创建安全组规则并将安全组应用于端口,将在后续章节中讨论。

创建安全组规则

可以使用 openstack security group rule create 命令在 OpenStack 中创建安全组规则。安全组规则提供了在第 3 层和第 4 层的过滤信息,包括 IP 地址和目标端口。

准备工作

在创建安全组规则时,请记住,每个与该组关联的端口将继承应用于该组的规则。因此,重要的是仅限于所需的规则,以便为关联组提供所需的访问权限。至少,您需要以下详细信息来定义规则:

  • 安全组名称

对于我们的示例,将使用以下内容:

  • 安全组名称:COOKBOOK_SG_WEB

  • 目标端口:80

  • 协议:TCP

  • 方向:入口

  • 来源:所有地址

如何操作……

在我们的系统上安装了 OpenStack 客户端后,现在可以通过以下命令创建安全组规则:

openstack security group rule create COOKBOOK_SG_WEB \\--dst-port 80 \\--protocol tcp \\--ingress \\--remote-ip 0.0.0.0/0

输出将类似于以下内容:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00053.jpeg

它是如何工作的……

安全组是通过以下语法创建的:

openstack security group rule create SECURITY_GROUP_NAME \\[--remote-ip  | --remote-group ] \\[--dst-port ] \\[--icmp-type ] \\[--icmp-code ] \\[--protocol ] \\[--ingress | --egress] \\[--ethertype ]

安全组规则为 OpenStack 提供了 Neutron 代理用来在计算节点上单独端口上实现流量过滤的详细信息。在我们的环境中,这些规则作为 iptables 规则实现。

如果在创建安全组规则时未提供任何额外的过滤信息,可能会导致一个规则允许来自所有源地址的入口访问。当没有指定详细信息时,OpenStack 会假设某些默认值,因此验证提供的输出非常重要,以确保已实施适当的过滤。

将安全组应用于实例

安全组通常在启动时通过 openstack server create 命令应用于实例,但也可以通过 openstack network port createset 命令应用于单个端口。在启动时应用时,每个列出的安全组都会应用于与实例关联的每个端口。因此,可能会在每个接口上应用不必要的规则,这可能导致安全风险或底层 Neutron 代理性能下降,该代理负责应用规则。当应用于单个端口时,用户可以确保如果实例是多宿主的,相应端口仅具有提供对该接口访问所需的规则。

注意

多宿主(multihomed)是指通过不同接口连接到多个网络的实例。

准备工作

在启动时将安全组应用于实例时,您需要以下信息:

  • 安全组名称或 ID

在将安全组应用于单个端口时,您需要以下信息:

  • 端口名称或 ID

  • 安全组名称或 ID

对于我们的示例,将使用以下内容:

  • 端口名称:COOKBOOK_TEST_PORT_1

  • 安全组名称:COOKBOOK_SG_WEB

  • 实例名称:COOKBOOK_INSTANCE_WEB

  • 实例规格:COOKBOOK_FLAVOR_TINY

  • 实例镜像:COOKBOOK_IMAGE_CIRROS

  • 网络名称:COOKBOOK_TENANT_NET_1

操作步骤…

在我们的系统上安装了 openstack 客户端后,我们可以按照以下步骤应用安全组:

  1. 创建实例并在启动时提供安全组:

    openstack server create COOKBOOK_INSTANCE_WEB \\--flavor COOKBOOK_FLAVOR_TINY \\--image COOKBOOK_IMAGE_CIRROS \\--nic net-id=COOKBOOK_TENANT_NET_1 \\--security-group COOKBOOK_SG_WEB

    注意

    使用适合你环境的规格和镜像,或使用在第五章,Nova – OpenStack 计算和第六章,Glance – OpenStack 镜像服务中创建的规格和镜像。

    另外,安全组可以在端口创建时或应用于现有端口时进行配置。通过在系统上安装 OpenStack 客户端,我们可以按照以下步骤应用安全组。

  2. 将安全组应用到新端口:

    openstack port create COOKBOOK_TEST_PORT_3 \\--network COOKBOOK_TENANT_NET_1 \\--security-group COOKBOOK_SG_WEB

    输出结果如下所示:

    https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00054.jpeg

  3. 将安全组应用于现有端口:

    openstack port set COOKBOOK_TEST_PORT_2 \\--security-group COOKBOOK_SG_WEB

    不会返回输出。不过,可以通过使用 openstack port show 命令查询应用到端口的安全组来确认该更改:

    openstack port show COOKBOOK_TEST_PORT_2 -c security_group_ids

    输出结果如下所示:

    https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00055.jpeg

工作原理…

安全组可以在启动时应用于实例,在创建端口时应用,或应用于现有端口。计算节点上的 Neutron 插件代理负责在主机上为端口应用相应的过滤规则。在所有场景中,可以将多个安全组应用于同一个端口。

安全组可以通过以下语法在启动时应用:

openstack server create INSTANCE_NAME \\...--security-group SECURITY_GROUP_NAME

安全组也可以通过以下语法应用于新端口:

openstack port create PORT_NAME \\--network NETWORK_NAME \\--security-group SECURITY_GROUP_NAME 

最后,安全组可以通过以下语法应用于现有端口:

openstack port set PORT_NAME \\--security-group SECURITY_GROUP_NAME

端口绑定到位于环境中主机上的 Neutron 插件代理。例如,属于实例的端口会绑定到该实例所在的计算节点上的代理。该代理负责为端口设置虚拟网络。当安全组应用于端口时,端口绑定的 Neutron 代理在主机上实施过滤规则。环境中的其他代理会收到安全组已更改的通知,并相应地更新。

管理负载均衡器

Neutron 包含一个名为 负载均衡即服务LBaaS)的服务,允许用户创建将流量负载均衡到云中多个实例上部署的应用程序的负载均衡器。在参考架构中,Neutron 依赖一个开源负载均衡软件包 HAProxy 来提供负载均衡功能。就像 Neutron L3 代理处理虚拟路由器、DHCP 代理处理虚拟 DHCP 服务器一样,Neutron LBaaS 代理负责在请求时构建和配置虚拟负载均衡器。

注意

LBaaS 不应与另一个名为 Octavia 的负载均衡项目混淆。两者都提供类似的负载均衡功能,但这里只涵盖 LBaaS。

在 OpenStack 中,负载均衡器包含三个主要组件:

  • 池成员

  • 监听器

池成员 描述一个第 4 层对象,由实例上服务的 IP 地址和端口组成。例如,池成员可能是一个 Web 服务器,地址配置为 10.30.0.2,并在 TCP 端口 80 上监听。

是一组提供相同内容的池成员。

监听器 是一个对象,表示负载均衡器本身正在监听的 虚拟 IPVIP)和端口。流量将根据虚拟 IP 在关联池的成员之间进行负载均衡。

其他组件,如健康检查器和 L7 策略,有助于扩展负载均衡器的实用性和功能,但不是必需的。

创建功能性负载均衡器的工作流程如下:

  • 创建负载均衡器对象

  • 创建并关联监听器

  • 创建并关联池

  • 创建并关联池成员

  • 创建并关联健康检查器(可选)

创建负载均衡器

从 OpenStack 的 Pike 版本开始,负载均衡器相关的命令不再在 OpenStack 客户端中提供。相反,应使用 neutron 客户端。可以通过 neutron lbaas-loadbalancer-create 命令在 OpenStack 中创建负载均衡器。

准备就绪

至少需要以下详细信息来创建负载均衡器:

  • VIP 子网

还推荐为其命名。对于我们的示例,以下内容将被使用:

  • 名称:COOKBOOK_LOADBALANCER_1

  • VIP 子网:COOKBOOK_TENANT_SUBNET_1

如何操作…

在我们的系统上安装了 Neutron 客户端后,现在可以使用以下命令创建负载均衡器对象:

neutron lbaas-loadbalancer-create COOKBOOK_TENANT_SUBNET_1 \\--name COOKBOOK_LOADBALANCER_1

输出将类似于以下内容:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00056.jpeg

它是如何工作的…

负载均衡器通过以下语法创建:

neutron lbaas-loadbalancer-create VIP_SUBNET \\[--name NAME]

当负载均衡器创建时,OpenStack 会分配一个被称为虚拟 IP 的 IP 地址。客户端将使用 VIP 来访问负载均衡的应用程序。创建负载均衡器对象只是将流量负载均衡到实例的第一步。接下来的步骤,创建监听器、池和健康检查器,将在接下来的章节中讨论。

创建池

与负载均衡器关联的池是代表接收发送到 VIP 的流量的实例集合的对象。在 OpenStack 中,可以使用 neutron lbaas-pool-create 命令创建负载均衡池。

准备工作

至少需要以下详细信息来配置池:

  • 平衡算法

  • 协议

  • 负载均衡器或监听器

也推荐指定一个名称。在我们的示例中,将使用以下名称:

  • 名称:COOKBOOK_POOL_1

  • 平衡算法:ROUND_ROBIN

  • 协议:HTTP

  • 负载均衡器:COOKBOOK_LOADBALANCER_1

负载均衡器可以与多个监听器关联,每个监听器可以与其各自的池关联。此类设置的常见场景是,一个负载均衡器上有一个监听器监听端口80,另一个监听器监听端口443,每个监听器都有其各自的后端池。

如何操作…

在系统上安装了 Neutron 客户端后,我们现在可以使用以下命令创建一个负载均衡器池:

neutron lbaas-pool-create --lb-algorithm ROUND_ROBIN \\--protocol HTTP \\--loadbalancer COOKBOOK_LOADBALANCER_1 \\--name COOKBOOK_POOL_1 

输出结果如下所示:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00057.jpeg

它是如何工作的…

负载均衡池的创建语法如下:

neutron lbaas-pool-create [--name NAME] \\--lb-algorithm {ROUND_ROBIN,LEAST_CONNECTIONS,SOURCE_IP} \\[--listener LISTENER | --loadbalancer LOADBALANCER] \\--protocol {HTTP,HTTPS,TCP}

其他负载均衡对象,如成员和监控器,引用池,并且必须在创建时应用到池中。

创建成员

成员与池关联,代表一个在特定 IP 和端口上监听的后端应用程序。在 OpenStack 中,池成员可以通过 neutron lbaas-member-create 命令创建。

准备工作

至少需要以下详细信息来配置成员:

  • 子网名称

  • IP 地址

  • 端口

  • 池名称

也推荐指定一个名称。在我们的示例中,将使用以下名称:

  • 名称:COOKBOOK_MEMBER_1

  • 子网名称:COOKBOOK_TENANT_SUBNET_1

  • IP 地址:172.16.200.11(对应COOKBOOK_TEST_PORT_2

  • 端口:80

  • 池名称:COOKBOOK_POOL_1

一个成员只能与一个池关联。但是,相同的 IP 地址和应用端口组合可以用于多个成员。

如何操作…

在系统上安装了 Neutron 客户端后,我们可以使用以下命令创建一个池成员:

neutron lbaas-member-create --name COOKBOOK_MEMBER_1 \\--subnet COOKBOOK_TENANT_SUBNET_1 \\--address 172.16.200.11 \\--protocol-port 80 \\COOKBOOK_POOL_1 

输出结果如下所示:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00058.jpeg

它是如何工作的…

池成员的创建语法如下:

neutron lbaas-member-create [--name NAME] \\--subnet SUBNET --address ADDRESS \\--protocol-port PROTOCOL_PORT \\POOL

创建监听器

监听器与负载均衡器对象关联,描述了负载均衡器 VIP 与服务监听的端口之间的关系。客户端将流量发送到监听器地址和端口,然后该流量被代理并发送到池中的一个成员。每个监听器可以配置为将流量发送到不同的池。在 OpenStack 中,监听器可以通过 neutron lbaas-listener-create 命令创建。

准备工作

至少需要以下详细信息来配置监听器:

  • 负载均衡器名称

  • 协议

  • 端口

也推荐指定名称和默认池。在我们的示例中,将使用以下名称:

  • 名称:COOKBOOK_LISTENER_1

  • 负载均衡器名称:COOKBOOK_LOADBALANCER_1

  • 协议:HTTP

  • 端口:80

  • 默认池:COOKBOOK_POOL_1

如何操作……

在我们的系统上安装了 Neutron 客户端后,现在可以使用以下命令创建一个监听器:

neutron lbaas-listener-create --name COOKBOOK_LISTENER_1 \\--loadbalancer COOKBOOK_LOADBALANCER_1 \\--protocol HTTP \\--protocol-port 80 \\--default-pool COOKBOOK_POOL_1

输出将类似于以下内容:

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00059.jpeg

工作原理……

监听器是通过以下语法创建的:

neutron lbaas-listener-create [--name NAME] \\--loadbalancer LOADBALANCER \\--protocol {TCP,HTTP,HTTPS,TERMINATED_HTTPS} \\--protocol-port PORT \\[--default-pool DEFAULT_POOL]

提示

可以通过将安全组应用到负载均衡器地址的相应端口来限制对监听器的访问。使用本章前面描述的 openstack port set 命令来将安全组应用于监听器的端口。

验证连接性

一旦工作流完成并且池成员上的应用程序已启动,可以使用 Web 浏览器或从能够访问 VIP 的客户端的 curl 命令验证到负载均衡器 VIP 的连接。在本示例中,Web 服务器在前一节中配置的池成员上运行。我们将从与负载均衡器关联的 qlbaas 命名空间进行连接,但也可以从与 VIP 地址来源的网络关联的 qdhcp 命名空间进行连接。

准备就绪

至少需要以下详细信息来测试连接性

  • 网络 ID 或负载均衡器 ID

  • VIP 地址和端口

对于我们的示例,将使用以下内容:

  • 负载均衡器 ID:aa599cee-b49f-44f1-a0fd-51fa69ebf6dbCOOKBOOK_LOADBALANCER_1

  • VIP 地址和端口:172.16.200.14:80

如何操作……

在 Neutron 代理容器内,可以使用 curlqdhcpqlbaas 命名空间内确认与 VIP 的连接:

# ip netns exec qlbaas-aa599cee-b49f-44f1-a0fd-51fa69ebf6db \\curl http://172.16.200.14:80

输出将类似于以下内容:

Hello Cookbook Readers!

注意

你可能需要安装 curl 工具才能使命令正常工作。在 Neutron 代理容器中,可以通过运行 apt install curl 来完成此操作。池成员上 Web 服务器的配置超出了本书的范围。

若要从外部网络访问负载均衡器虚拟 IP,可能需要将浮动 IP 映射到虚拟 IP。可以参考本章前面的说明来完成该任务。

第五章:Nova – OpenStack 计算

在本章中,我们将涵盖以下主题:

  • OpenStack 计算简介

  • 使用 OpenStack-Ansible 添加计算主机

  • 暂停主机进行维护

  • 配置 Nova 调度器以使用主机聚合

  • 创建主机聚合

  • 向主机聚合添加计算主机

  • 从主机聚合中移除计算主机

  • 向主机聚合添加元数据

  • 删除主机聚合

  • 创建可用区

  • 将实例启动到可用区

  • 删除可用区

  • 创建 flavor

  • 删除 flavor

  • 为 flavor 设置 CPU 限制

  • 为 flavor 设置 IOPS 限制

  • 启动实例

  • 停止实例

  • 删除实例

  • 实时迁移

  • 快照实例

  • 从快照启动实例

  • 救援实例

  • 搁置实例

  • 查看控制台日志

OpenStack 计算简介

OpenStack 中的计算服务由名为 Nova 的项目提供。Nova 是一个基于 API 的系统,管理 OpenStack 云中的物理和虚拟计算资源,提供基础设施即服务IaaS)。OpenStack 的操作员、管理员和用户可以利用 Nova API 来管理计算资源的生命周期。

Nova 主要负责管理两种资源类型:实例,即用户请求的正在运行的虚拟机、应用程序容器,甚至是裸金属机器;和主机,即提供实例所需硬件资源的主机。在大多数情况下,实例就是虚拟机的同义词。

理解 Nova 的两个主要功能非常重要:Nova API 服务(以及相关服务,如nova-schedulernova-conductornova-placement)运行在我们三个控制节点的集群上,而nova-compute服务则运行在我们环境中的每个计算主机上。

在本章中,我们将首先介绍物理主机和 Nova 服务的管理,接下来,本章的其余部分将采用以任务为中心的方法来处理 Nova。这意味着,关于 Nova 功能和特性的深度与细节超出了本书的范围。

使用 OpenStack-Ansible 添加计算主机

为了运行实例,OpenStack 计算需要知道在哪些物理资源上运行实例。随着 OpenStack 的成长和成熟,添加主机的过程也随之发展。OpenStack-Ansible 提供了一种非常便捷且一致的方法来添加新的计算主机,这使得你可以在需求增长时扩展你的环境。计算主机运行nova-compute服务和启动适当实例类型的虚拟化程序。

准备工作

为了使用openstack-ansible将计算主机添加到 OpenStack 集群中,您需要以下信息:

  • 主机的 IP 地址

  • 访问主机的 SSH

  • 部署主机的 SSH 密钥

  • 访问部署主机

示例中使用的值如下:

  • 计算主机:172.29.236.15

  • 部署主机:controller-01.cook.book

我们假设您的环境已经使用 OpenStack-Ansible 安装,如 第一章 中所述,使用 Ansible 安装 OpenStack

操作方法…

使用 openstack-ansible 安装和配置额外的计算主机,请执行以下步骤:

  1. 部署主机,按以下示例将附加计算主机添加到 /etc/openstack_deploy/openstack_user_config.yml 文件中:

    compute_hosts: compute-01: ip: 172.29.236.13 compute-02: ip: 172.29.236.14 compute-03: ip: 172.29 236.15
  2. 运行 setup-hosts.yml,将任务限制为仅限 compute-03

    cd /opt/openstack-ansible/playbooksopenstack-ansible setup-hosts.yml --limit compute-03
  3. 让 Ansible 收集有关新主机的信息:

    ansible nova_all -m setup -a \'filter=ansible_local gather_subset=\"!all\"\'
  4. 只需运行 os-nova-install.yml 在我们的新计算主机上安装和配置 nova-compute

    openstack-ansible os-nova-install.yml --limit compute-03

    提示

    如果 openstack-ansible 命令失败,可以使用 -v 标志增加详细信息以帮助进行故障排除。多次添加 -v 将提供额外的详细级别。

  5. 在任何控制器服务器上运行以下命令以确认新的虚拟化主机(因为它们运行实用程序容器):

    lxc-attach --name $(lxc-ls -1 | grep utility)source openrcopenstack hypervisor list

    这应该返回如下输出:

    https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00060.jpeg

工作原理…

/etc/openstack_deploy/openstack_user_config 文件提供了在我们的环境中将角色映射到主机的映射。向 compute_hosts 部分添加 compute-03.cook.book 的 IP 地址,告知 openstack-ansible 命令将包、设置等应用到新主机。它还向您的其余环境添加任何所需的配置。

提示

本书不涵盖 Openstack-Ansible playbooks 的详细讨论范围。有关 playbooks 及其操作方式的更多信息,请参阅此处的文档:docs.openstack.org/project-deploy-guide/openstack-ansible/pike/

暂停维护主机

经常需要将主机脱机以更换内存、升级操作系统或执行其他常规维护任务。为了确保运行中的实例不受不利影响,我们使用 openstack compute service set 命令。

准备工作

为了将主机置于维护模式,您将需要以下信息:

  • openstack 命令行实用程序

  • nova 命令行实用程序

  • 带有管理员凭据的 openrc 文件

  • 主机的 名称

我们将置于维护模式的主机如下:

  • 计算主机:compute-03

操作方法…

要删除维护的虚拟化主机,请执行以下步骤:

  1. 首先,我们将列出可用的主机:

    source ~/openrcopenstack compute service list -c Binary -c Host -c Status -f table

    这将返回如下输出:

    https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00061.jpeg

  2. 接下来,我们将禁用称为 nova-compute 的服务以进行计算主机的操作,因此我们将指定:

    openstack compute service set --disable compute-03 nova-compute

    提示

    当成功时,此命令不会产生任何输出。

  3. 使用以下命令验证主机是否已禁用:

    openstack compute service list -c Binary -c Host -c Status -f table

    这将生成如下所示的输出:

    https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00062.jpeg

  4. 一旦计算主机被禁用(意味着它将不再接受请求运行新实例),我们就可以将正在运行的实例从这个禁用的计算主机迁移到我们环境中的其他计算主机上:

    nova host-evacuate-live --block-migrate compute-03

    这将生成如下所示的输出:

    https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00063.jpeg

它是如何工作的…

为了将主机下线进行维护,Nova 必须首先停止在该主机上放置新实例。可以通过使用 openstack service set --disable [host] [service] 命令禁用计算主机上的 nova-compute 服务来完成此操作。一旦主机被标记为禁用,在将其关闭进行维护之前,运行中的实例需要迁移到其他主机。nova host-evacuate-live [host] 命令尝试将所有正在运行的实例实时迁移到指定主机上。它通过要求 Nova 将实例重新调度到具有可用性的主机来实现这一点。

提示

如果实例没有使用共享存储,可以使用 --block-migrate 标志尝试迁移存储。

配置 Nova Scheduler 以使用主机聚合

OpenStack 计算提供了创建名为 主机聚合 的逻辑分组的能力,这些分组允许用户和管理员控制哪些物理计算主机可以运行请求的工作负载。通常,主机聚合用于组织具有相似属性的主机,例如 SSD、性能或已通过 HITRUST 或 PCI 安全审计的主机。一个主机可以被分配到多个聚合中。也就是说,一个主机可以同时属于 PCI 和 SSD 分组。为了在 Nova Scheduler 中启用主机聚合调度,必须首先在 nova.conf 中启用主机聚合过滤。在 openstack-ansible 中,Ansible 管理此文件,我们将使用它来推送适当的更改。

准备工作

确保你在部署主机上拥有 root 权限。在大多数情况下,这是第一个基础设施控制节点 infra01

如何操作…

要启用主机聚合的调度,可以使用以下步骤:

  1. 在部署主机上,将以下行添加到 /etc/openstack_deploy/user_variables.yml 文件中:

    nova_scheduler_default_filters: \"AggregateInstanceExtraSpecsFilter,RetryFilter,AvailabilityZoneFilter,RamFilter,ComputeFilter,ComputeCapabilitiesFilter,ImagePropertiesFilter,ServerGroupAntiAffinityFilter,ServerGroupAffinityFilter,AggregateCoreFilter,AggregateDiskFilter\"
  2. 然后我们可以使用 Ansible 来部署以下命令进行更改:

    cd /opt/openstack-ansible/playbooksopenstack-ansible os-nova-install.yml
  3. 登录到 nova-scheduler 容器并验证更改:

    lxc-attach --name controller-01_nova_scheduler_container-ed0f657dgrep Aggregate /etc/nova/nova.conf

    提示

    容器的名称中有唯一的 UUID。使用以下命令查看容器的名称:

    lxc-ls -f

    如果找到了 Aggregate 这个词,以下输出将被返回,表明更改已成功:

    enabled_filters = AggregateInstanceExtraSpecsFilter,RetryFilter,AvailabilityZoneFilter,RamFilter,ComputeFilter,ComputeCapabilitiesFilter,ImagePropertiesFilter,ServerGroupAntiAffinityFilter,ServerGroupAffinityFilter,AggregateCoreFilter,AggregateDiskFilter

它是如何工作的…

AggregateInstanceExtraSpecsFilter添加到enabled_filters中,告知nova-scheduler将实例的flavor 元数据主机聚合元数据匹配。然后使用openstack-ansible命令将此更改传播到 OpenStack 云环境中的/etc/nova/nova.conf文件。

一旦启用,当请求新的实例时,Nova 调度器会检查与请求相关的 flavor 元数据,并尝试将其与主机聚合的元数据匹配。

创建主机聚合

启用 OpenStack 以允许主机聚合过滤后,我们可以继续创建主机聚合。本食谱将向您展示如何创建主机聚合。

准备工作

要创建主机聚合,您将需要以下信息:

  • openstack命令行客户端

  • 包含适当凭据的openrc文件

  • 聚合的名称

对于我们的示例,主机聚合将命名为cookbook-ssd-hosts

如何操作…

创建主机聚合,请执行以下步骤:

  1. 首先,我们将列出当前的主机聚合:

    openstack aggregate list

    这将产生如下所示的输出:

    https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00064.jpeg

  2. 接下来,我们将创建聚合:

    openstack aggregate create cookbook-ssd-hosts

    这将返回如下所示的输出:

    https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00065.jpeg

  3. 列出主机聚合:

    openstack aggregate list

    这将产生如下所示的输出:

    https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00066.jpeg

它是如何工作的…

在 Nova 中,主机聚合为 OpenStack 管理员和操作员提供了一种机制,可以根据任意属性将主机分组,稍后用于控制哪些计算主机处理用户的请求。创建主机聚合是通过openstack aggregate create name命令完成的。

将计算主机添加到主机聚合

在 OpenStack 计算节点可以使用主机聚合之前,必须首先将主机添加到创建的聚合组中。

准备工作

要将主机添加到聚合中,您将需要以下信息:

  • openstack命令行客户端

  • 包含适当凭据的openrc文件

  • 聚合的名称ID

  • 主机的名称ID

对于以下示例,所需的值如下:

  • 主机聚合:cookbook-ssd-hosts

  • 计算主机:compute-01

如何操作…

以下过程用于将主机添加到主机聚合中:

  1. 列出已经在聚合中的主机:

    openstack aggregate show cookbook-ssd-hosts

    这将返回如下所示的输出:

    https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00067.jpeg

  2. 现在按如下方式将指定的计算主机添加到该聚合中:

    openstack aggregate add host cookbook-ssd-hosts compute-01

    这将返回如下所示的输出:

    https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00068.jpeg

它是如何工作的…

openstack aggregate host add命令将主机与 Nova 数据库中的主机聚合关联。然后,Nova 调度器将根据此信息做出决策,决定将实例放置在哪个主机上。如果主机聚合的元数据与 flavor 或用户所在项目的元数据匹配,则实例可以调度到该聚合内的主机上。

从主机聚合中移除计算主机

如果主机的属性发生变化,或者聚合的需求发生变化,主机可以从主机聚合中移除。

准备工作

要从主机聚合中移除主机,你需要以下信息:

  • openstack命令行客户端

  • 包含适当凭证的openrc文件

  • 聚合的名称ID

  • 主机的名称ID

如何操作……

  1. 使用以下命令列出已在聚合中的主机:

    openstack aggregate show cookbook-ssd-hosts

    这将返回如下输出。请注意,hosts字段显示的是当前与主机聚合相关联的计算主机:

    https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00069.jpeg

  2. 要从此主机聚合中移除计算主机,请发出以下命令:

    openstack aggregate remove host cookbook-ssd-hosts compute-01

    这将返回以下内容。请注意,在hosts字段中,compute-01现在已缺失:

    https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00070.jpeg

它是如何工作的……

从主机聚合中移除主机会告知 OpenStack Compute,该额外的元数据过滤器不再适用,且该主机可以正常调度。

提示

当前,正在运行的实例不受此操作影响。主机聚合的操作仅影响新的实例请求。

向主机聚合添加元数据

主机聚合的强大之处在于能够基于主机的属性将其逻辑分组。这可以用于,例如,启用负载均衡、强制物理隔离,或者防止不安全的实例被调度到受保护的环境中。我们将通过将主机聚合的元数据与实例规格相匹配来展示这一点。

准备工作

要向主机聚合添加元数据,你需要以下信息:

  • openstack命令行客户端

  • 包含适当凭证的openrc文件

  • 聚合的名称ID

  • 要添加的元数据属性

在我们的示例中,这些值将如下所示:

  • 主机聚合:cookbook-ssd-hosts

  • 元数据:ssd=true

如何操作……

要向主机聚合添加元数据,请按照以下过程操作:

  1. 显示与聚合相关联的现有元数据:

    openstack aggregate show cookbook-ssd-hosts

    这将返回如下输出。请注意,如果尚未关联任何元数据,properties字段将是空白的:

    https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00071.jpeg

  2. 使用以下命令添加元数据:

    openstack aggregate set --property ssd=true cookbook-ssd-hosts

    提示

    这个命令在成功时不会显示任何输出。

  3. 现在再次使用以下命令确认元数据的添加:

    openstack aggregate show cookbook-ssd-hosts

    你将看到properties字段已更新,包含以下信息:

    https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00072.jpeg

  4. 现在我们已经设置了主机聚合的元数据,我们可以将其与配置关联,这样当用户在启动过程中指定该配置时,Nova 将根据该属性仅匹配主机聚合组中的主机。例如,我们可能有一个名为cookbook.ssd的配置,它设定了预期,当用户选择时,该主机将提供 SSD。这就是主机聚合的强大之处。在此示例中,compute-02主机提供 SSD,因为我们在名为cookbook-ssd-hosts的主机聚合中指定了这一点。为了利用这一点,让我们创建一个新的配置,名为cookbook.ssd,并设置ssd=true属性:

    openstack flavor create --vcpus 1 --ram 512 --disk 5 --public cookbook.ssd

    提示

    创建配置的详细说明请参见创建配置示例。

  5. 现在我们需要设置配置的额外规格,以便在选择配置时它与相关的主机聚合关联。为此,我们使用nova命令:

    nova flavor-key cookbook.ssd set ssd=true

    提示

    您可能需要使用配置的 UUID,而不是名称。如果是这样,请使用以下命令列出配置,并使用cookbook.ssd配置的 UUID:

    openstack flavor list
  6. 现在,当用户选择cookbook.ssd配置时,他们可能并不知道,该实例将仅限于具有此键值对的主机聚合组中的主机。

它是如何工作的…

元数据以键/值对的形式指定,然后与 Nova 数据库中的主机聚合关联。这些键/值对是任意的,可以定义以适应特定环境。一个主机聚合可以存储任意数量的键/值对;然而,这可能会对实例调度产生不利影响,因为可能存在冲突或混淆的键/值对。

删除主机聚合

当主机聚合在给定环境中不再适用时,可以删除它。删除主机聚合之前,必须先移除所有主机。

准备工作

要删除主机聚合,您需要以下信息:

  • openstack命令行客户端

  • 包含适当凭证的openrc文件

  • 聚合的名称ID

在以下示例中,我们将删除cookbook-threadripper-hosts聚合。

如何操作…

以下命令用于删除主机聚合:

  1. 首先,列出现有的聚合:

    openstack aggregate list

    这将返回以下输出:

    https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00073.jpeg

  2. 确认聚合中没有主机(如有必要,请参考从主机聚合中移除计算主机的示例):

    openstack aggregate show cookbook-threadripper-hosts

    这将返回以下输出:

    https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00074.jpeg

  3. 现在我们可以使用以下命令删除聚合:

    openstack aggregate delete cookbook-threadripper-hosts

    提示

    此命令在成功时不会产生输出。

  4. 使用以下命令确认更改:

    openstack aggregate list

    这将返回以下输出,其中主机聚合已被删除:

    https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00075.jpeg

它是如何工作的…

删除主机聚合会将其及其所有元数据从 Nova 数据库中移除,并且它将不再用于实例调度。

创建可用区

可用区AZ)是主机聚合的特殊情况。在这里,主机聚合由 Nova 用于进行调度决策;通常它们只对 OpenStack 云的操作员和管理员可见。AZ 则是终端用户可见的组件。AZ 可以像主机聚合一样进行配置,以代表硬件的特性。

AZ 通常用于定义故障域,例如机柜、数据中心,甚至地理位置。在配置 AZ 时,需要注意的是,每个主机一次只能属于一个 AZ。

注意

由于 AZ 是主机聚合的特殊用例,很多操作(如添加和删除主机)与聚合相同。因此,这些操作不再重复说明。

创建 AZ 是一个两步过程。首先,我们使用--zone参数创建一个聚合,或者将其添加到现有的聚合中。其次,在实例可以调度到该区之前,必须将主机添加到聚合中。

准备就绪

创建 AZ 时,您需要以下信息:

  • openstack命令行客户端

  • 包含适当凭证的openrc文件

  • 聚合的名称ID

  • AZ 的期望名称

  • 要添加到 AZ 的主机主机

对于我们的示例,以下是这些值:

  • 聚合名称:cookbook-az

  • 可用区名称:cookbook-az

  • 计算主机:compute-01

操作方法…

创建 AZ 时需要执行以下步骤:

  1. 首先,我们将使用以下命令列出当前的 AZ:

    openstack availability zone list

    这将返回如下输出:

    https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00076.jpeg

  2. 使用--zone参数创建新的聚合:

    openstack aggregate create --zone cookbook-az cookbook-az

    这将返回如下输出:

    https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00077.jpeg

  3. 现在使用以下命令将主机添加到聚合中:

    openstack aggregate add host cookbook-az compute-01

    成功时,返回如下输出:

    https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00078.jpeg

  4. 现在列出我们可用的 AZ:

    openstack availability zone list

    这将显示以下内容:

    https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00079.jpeg

    提示

    列出所有可用的可用区(AZ),不论其中是否存在主机。要验证某个 AZ 中的主机,可以执行以下命令:

    openstack availability zone show nameofAZ

    这将返回如步骤 3 所示的输出。

工作原理…

第一个命令openstack availability zone list列出了所有 AZ。接下来,在创建新聚合时,传递特殊的--zone cookbook-az参数,告诉 OpenStack Nova 这个聚合也是一个 AZ,并指定其名称。最后,像将主机添加到聚合一样将主机添加到 AZ。

启动实例到可用区

可以通过在创建过程中传递--availability-zone参数,将实例创建到指定的 AZ。此外,AZ 也可以在 OpenStack Horizon 中的实例创建向导中选择。

准备就绪

启动实例到 AZ 时需要以下信息:

  • openstack命令行客户端

  • 包含适当凭证的openrc文件

  • AZ 的名称ID

  • 启动实例所需的附加信息

    提示

    创建实例的详细步骤在启动实例的示例中有详细说明。因此,这个示例跳过了一些细节,专注于如何在特定的 AZ 中创建实例。

如何操作…

要将实例引导到特定的 AZ,需在运行openstack server create命令时指定--availability-zone参数:

openstack server create --flavor openstack.cookbook --image 08b822ba-be44-4639-b577-45e8dd37c06d --nic net-id=6cb5a4ce-1ea5-4817-9c34-a2212a66f394 --security-group bd7d5e0f-538a-4d93-b123-98cc3207b3d2 --key-name cookbook_key --availability-zone cookbook-az cookbook.test-03

这将带回如下输出,显示实例所在的 AZ(OS-EXT-AZ:availability-zone字段):

https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00080.jpeg

工作原理…

如果指定了--availability-zone参数,Nova 调度程序会检查指定的 AZ,看看是否可以满足请求。

移除可用性区域

移除 AZ 是一个多步骤的过程,并且有一些注意事项。要移除 AZ,必须先从主机聚合中移除主机。

准备工作

删除 AZ 所需的以下信息:

  • openstack命令行客户端

  • 包含适当凭据的openrc文件

  • AZ 的名称ID

如何操作…

以下步骤可用于移除一个 AZ:

  1. 首先,使用以下命令列出可用的 AZ:

    openstack availability zone list

    这将带回如下输出:

    https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00081.jpeg

  2. 现在列出我们要删除的 AZ 中的主机:

    openstack aggregate show cookbook-az

    这将带回如下输出:

    https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00082.jpeg

  3. 现在使用以下命令移除主机(根据需要重复每个主机的操作):

    openstack aggregate remove host cookbook-az compute-01

    这将带回以下输出:

    https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00083.jpeg

  4. 使用aggregate delete命令移除 AZ:

    openstack aggregate delete cookbook-az

    提示

    如果成功,该命令将不产生任何输出。

  5. 使用以下命令确认 AZ 的移除:

    openstack availability zone list

    这将带回如下输出,显示我们的 AZ 已被移除:

    https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00084.jpeg

工作原理…

要移除 AZ,首先必须确保没有活动主机。因为 AZ 是主机聚合的特例,用于识别和移除主机的命令相同。一旦移除了主机,使用openstack aggregate delete [name]命令完成 AZ 的移除。

创建一个 flavor

在 Nova 可以启动实例之前,首先需要知道应分配给这些实例的资源。Nova 处理资源分配的方式是定义flavors。一个 flavor 指定了分配给实例的 vCPU 数、RAM 和磁盘大小。

准备工作

要创建一个新的 flavor,您需要以下内容:

  • openstack命令行客户端

  • 包含适当凭据的openrc文件

  • 新 flavor 的名称vCPURAM磁盘

在本示例中我们将创建的 flavor 将具有以下属性:

  • Flavor 名称:openstack.cookbook

  • vCPU:1

  • RAM:512 MB

  • 磁盘:5 GB

  • 可见性:公共

如何操作…

以下命令用于创建新的 flavor:

  1. 首先,使用以下命令列出我们环境中已配置的可用 flavor:

    openstack flavor list

    这将返回如下所示的输出:

    https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00085.jpeg

  2. 使用我们提供的属性创建 flavor:

    openstack flavor create --vcpus 1 --ram 512 --disk 5 --public openstack.cookbook

    这将返回如下所示的输出:

    https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00086.jpeg

  3. 再次列出 flavor,以查看新 flavor:

    openstack flavor list

    这将输出如下所示的内容:

    https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00087.jpeg

如何操作…

openstack flavor create --vcpus [vcpu_count] --ram [ram_MB] --disk [disk_GB] --public [name]命令用于定义 flavor。--public选项用于指定该 flavor 是否应对所有 OpenStack 环境中的用户可用,或者是否应仅限于用户所属项目的范围和可见性。

删除 flavor

由于需求的变化,可能会有对更多性能的要求,或者业务需求发生变化。无论原因如何,现有的 flavor 可能无法满足使用云资源的需求。当某个 flavor 不再适用时,它需要被删除。

提示

与正在运行的实例相关联的 flavor 无法删除。

准备就绪

要更改 Nova 的 flavor 属性,您需要以下内容:

  • openstack命令行客户端

  • 包含适当凭证的openrc文件

  • 要删除 flavor 的名称

如何操作…

以下命令用于删除 flavor:

  1. 首先,列出可用的 flavor:

    openstack flavor list

    这将返回如下所示的 flavor 列表:

    https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00088.jpeg

  2. 要删除 flavor,请执行以下命令:

    openstack flavor delete openstack.cookbook

    提示

    该命令执行成功时不会显示任何输出。

  3. 再次列出 flavor,以查看更新后的属性:

    openstack flavor list

    再次列出当前可用的 flavor:

    https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00089.jpeg

如何操作…

删除 flavor 时使用openstack flavor delete [name]命令。如果需要删除多个 flavor,可以指定多个名称或 ID,每个名称或 ID 之间用空格分隔。

为 flavor 设置 CPU 限制

除了定义分配给实例的 vCPU 数量外,还可以进一步限制这些 CPU 周期的使用。Nova 依赖于底层的虚拟化管理程序来实现 CPU 限制,因此可用的值可能会有所不同。我们的示例基于 QEMU/KVM。

CPU 限制是您可能会遇到的 flavor 属性的特殊情况。

准备就绪

要为 flavor 添加 CPU 限制,您需要以下内容:

  • openstack命令行客户端

  • 包含适当凭证的openrc文件

  • 要更改 flavor 的名称

  • 您希望设置的 CPU 限制值(分配的 CPU 每个周期可消耗的时间份额,以毫秒为单位)

我们示例中的这些值如下:

  • cpu_quota = 5000 ms

  • cpu_period = 2500 ms

如何操作…

以下命令用于为 flavor 添加 CPU 限制。

提示

CPU 限制不是实时应用的,而是在实例启动时应用。

在撰写本文时,openstack 命令行客户端是查看和更改此设置的唯一方式。默认情况下,查看实例属性时也不会显示此设置。

  1. 首先,查看我们正在更改的 flavor 的当前属性,注意我们没有设置 properties

    openstack flavor show openstack.cookbook

    这将给出如下输出:

    https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00090.jpeg

  2. 添加 CPU 限制:

    openstack flavor set --property quota:cpu_quota=5000 --property quota:cpu_period=2500 openstack.cookbook

    提示

    此命令成功时不会显示任何输出

  3. 通过再次查询 flavor 来查看 CPU 限制,注意 properties 字段:

    openstack flavor show openstack.cookbook

    这将给出类似以下的输出:

    https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00091.jpeg

它是如何工作的…

为了帮助缓解 吵闹邻居 问题,或者进一步定义服务等级,OpenStack 支持 CPU 限制。在 OpenStack 中,这被称为 实例资源配额。CPU 限制是 flavor 定义的一部分。也就是说,给定 flavor 的所有实例都会有相同的 CPU 限制。

强加 CPU 限制是特定于虚拟化管理程序的。对于 KVM/libvirt 环境,CPU 限制是通过 cgroups 强制实施的,结合使用以下三个值:

  • cpu_shares

  • cpu_quota

  • cpu_period

对于这些值及其交互的完整讨论超出了本书的范围。不过,你可以在 OpenStack wiki 上找到详细的解释,网址如下:

wiki.openstack.org/wiki/InstanceResourceQuota

为 flavor 设置 IOPS 限制

与 CPU 限制一样,IOPS 限制也可以被施加,以防止某个实例类型占用系统上所有可用的 IO。此处的 IOPS 指的是存储和网络 IO。同时,像 CPU 限制一样,IOPS 限制是 flavor 属性的一个特殊案例,你可能会经常遇到。

提示

在撰写本文时,openstack 命令行客户端是查看和更改此设置的唯一方式。默认情况下,查看实例属性时也不会显示此设置。

准备就绪

要向 flavor 添加 IOPS 限制,你需要以下内容:

  • openstack 命令行客户端

  • 包含适当凭据的 openrc 文件

  • 要更改的 flavor 的 名称

  • 你希望设置的 IOPS 限制值。

  • 在我们的示例中,这些值如下:

  • disk_read_iops = 100 IOPS

  • disk_write_iops = 100 IOPS

如何操作…

以下命令用于向 flavor 添加 IOPS 限制:

提示

与更改 flavor 属性一样,IOPS 限制不会应用于正在运行的实例。相反,它们是在实例启动时应用的。

  1. 首先,查看正在更改的 flavor 的属性,注意 properties 字段为空:

    openstack flavor show openstack.cookbook

    这将给出类似以下的输出:

    https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00092.jpeg

  2. 现在我们可以使用以下命令添加 IOPS 限制:

    openstack flavor set --property quota:disk_read_iops=100 --property quota:disk_write_iops=100 openstack.cookbook

    提示

    此命令成功时不会显示任何输出。

  3. 我们可以通过查看 flavor 属性来验证 IOPS 限制:

    openstack flavor show openstack.cookbook

    这将返回类似以下的输出,注意我们现在已经设置属性以反映施加的 IOPS:

    https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00093.jpeg

它是如何工作的……

与 CPU 限制一样,IO 限制也在 flavor 级别定义。然而,与 CPU 限制不同,IO 限制可以由虚拟机监控程序、存储层或两者的组合来应用。

要为给定的 flavor 设置 IOPS 限制值,请使用以下openstack命令:

openstack flavor set --property quota:disk_read_iops=[read_iops] --property quota:disk_write_iops=[write_iops] [name]

虽然为了完整性显示了读写 IOPS,但你不需要同时指定两者。

启动实例

使用实例可以执行的最基本任务是生命周期任务。在本示例中,我们将向你展示如何启动或引导实例。

准备就绪

要启动一个实例,你将需要以下内容:

  • openstack命令行客户端

  • 包含适当凭据的openrc文件

  • 实例的名称

  • 用于实例的镜像

  • 用于创建实例的flavor名称

  • 要将实例附加到的网络的名称

  • 用于允许访问实例的密钥对名称

  • 与实例关联的任何安全组名称

它是如何工作的……

我们将启动的实例将具有以下属性:

  • 实例名称:cookbook.test

  • Flavor 类型:openstack.cookbook

  • 镜像名称:Ubuntu 16.04 amd64 (UUID)

  • 网络:public (UUID)

  • 密钥对名称:cookbook_key

  • 安全组:ssh

要启动一个实例,使用以下步骤:

  1. 要列出当前正在运行的实例,我们执行以下命令:

    openstack server list

    提示

    如果没有实例,这个命令将不会产生任何输出。

  2. 列出可用的镜像:

    openstack image list

    这将返回一个可用镜像的列表:

    https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00094.jpeg

  3. 列出可用的网络:

    openstack network list

    这将列出我们可以将实例附加到的网络:

    https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00095.jpeg

  4. 创建一个密钥对(如果你还没有创建并可供使用):

    ssh-keygen -q -N \"\"

    还可以使用以下命令上传:

    openstack keypair create --public-key ~/.ssh/id_rsa.pub cookbook_key

    这将返回一个输出,显示您的密钥指纹:

    https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00096.jpeg

  5. 现在我们可以使用以下命令启动实例:

    openstack server create --flavor openstack.cookbook --image 08b822ba-be44-4639-b577-45e8dd37c06d --nic net-id=6cb5a4ce-1ea5-4817-9c34-a2212a66f394 --security-group ssh --key-name cookbook_key cookbook.test

    这将产生一个输出表,显示实例正在引导(为了简洁起见,此处不显示)。

  6. 要查看已启动实例的更多信息,请执行以下命令:

    openstack server show cookbook.test

    这将输出如下内容:

    https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00097.jpeg

它是如何工作的……

在记录下需要输入的一些必需值后,例如我们要启动的镜像的 UUID 和要将实例附加到的网络的 UUID,我们然后调用了 OpenStack 客户端中的一个工具来启动我们的实例。该命令行的一部分指向要使用的密钥对。然后我们通过生成的密钥对中的私钥连接到实例。

云实例如何知道使用哪个密钥?作为该镜像启动脚本的一部分,它会回调到元服务器,这是 nova-apinova-api-metadata 服务的一个功能。元服务器充当我们实例和外部世界之间的桥梁,云-init 启动过程可以调用它,在这种情况下,它下载一个脚本,将我们的私钥注入到 Ubuntu 用户的 .ssh/authorized_keys 文件中。

当云实例启动时,它会生成一些关于该实例的有用指标和详细信息。这些通过 openstack server listopenstack server show 命令呈现。openstack server list 命令显示一个简洁的版本,列出实例的 ID、名称、状态和 IP 地址。

停止实例

有时,实例需要停止,可能是出于多种原因,例如维护和离线迁移,但作为 OpenStack 管理员,您可能不想完全销毁实例及其相关数据。因此,您可能只想停止实例。

准备就绪

要停止实例,您需要以下内容:

  • openstack 命令行客户端

  • 包含适当凭证的 openrc 文件

  • 实例的 名称

如何操作…

在此示例中,我们将停止在 启动实例 方案中创建的 cookbook.test 实例。要停止实例,请按照以下步骤操作:

  1. 首先,我们列出正在运行的实例:

    openstack server list

    这将返回一个正在运行的实例列表。考虑以下示例:

    https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00098.jpeg

  2. 要停止实例,只需执行以下命令:

    openstack server stop cookbook.test

    提示

    该命令完成需要一些时间,如果成功,将不会显示输出。

  3. 现在列出实例以确认实例的状态。在这里,我们正在寻找 cookbook.test 实例的 SHUTOFF 状态:

    openstack server list

    这将输出以下内容:

    https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00099.jpeg

它是如何工作的…

要停止实例,我们使用 openstack 客户端的 server stop 命令:openstack server stop [名称或 ID]。这会告诉 Nova 关闭实例的电源。这相当于按住笔记本电脑的电源按钮或拔掉服务器的电源线。

删除实例

要完成实例的生命周期,您需要删除它。Nova 提供了这个功能,通过 openstack 命令行工具来实现。

准备就绪

要删除一个实例,您需要以下内容:

  • openstack 命令行客户端

  • 包含适当凭证的 openrc 文件

  • 实例的 名称

如何操作…

在这个示例中,我们将删除在 启动实例 方案中创建的 cookbook.test 实例。要删除实例,请按照以下步骤操作:

  1. 首先,列出正在运行的实例:

    openstack server list

    https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00100.jpeg

  2. 要删除名为 cookbook.test 的实例,请执行以下命令:

    openstack server delete cookbook.test

    提示

    如果命令成功执行,将不会有输出。

  3. 现在再次列出实例以确认删除:

    openstack server list

    这将返回一个输出,显示我们删除的实例现在已不在:

    https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00101.jpeg

它是如何工作的…

openstack server delete命令不同于暂停或挂起实例,它会删除实例及其中的所有数据。

实时迁移

云计算的一个关键理念是将硬件抽象化。然而,硬件确实需要定期维护,或者主机需要进行软件升级。无论是什么原因,主机可能需要下线进行维护,理想情况下,实例的停机时间应该尽可能少。为了适应这一需求,Nova 提供了两种实时迁移实例的方法:当环境中没有共享存储时使用块迁移,当实例从共享存储启动时使用实时迁移标志(在每个计算主机都能看到每个实例的启动卷时,实例将从共享存储启动)。

准备就绪

要进行实例的实时迁移,您需要以下信息:

  • openstack命令行客户端

  • 包含适当管理员凭证的openrc文件

  • 实例的名称

  • 目标虚拟化管理程序的名称

提示

如果你的环境配置为实例从共享存储(例如 Ceph 提供的 RBD)启动,那么实时迁移几乎是瞬时完成的(这取决于实例的忙碌程度)。一个叫做块迁移的特性要慢得多。块迁移用于没有为实例提供共享存储的环境中。

迁移只能由具有管理员角色权限的用户执行。

如何操作…

  1. 首先,我们列出可用的虚拟化管理程序。我们需要记录可以将正在运行的实例迁移到的地方:

    openstack hypervisor list

    这将返回如下所示的输出:

    https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00102.jpeg

  2. 接下来,查看实例属性以识别源主机:

    openstack server show cookbook.test -c name -c OS-EXT-SRV-ATTR:hypervisor_hostname

    这将返回我们感兴趣的字段(也称为列名,使用-c标志标识)。请注意,在这个例子中,名为cookbook.test的实例正在名为compute-01.cook.book的虚拟化管理程序上运行:

    https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00103.jpeg

  3. 要执行没有共享存储可用的实例实时迁移,请发出以下命令:

    openstack server migrate --block-migration cookbook.test

    提示

    我们不使用--block-migration方法指定目标计算主机,而是让 Nova 调度器决定下一个可用的虚拟化管理程序。

    当成功时,此命令不会显示任何输出。

    要实时迁移实例,使用共享存储(如 Ceph),请发出以下命令:

    openstack server migrate cookbook.test --live compute-02.cook.book

    提示

    我们通过--live标志指定目标虚拟化管理程序。

    当成功时,此命令不会显示任何输出。

  4. 检查迁移状态:

    openstack server show -c name -c OS-EXT-STS:task_state cookbook.test

    由于块迁移通常需要更长的时间,您可能会看到状态为resize_migrating,这表示迁移任务仍在进行中:

    https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00104.jpeg

  5. 使用以下命令验证迁移,确保实例现在运行在不同的虚拟化管理程序上:

    openstack server show cookbook.test -c name -c OS-EXT-SRV-ATTR:hypervisor_hostname

    这将返回如下所示的输出:

    https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00105.jpeg

提示

任何类型的迁移通常最好在实例未被大量使用时进行。

它是如何工作的…

实时迁移是一个关键特性,使 OpenStack 操作员和管理员能够在不影响云服务消费者的情况下,对底层云基础设施进行维护。此外,OpenStack 管理员可以使用来自资源监控服务(如 Ceilometer)的遥测数据,并做出实时迁移决策,以平衡 OpenStack 云中的工作负载。

OpenStack 中的实时迁移由 libvirt 驱动程序处理。具体来说,当您发出openstack server migrate命令时,OpenStack Compute 会从一个计算主机上的 libvirtd 建立到远程主机上同一进程的连接。一旦建立了此连接,根据您指定的参数,实例的内存状态会同步,并且控制权会转移。在前面的示例中,我们首先指定了额外的--block-migrate参数,它在没有共享存储的情况下处理实例磁盘文件的移动,然后我们展示了如何在实例从共享存储启动时使用--live标志。

提示

记住:迁移只能由具有admin角色的用户执行。

对实例进行快照

对实例进行快照将创建实例在拍摄快照时的 Glance 镜像。然后,您可以使用该镜像部署给定应用程序的额外实例,或作为实例的可启动备份。

准备工作

为了创建实例的快照,您需要以下信息:

  • openstack命令行客户端

  • 包含适当凭证的openrc文件

  • 实例的名称

如何操作…

以下命令用于创建实例快照:

  1. 首先,我们使用以下命令列出现有镜像:

    openstack image list -c Name -c Status

    这将返回如下所示的镜像列表:

    https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00106.jpeg

  2. 现在,使用以下命令列出正在运行的实例:

    openstack server list -c Name -c Status

    这将输出如下所示的内容:

    https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00107.jpeg

  3. 要创建快照,请执行以下命令(请注意我们使用的可选 shell 扩展命令,它会为快照名称添加时间戳):

    openstack server image create --name cookbook.test_snapshot-$(date +\"%FT%H%M%S\") cookbook.test

    这将输出如下所示的内容:

    https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00108.jpeg

  4. 我们可以使用以下命令验证快照是否已创建。请注意,我们将屏幕截图限制为仅显示我们的快照镜像:

    openstack image list

    这将输出显示我们的快照镜像:

    https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00109.jpeg

它是如何工作的…

实例快照会创建正在运行实例的 Glance 镜像。该快照可以用于备份、重新分发或作为持续部署管道中的构建工件。使用openstack server image create --name [snapshot_name] [instance]创建的镜像是可启动的。您可以灵活地使用这些镜像。

还有更多…

实例快照非常强大。虽然本书无法详细探讨其所有可能性,但以下示例展示了使用此功能可以实现的目标:一种轻松备份所有运行实例的方式。

要快照每个实例,请使用以下命令:

for instance in $(openstack server list -f value -c ID); do { openstack server image create \\ --name \"${instance}\"-$(date +\"%FT%H%M%S\") ${instance}}; done

小贴士

警告:不推荐在较大的环境中对每个实例进行快照。除了耗时之外,它还可能消耗 Glance 使用的相当大一部分存储空间,因为快照不像您可能使用的原始 QCOW2 镜像那样稀疏创建

从快照启动实例

现在我们已经创建了一个实例快照,假设我们需要回滚并恢复文件,或将应用程序恢复到快照创建时的状态。由于快照作为 OpenStack 镜像存储,您可以直接从快照启动,因此启动实例所需的所有细节也适用于启动快照。

准备就绪

要从快照启动实例,您将需要以下内容:

  • openstack命令行客户端

  • 包含适当凭证的openrc文件

  • 实例的名称

  • 用于实例的快照

  • 用于创建实例的规格名称(此规格必须与原始实例使用的规格大小相等或更大)

  • 要附加到实例的网络或网络名称

  • 允许访问实例的密钥对名称

  • 任何安全组的名称,用于与实例关联

如何操作…

我们将启动的实例将具有以下属性:

  • 镜像名称:cookbook.test_snapshot-2017-09-08T163619

  • 实例名称:cookbook.test_restore

  • 规格类型:openstack.cookbook

  • 网络:public(UUID)

  • 密钥对名称:cookbook_key

  • 安全组:ssh

要从实例快照启动,我们使用与启动实例相同的过程。以下命令是重复的:

  1. 首先,我们可以使用以下命令列出现有的运行实例:

    openstack server list -c Name -c Status

    这将返回一个ACTIVE运行实例的列表:

    https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00110.jpeg

  2. 然后我们可以使用以下命令启动实例快照:

    openstack server create --flavor openstack.cookbook --image cookbook.test_snapshot-2017-09-08T163619 --nic net-id=6cb5a4ce-1ea5-4817-9c34-a2212a66f394 --security-group bd7d5e0f-538a-4d93-b123-98cc3207b3d2 --key-name cookbook_key cookbook.test_restore

    这将返回熟悉的启动实例的输出,已在此省略。

  3. 现在我们可以再次列出运行中的实例,以显示我们的cookbook.test_restore实例是ACTIVE的:

    openstack server list -c Name -c Status

    这显示我们的实例现在正在运行:

    https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00111.jpeg

它是如何工作的…

由于实例快照存储为 OpenStack 镜像,从快照启动的过程与从现有镜像启动的过程相同。然而,存在一些注意事项。由于快照是在镜像运行时创建的,从它们启动的过程类似于在断电后启动服务器。您还必须确保使用的 flavor 与原始实例相同或更大。例如,如果一个实例最初创建为 m1.large,则必须使用 m1.large 或更大的 flavor 来启动快照。此外,如果实例是附加到 Active Directory 域的 Windows 镜像,可能会导致两个相同的实例同时运行时出现问题。为缓解此问题,请考虑将实例启动到单独的恢复网络上。

提示

有一些工具可用于暂停实例内的文件系统,并提供一个更一致的镜像,这超出了本书的范围。然而,作为指导,建议在拍摄快照之前,确保运行实例内的文件系统同步(以刷新任何磁盘写入)。

救援一个实例

OpenStack Compute 提供了一个方便的故障排除工具——救援模式。如果用户丢失了 SSH 密钥,或者无法启动并访问实例,例如,出现错误的 iptables 设置或失败的网络配置,救援模式会启动一个最小化实例并附加来自故障实例的磁盘以帮助恢复。这个过程适用于 Windows 和 Linux 实例,因为它本质上允许将故障实例的引导卷作为二级磁盘附加到救援实例上。

准备工作

要将实例置于救援模式,您需要以下信息:

  • openstack命令行客户端

  • 包含适当凭证的openrc文件

  • 实例的名称ID

本示例中使用的实例是cookbook.test

如何操作…

要将实例置于救援模式,请按照以下步骤操作:

  1. 首先,我们将按以下方式将实例置于救援模式:

    openstack server rescue cookbook.test

    这将向我们展示一个临时密码,我们可以使用它来访问救援实例:

    https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00112.jpeg

  2. 要验证实例是否处于救援模式,请使用以下命令:

    openstack server show cookbook.test -c name -c status

    这将显示status值为RESCUE

    https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00113.jpeg

  3. 此时,我们可以使用root用户名和我们获得的临时密码访问该实例,并在挂载的文件系统上执行操作系统救援命令(即原始故障实例的引导卷文件系统)。

    提示

    在救援模式下,实例的磁盘将作为二级磁盘附加。为了访问磁盘上的数据,您需要将其挂载。由于操作系统和部署方式之间的文件系统差异,本书不涉及挂载过程。

  4. 要退出救援模式,请使用以下命令:

    openstack server unrescue cookbook.test

    提示

    如果命令成功执行,将不会产生任何输出。

它是如何工作的……

openstack server rescue命令提供一个救援环境,并将你的实例磁盘附加到该环境中。首先,它关闭指定的实例,然后启动救援环境并附加原始实例的磁盘。最后,它为你提供救援实例的登录凭证。

通过 SSH 访问救援实例。一旦登录到救援实例,你可以使用命令 mount /mnt 挂载磁盘。

一旦完成故障排除或恢复,unrescue命令会逆转此过程:首先停止救援环境并分离磁盘,然后按原样启动实例。

将实例置于架空状态

OpenStack Nova 中有一个稍微独特的功能,那就是能够将实例置于架空状态。实例架空允许你停止实例而不消耗资源。一个架空的实例将被保留为一个可启动的实例,并保留它所分配的资源(如 IP 地址),该实例将保持一定时间后被删除。这在实例生命周期过程中或节省资源时非常有用。

提示

停止与架空有什么区别?

停止实例并不会释放作为配额一部分仍然可用的资源,因为假设你将在短时间内重新启动该实例。如果你没有剩余的 CPU 或 RAM 配额,便无法启动已停止的实例。已停止实例的资源仍然被视为 OpenStack 计算调度程序的已使用资源

然而,将实例置于架空状态可以释放这些资源,但仍然允许你在稍后的时间访问已架空的实例。解除架空时,配额规则和限制仍然适用,但将实例置于架空状态可以让你在保持实例数据的同时,在分配的资源配额内工作。

准备工作

要将实例置于架空状态,需提供以下信息:

  • openstack命令行客户端

  • 包含适当凭证的openrc文件

  • 实例的名称ID

操作方法…

要将实例置于架空状态,使用以下命令:

  1. 首先,我们检查实例的状态:

    openstack server show cookbook.test -c name -c status

    确保你的实例的statusACTIVE

    https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00114.jpeg

  2. 要将实例置于架空状态,执行以下命令:

    openstack server shelve cookbook.test

    提示

    该命令执行成功时不会产生任何输出。将实例置于架空状态可能需要一些时间,具体取决于你的环境。

  3. 要检查实例的状态,执行以下命令,注意新的状态:

    openstack server show cookbook.test -c name -c addresses -c status

    status值已更改为SHELVED_OFFLOADED

    https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00115.jpeg

    提示

    一个架空的实例将保留它已分配的地址。

  4. 要解除架空实例并将其恢复为ACTIVE状态,只需执行以下命令:

    openstack server unshelve cookbook.test

    提示

    该命令执行成功时不会产生任何输出。与架空操作一样,实例可能需要几分钟才能变为活动状态,这取决于你的环境。

  5. 我们可以通过检查状态来验证该状态:

    openstack server show cookbook.test -c name -c addresses -c status

    status值已返回ACTIVE

    https://github.com/OpenDocCN/freelearn-devops-pt8-zh/raw/master/docs/opstk-cld-comp-cb-4e/img/00116.jpeg

它是如何工作的…

当被要求架空实例时,OpenStack Compute 会先停止该实例。然后,它会创建一个实例快照以保留该实例的状态。运行时的细节,例如 vCPU 数量、内存和 IP 地址,会被保留,以便可以在稍后的时间将实例恢复并重新调度。

这与关闭实例不同,因为关闭实例的资源仍然保留在其所在的主机上,以便可以快速重新启动。然而,已架空的实例仍会出现在openstack server list中,分配的资源将保持可用。此外,由于已架空的实例需要从镜像恢复,OpenStack Compute 将执行放置操作,就像该实例是全新的一样,启动时将需要一些时间。

审查控制台日志

控制台日志对于排查实例启动过程中的问题至关重要。这些日志在启动时生成,在控制台可用之前。通常,在使用云托管实例时,访问这些日志可能比较困难。OpenStack Compute 提供了一种访问控制台日志的机制。

准备工作

要访问实例的控制台日志,需要以下信息:

  • openstack命令行客户端

  • 包含适当凭据的openrc文件

  • 实例的名称ID

在此示例中,我们将查看cookbook.test实例的最后五行。

如何操作…

要显示实例的控制台日志,请使用以下命令:

openstack console log show --lines 5 cookbook.test

这将连接到实例的串行控制台输出,模拟如同监视器直接连接到物理服务器的信息:

[[0;32m OK [0m] Started udev Coldplug all Devices.[[0;32m OK [0m] Started Dispatch Password Requests to Console Directory Watch.[[0;32m OK [0m] Started Set console font and keymap.[[0;32m OK [0m] Created slice system-getty.slice.[[0;32m OK [0m] Found device /dev/ttyS0.

它是如何工作的…

openstack console log show命令收集控制台日志,就像你通过串行端口连接到服务器或在启动时坐在键盘和显示器后面一样。默认情况下,该命令将返回所有生成的日志。要限制输出量,可以使用--lines参数返回日志末尾的特定行数。