管理实例和主机

“实例”,是运行在云中物理主机上的虚拟机。Compute服务管理着众多的实例。“主机”是一组实例栖身的物理节点。

本章介绍了实例管理中的各种不同的任务,比如添加浮动IP,关闭和启动实例,以及删除实例等等。本节也介绍了一些物理节点的管理任务。

管理IP地址

每个实例都有一个内网的固定IP,不过还可以为其添加一个对外的IP,或者叫“浮动IP”。内网IP是用来和其他实例间通信的,而公网是用来和外网的云设施通信的,而且也经常用来和互联网上的设备通信。

当您创建了一个实例,OpenStack会自动为其分配一个内网IP,这个地址一直会保持不变,直到您将该实例销毁。您重启实例也不会影响这个内网IP。

浮动IP资源池则是由云管理员设置的,该服务在OpenStack Compute中可用。每个Project的资源配额决定了您能在这个Project分配的浮动IP的最大数量。在您给某个实例分配了一个浮动IP之后,您能够:

  • 将该浮动IP地址和Project中的这个实例相关联。但是,一个浮动IP,同一时间内只能分配给一个实例。
  • 将该浮动IP从实例上解除关联。
  • 从Project中删除浮动IP,并且连带删除该IP的各种关联。

您可以使用nova floating-ip-*命令来管理浮动IP地址。

列出浮动IP信息

列出所有的浮动IP资源池,请使用如下命令:

$ nova floating-ip-pool-list
+--------+
| name   |
+--------+
| public |
| test   |
+--------+

注意: 如果这个列表里没有东西,云管理员必须先创建一个浮动IP资源池。

想列出分配给当前Project的所有浮动IP地址,请使用如下命令:

$ nova floating-ip-list
+--------------+--------------------------------------+----------+--------+
| Ip           | Instance Id                          | Fixed Ip | Pool   |
+--------------+--------------------------------------+----------+--------+
| 172.24.4.225 | 4a60ff6a-7a3c-49d7-9515-86ae501044c6 | 10.0.0.2 | public |
| 172.24.4.226 | None                                 | None     | public |
+--------------+--------------------------------------+----------+--------+

对于每个分配给当前Project的浮动IP,上面的这个命令能返回以下四个结果:该浮动IP地址,该浮动IP关联的实例的ID,关联的固定IP地址,以及这个浮动IP地址的来源池。

分配浮动IP

您可以将浮动IP分配给Project,也可以分配给instance。

  1. 运行如下命令,将一个浮动IP分配给当前Project。默认情况下,该浮动IP是从公共的资源池而来的。该命令的返回结果中会显示本次分配的地址。
$ nova floating-ip-create
+--------------+-------------+----------+--------+
| Ip           | Instance Id | Fixed Ip | Pool   |
+--------------+-------------+----------+--------+
| 172.24.4.225 | None        | None     | public |
+--------------+-------------+----------+--------+

注意: 如果IP地址资源池不止有一个,您可以将资源池名称作为参数传递给该命令,来制定要使用哪一个资源池。比如,要从test池中抽取IP地址,请使用如下命令:

$ nova floating-ip-create test
  1. 列出该Project下所有可以关联浮动IP地址的实例:
$ nova list
+---------------------+------+---------+------------+-------------+------------------+
| ID                  | Name | Status  | Task State | Power State | Networks         |
+---------------------+------+---------+------------+-------------+------------------+
| d5c854f9-d3e5-4f... | VM1  | ACTIVE  | -          | Running     | private=10.0.0.3 |
| 42290b01-0968-43... | VM2  | SHUTOFF | -          | Shutdown    | private=10.0.0.4 |
+---------------------+------+---------+------------+-------------+------------------+
  1. 用如下命令,将IP地址和实例相关联:
$ nova floating-ip-associate INSTANCE_NAME_OR_ID FLOATING_IP_ADDRESS

比如像下面这样:

$ nova floating-ip-associate VM1 172.24.4.225

此时,该实例便已经和两个IP地址绑定了。

$ nova list
+------------------+------+--------+------------+-------------+-------------------------------+
| ID               | Name | Status | Task State | Power State | Networks                      |
+------------------+------+--------+------------+-------------+-------------------------------+
| d5c854f9-d3e5... | VM1  | ACTIVE | -          | Running     | private=10.0.0.3, 172.24.4.225|
| 42290b01-0968... | VM2  | SHUTOFF| -          | Shutdown    | private=10.0.0.4              |
+------------------+------+--------+------------+-------------+-------------------------------+

您在关联了该IP地址,且为实例配置了安全组规则之后,该实例便能通过浮动IP来访问了。

注意: 如果某个实例连接了多个网络,用--fixed-address即可将浮动IP和一个固定IP关联。

$ nova floating-ip-associate --fixed-address FIXED_IP_ADDRESS \
 INSTANCE_NAME_OR_ID FLOATING_IP_ADDRESS
回收浮动IP

若要解除浮动IP和实例的关联,请使用如下命令:

$ nova floating-ip-disassociate INSTANCE_NAME_OR_ID FLOATING_IP_ADDRESS

若要解除浮动IP和Project,请使用如下命令:

$ nova floating-ip-delete FLOATING_IP_ADDRESS

此时,该IP地址会回归地址资源池,可以被所有Project使用。如果您直接将某一个浮动IP和Project解除了关联,且正挂在某个运行的实例上时,该IP同样会被自动收回。

调整服务器大小

通过调整型号来调整服务器大小。

  1. 请首先查看服务器信息,包括服务器的型号大小,这里的型号大小是体现在flavor上的:
$ nova show myCirrosServer
+-------------------------------------+-------------------------------------+
| Property                            | Value                               |
+-------------------------------------+-------------------------------------+
| status                              | ACTIVE                              |
| updated                             | 2013-07-18T15:08:20Z                |
| OS-EXT-STS:task_state               | None                                |
| OS-EXT-SRV-ATTR:host                | devstack                            |
| key_name                            | None                                |
| image                               | cirros-0.3.2-x86_64-uec (397e71...  |
| private network                     | 10.0.0.3                            |
| hostId                              | 6e1e69b71ac9b1e6871f91e2dfc9a9b9... |
| OS-EXT-STS:vm_state                 | active                              |
| OS-EXT-SRV-ATTR:instance_name       | instance-00000005                   |
| OS-EXT-SRV-ATTR:hypervisor_hostname | devstack                            |
| flavor                              | m1.small (2)                        |
| id                                  | 84c6e57d-a6b1-44b6-81eb-fcb36afd31b5|
| security_groups                     | [{u'name': u'default'}]             |
| user_id                             | 376744b5910b4b4da7d8e6cb483b06a8    |
| name                                | myCirrosServer                      |
| created                             | 2013-07-18T15:07:59Z                |
| tenant_id                           | 66265572db174a7aa66eba661f58eb9e    |
| OS-DCF:diskConfig                   | MANUAL                              |
| metadata                            | {u'description': u'Small test ima...|
| accessIPv4                          |                                     |
| accessIPv6                          |                                     |
| progress                            | 0                                   |
| OS-EXT-STS:power_state              | 1                                   |
| OS-EXT-AZ:availability_zone         | nova                                |
| config_drive                        |                                     |
+-------------------------------------+-------------------------------------+

如上显示,该服务器的型号是m1.small(2)

  1. 用如下的方法列出可用的型号
$ nova flavor-list
+-----+-----------+-----------+------+-----------+------+-------+-------------+----------+
| ID  | Name      | Memory_MB | Disk | Ephemeral | Swap | VCPUs | RXTX_Factor | Is_Public|
+-----+-----------+-----------+------+-----------+------+-------+-------------+----------+
| 1   | m1.tiny   | 512       | 1    | 0         |      | 1     | 1.0         | True     |
| 2   | m1.small  | 2048      | 20   | 0         |      | 1     | 1.0         | True     |
| 3   | m1.medium | 4096      | 40   | 0         |      | 2     | 1.0         | True     |
| 4   | m1.large  | 8192      | 80   | 0         |      | 4     | 1.0         | True     |
| 5   | m1.xlarge | 16384     | 160  | 0         |      | 8     | 1.0         | True     |
+-----+-----------+-----------+------+-----------+------+-------+-------------+----------+
  1. 如果您希望重新调整服务器大小,请使用nova resize命令,后面加上服务器ID或者名称,以及新的型号。想要即时查看容量调整过程,请使用--poll参数。例如:
$ nova resize myCirrosServer 4 --poll

Instance resizing... 100% complete
Finished

注意: 默认情况下,nova resize这个命令会给服务器实例自主关机的时间,此后才会执行关闭电源和调整大小的动作。关机的行为是在nova.conf中的shutdown_timeout参数下配置的。这个值表示OpenStack预留给服务器实例执行关机操作的总时间,单位为秒。默认情况下这个时间是60秒。详情请参看Description of Compute configuration options。

  1. 查看服务器状态
$ nova list
+----------------------+----------------+--------+-----------------------------------------+
| ID                   | Name           | Status | Networks                                |
+----------------------+----------------+--------+-----------------------------------------+
| 84c6e57d-a6b1-44b... | myCirrosServer | RESIZE | private=172.16.101.6, public=10.4.113.6 |
+----------------------+----------------+--------+-----------------------------------------+

容量调整完成后,这里的状态将变为VERIFY_RESIZE

  1. 确认容量调整完成:
$ nova resize-confirm 84c6e57d-a6b1-44b6-81eb-fcb36afd31b5

此时服务器状态应为ACTIVE

  1. 如果容量调整未能按预期完成,您可以回滚调整操作:
$ nova resize-revert 84c6e57d-a6b1-44b6-81eb-fcb36afd31b5

此时服务器状态也应为ACTIVE

关闭和开启实例

您可以使用下面的几种方式来关闭和开启实例。

暂停和恢复实例

如果要暂停实例,请使用如下命令:

$ nova pause INSTANCE_NAME

该命令会把服务器实例的状态存储在内存中,暂停了的实力会依然运行,只是如同被封冻一样,不会有任何动作。想要恢复实例,请使用如下命令:

$ nova unpause INSTANCE_NAME
停用和恢复实例

如果要在虚拟化软件层面上将某个实例停用,请使用如下命令:

$nova suspend INSTANCE_NAME

如果要恢复一个被停用的实例,请使用如下命令:

$nova resume INSTANCE_NAME
雪藏和恢复实例

如果您有一个暂时不用的实例,但还想让它留在您的服务器列表上,您便可能需要雪藏的功能了。例如,您可以在一周结束时雪藏一个实例,然后在下周一重新打开这个实力。所有相关的数据和资源会被保留,但雪藏时内存的东西是不会保存的。如果一个被雪藏的实例再也没用了,也可以被彻底删除。

您可以执行如下几种有关雪藏的任务:

  • 雪藏实例:关闭服务器实例,将关联数据和资源保存(如果没有volume backed,将会创建一个快照)。内存中的信息将会丢失。
$ nova shelve SERVERNAME

注意: 默认情况下,nova shelve这个命令会给服务器实例自主关机的时间,此后才会执行关闭电源和调整大小的动作。关机的行为是在nova.conf中的shutdown_timeout参数下配置的。这个值表示OpenStack预留给服务器实例执行关机操作的总时间,单位为秒。默认情况下这个时间是60秒。详情请参看Description of Compute configuration options。 关机时间也可以被镜像中的元数据配置覆盖掉。镜像元数据中的os_shutdown_timeout参数表示该系统需要多长时间才能完成一次关机操作,该参数的优先级要高于nova.conf中的配置。

  • 恢复被雪藏的实例:
$ nova unshelve SERVERNAME
  • 删除被雪藏的实例:将该实例删除,删掉所有的数据,回收资源。如果您不再需要某个实例,您可以将该实例从云中抹除,以节省空间。
$ nova shelve-offload SERVERNAME

通过IP地址查找实例

在使用nova list时,您可以用IP地址来查找实例,只需添加--ip即可。

$ nova list --ip IP_ADDRESS

如下示例展示了如何查询IP为10.0.0.4的实例:

$ nova list --ip 10.0.0.4
+------------------+----------------------+--------+------------+-------------+------------------+
| ID               | Name                 | Status | Task State | Power State | Networks         |
+------------------+----------------------+--------+------------+-------------+------------------+
| 8a99547e-7385... | myInstanceFromVolume | ACTIVE | None       | Running     | private=10.0.0.4 |
+------------------+----------------------+--------+------------+-------------+------------------+

重启实例

重启实例有两种,分别被称为“软重启”和“硬重启”。软重启会尝试正常关机并重启实例,硬重启会直接将实例“断电”并重启。

默认情况下,如果您通过nova重启,执行的是软重启。

$ nova reboot SERVER

如果您需要执行硬重启,添加--hard参数即可:

$ nova reboot --hard SERVER

您在重启时还可以进入恢复模式。例如,在您的实例使用时间过长之后,文件系统有损坏时,您可能就需要进入恢复模式了。

注意: 实例运行在“恢复模式”下时,暂停、停用和关闭操作是不可用的。因为这些操作会使实例的原始状态丢失,并且无法退出“恢复模式”。

“恢复模式”提供了一种访问实例的机制,这种机制在实例不可访问时依然有效。默认情况下,“恢复模式”会使用初始的景象启动一个实例,然后将当前的启动盘作为第二启动盘挂载到这个实例上。

如果要在“恢复模式”下启动某个实例,请使用如下命令:

$ nova rescue SERVER

注意: 默认情况下,nova rescue这个命令会给服务器实例自主关机的时间,此后才会执行关闭电源和调整大小的动作。关机的行为是在nova.conf中的shutdown_timeout参数下配置的。这个值表示OpenStack预留给服务器实例执行关机操作的总时间,单位为秒。默认情况下这个时间是60秒。详情请参看Description of Compute configuration options。 关机时间也可以被镜像中的元数据配置覆盖掉。镜像元数据中的os_shutdown_timeout参数表示该系统需要多长时间才能完成一次关机操作,该参数的优先级要高于nova.conf中的配置。

如果要在正常模式下重启这个实例,请执行如下命令:

$ nova unrescue SERVER

如果您在“恢复模式”下启动实例时希望指定一个镜像,而不是用默认的那个镜像,请使用--rescue_image_ref参数:

$ nova rescue --rescue_image_ref IMAGE_ID SERVER

删除实例

如果您不再需要某个实例,您可以删了它。

  1. 列出所有实例:
$ nova list
+-------------+----------------------+--------+------------+-------------+------------------+
| ID          | Name                 | Status | Task State | Power State | Networks         |
+-------------+----------------------+--------+------------+-------------+------------------+
| 84c6e57d... | myCirrosServer       | ACTIVE | None       | Running     | private=10.0.0.3 |
| 8a99547e... | myInstanceFromVolume | ACTIVE | None       | Running     | private=10.0.0.4 |
| d7efd3e4... | newServer            | ERROR  | None       | NOSTATE     |                  |
+-------------+----------------------+--------+------------+-------------+------------------+
  1. 运行nova delete命令来删除实例。下面的例子便是删除一个实例的做法,其中newServer实例的状态是ERROR
$ nova delete newServer

如果您删除实例成功,是不会有提示的。

  1. 如果您想确认服务器的确被删掉了,再执行一次nova list即可。
$ nova list
+-------------+----------------------+--------+------------+-------------+------------------+
| ID          | Name                 | Status | Task State | Power State | Networks         |
+-------------+----------------------+--------+------------+-------------+------------------+
| 84c6e57d... | myCirrosServer       | ACTIVE | None       | Running     | private=10.0.0.3 |
| 8a99547e... | myInstanceFromVolume | ACTIVE | None       | Running     | private=10.0.0.4 |
+-------------+----------------------+--------+------------+-------------+------------------+

被删除的实例已经不会显示在列表中了。

通过控制台连接实例

如果要使用控制台连接实例,我们需要用到VNC或者SPICE。这两种都不在乎控制台日志是否有输出。控制台的方式可以将鼠标和键盘的信号通过中继发送到实例上。

OpenStack中,目前支持了三种远程连接控制台的方式:

novnc:一个通过HTML 5 Canvas和WebSockets实现的浏览器上的VNC客户端。 spice:一个运行在浏览器上的连接虚拟化实例的客户端。 xvpvnc:Java写成的连接服务器实例的控制端。

例如:

如果需要通过控制台访问实例,请执行如下命令:

$ nova get-vnc-console INSTANCE_NAME VNC_TYPE

该命令会返回一个URL,通过这个URL,您便可以访问控制台了。

+--------+------------------------------------------------------------------------------+
| Type   | Url                                                                          |
+--------+------------------------------------------------------------------------------+
| xvpvnc | http://192.168.5.96:6081/console?token=c83ae3a3-15c4-4890-8d45-aefb494a8d6c  |
+--------+------------------------------------------------------------------------------+

上面的指令中,VNC_TYPE可以是前述三种连接方式的任意一种。

在使用SPICE方式时,您可以直接在实例的页面使用浏览器插件来使用,也可以用get-vnc-console命令,获取到一个带认证信息的URL来访问使用。上面的例子便是后一种。

欲了解更多信息,或者这三者的对比(包括安全性考虑),请参看Security Guide。

管理裸机(bare-metal)节点

OpenStack Compute的裸机驱动,能通过一些公用的云API,或Orchestration(Heat)来管理硬件主机设备。这个驱动的用例主要是一些单租户的云平台,例如高性能计算平台,或是部署OpenStack本身的时候。

如果您使用裸机驱动,您必须创建一个网络接口,并且将其加在裸机节点上。然后您便可以通过裸机镜像来启动实例了。

您可以列出和删除裸机节点。当您删除一个节点时,与之关联的网络接口都将会被删除。您也可以列出或移除和某个裸机节点相关联的网络接口。

常用指令

管理裸机节点时,我们一般使用如下命令:

baremetal-interface-add 将某个网络接口添加在裸机节点上。

baremetal-interface-list 列出和某个裸机节点关联的网络接口。

baremetal-node-create 创建一个裸机节点。

baremetal-node-delete 删除一个裸机节点,同时删除和它关联的所有接口。

baremetal-node-list 列出所有可用的裸机节点。

baremetal-node-show 列出某一裸机节点的信息。

创建一个bare-metal节点

在您创建裸机节点时,您提供的PM地址,用户名和密码应该匹配您硬件设备中BIOS或IPMI上的配置。

$ nova baremetal-node-create --pm_address PM_ADDRESS --pm_user PM_USERNAME \
  --pm_password PM_PASSWORD $(hostname -f) 1 512 10 aa:bb:cc:dd:ee:ff

如下示例展示了创建节点的命令,其中PM地址是1.2.3.4,PM用户名是ipmi,密码是ipmi

$ nova baremetal-node-create --pm_address 1.2.3.4 --pm_user ipmi \
  --pm_password ipmi $(hostname -f) 1 512 10 aa:bb:cc:dd:ee:ff
+------------------+-------------------+
| Property         | Value             |
+------------------+-------------------+
| instance_uuid    | None              |
| pm_address       | 1.2.3.4           |
| interfaces       | []                |
| prov_vlan_id     | None              |
| cpus             | 1                 |
| memory_mb        | 512               |
| prov_mac_address | aa:bb:cc:dd:ee:ff |
| service_host     | ubuntu            |
| local_gb         | 10                |
| id               | 1                 |
| pm_user          | ipmi              |
| terminal_port    | None              |
+------------------+-------------------+
在该节点上添加网卡口

对于该节点上的每一个网卡,您都必须创建一个接口,并且指定该接口的MAC地址。

$ nova baremetal-interface-add 1 aa:bb:cc:dd:ee:ff
+-------------+-------------------+
| Property    | Value             |
+-------------+-------------------+
| datapath_id | 0                 |
| id          | 1                 |
| port_no     | 0                 |
| address     | aa:bb:cc:dd:ee:ff |
+-------------+-------------------+
从一份bare-metal镜像创建实例

“裸机实例”是直接创建在物理机上的虚拟机实例,其下没有任何虚拟层。Nova通过IPMI来管理其电源。有些时候,Nova会通过Neutron和OpenFlow来管理网络。

 $ nova boot --image my-baremetal-image --flavor my-baremetal-flavor test
 +-----------------------------+--------------------------------------+
 | Property                    | Value                                |
 +-----------------------------+--------------------------------------+
 | status                      | BUILD                                |
 | id                          | cc302a8f-cd81-484b-89a8-b75eb3911b1b |
 +-----------------------------+--------------------------------------+

... wait for instance to become active ...

注意: 通过--availability_zone来指定在那个区,或哪个节点上启动服务器。并用逗号将区和主机名分开。

$ nova boot --availability_zone zone:HOST,NODE

host(主机名)是可选的。您可以只写zone:,node,但记得要加逗号。

列出bare-metal节点和接口

nova baremetal-node-list来查看所有的裸机设备和接口。如果节点正在使用中,这个信息表中会同时显示实例的UUID。

查看bare-metal节点的详细信息

nova baremetal-node-show命令来查看某个裸机设备的详情:

$ nova baremetal-node-show 1
+------------------+--------------------------------------+
| Property         | Value                                |
+------------------+--------------------------------------+
| instance_uuid    | cc302a8f-cd81-484b-89a8-b75eb3911b1b |
| pm_address       | 1.2.3.4                              |
| interfaces       | [{u'datapath_id': u'0', u'id': 1,    |
|                  | u'port_no': 0,                       |
|                  | u'address': u'aa:bb:cc:dd:ee:ff'}]   |
| prov_vlan_id     | None                                 |
| cpus             | 1                                    |
| memory_mb        | 512                                  |
| prov_mac_address | aa:bb:cc:dd:ee:ff                    |
| service_host     | ubuntu                               |
| local_gb         | 10                                   |
| id               | 1                                    |
| pm_user          | ipmi                                 |
| terminal_port    | None                                 |
+------------------+--------------------------------------+

书籍推荐