暂停和恢复实例

本文档介绍如何暂停和恢复虚拟机实例。如需了解如何停止和启动实例,请参阅停止和启动实例。如需了解实例生命周期,请参阅实例生命周期文档。

如果暂停实例,则系统会向实例的操作系统发送 ACPI S3 暂停信号。暂停实例类似于关闭笔记本电脑的盖子,让实例处于 SUSPENDED 状态。暂停实例适用于:

  • 在关停期间(例如晚上或周末)未充分利用的开发和测试环境,可节省费用或者实现比创建新虚拟机实例更快的初始化速度。
  • 在实例启动完成后、准备处理第一个请求之前需要进行长时间初始化的应用,例如虚拟开发者工作站或复杂的 Java 应用。

暂停实例在以下方面与停止实例不同:

暂停实例时,其内存将移至存储空间,并且保留实例。当实例保持暂停状态时,您只需为使用的存储空间付费。静态 IP 地址将保留,这样实例重启后,网络功能就会按预期恢复。启动该实例后,该实例的内存将从存储回实例移至实例内存,并且您的实例将恢复运行。

除本地 SSD 数据外,挂接到实例的所有资源仍继续挂接到该实例,并且会产生费用,包括永久性磁盘和静态或保留的外部 IP 地址。即使已暂停实例,我们也会根据价格表对所有这些资源收费。

您无法使用客机环境中内置的标准过程暂停实例。也无法使用命令(例如 Ubuntu 16.04 及更高版本中的 systemctl suspend 命令)。只能使用 gcloud 命令行工具或 Compute Engine API 暂停实例。

如果您在以后恢复实例时并不在意恢复实例的内存和设备状态,则可以改为停止实例,这样不会产生额外的存储费用。

准备工作

Beta 版限制

在 Beta 版中,此功能存在以下限制:

  • 您无法暂停使用 GPU 的实例。
  • 您可以暂停已挂接本地 SSD 的实例,但必须使用表示舍弃本地 SSD 数据的特殊标志来舍弃本地 SSD 内容。如需了解详情,请参阅暂停虚拟机实例
  • 您无法使用客机环境中内置的标准过程暂停实例,也无法使用命令(例如 Ubuntu 16.04 及更高版本中的 systemctl suspend 命令)。客机内信号会被忽略。
  • 在虚拟机自动停止之前,您最多只能将实例暂停 60 天。
  • 您无法暂停内存超过 120 GB 的实例。
  • 您可以暂停抢占式实例,但抢占式实例可能会在其成功暂停之前终止。
  • 在 Beta 版中,Compute Engine 可能会舍弃已暂停实例的保留内存状态。如果 Compute Engine 不得不舍弃保留的内存状态,它会将实例更改为 TERMINATED 状态,您可以使用 instances.start 方法正常地重新启动该实例。
  • 您无法暂停 E2 实例。

操作系统兼容性

Compute Engine 上提供的大多数操作系统都支持暂停和恢复功能,但也有少数操作系统不支持。请使用下表确定操作系统是否支持暂停和恢复功能。

映像系列 版本 状态 备注
支持的操作系统
Ubuntu 16、18、19 或更高版本 支持
Container-Optimized OS 69、73、77、81 或更高版本 支持
RHEL 7 支持
CentOS 7 支持
Windows 2012、2016、2019 或更高版本 支持
SUSE (SLES) 12、15 或更高版本 支持
Debian 8、9 支持,但需要进行一些配置 配置 Debian 8、9 的说明
不支持的操作系统
CentOS 6、8 不支持
RHEL 6、8 不支持
Windows Server 上的 SQL Server 全部 不支持
RHEL for SAP 全部 不支持
Debian 10 不支持
CoreOS 全部 不支持

价格

暂停实例时,您需要为以下各项支付费用:

暂停实例

如需暂停实例,请使用 Cloud Consolegcloud 工具Beta 版 API

您无法使用客机环境中内置的标准过程暂停实例。您可以使用 Cloud Consolegcloud 命令行工具或 API 暂停实例。

控制台

  1. 在 Cloud Console 中,转到虚拟机实例页面。

    转到“虚拟机实例”页面

  2. 选择一个或多个要暂停的实例。

  3. 点击暂停

  4. 出现提示时,如果您要舍弃本地 SSD 数据,请选择舍弃 SSD 内容。实例恢复后,该实例上的任何本地 SSD 数据都将已舍弃。

gcloud

要通过 gcloud 命令行工具暂停实例,请使用以下命令:

 gcloud beta compute instances suspend INSTANCE_NAME

在发出暂停实例的请求后,Compute Engine 可能需要一些时间来保留实例所需的所有数据。在此期间,只要实例仍在运行,您都将继续为其付费。

已暂停的实例标记为 SUSPENDED 状态。请通过发出 describe 请求来检查实例的状态:

gcloud compute instances describe INSTANCE_NAME

要暂停具有本地 SSD 数据的实例,必须通过提供 --discard-local-ssd 标志来舍弃本地 SSD 数据:

gcloud beta compute instances suspend INSTANCE_NAME --discard-local-ssd

API

在 API 中,使用 instances.suspend 方法发出请求:

https://www.googleapis.com/compute/beta/projects/PROJECT_ID/zones/ZONE/instances/INSTANCE_NAME/suspend

替换以下内容:

  • PROJECT_ID:项目 ID
  • ZONE:虚拟机所在的区域
  • INSTANCE_NAME:您要暂停的实例

在发出暂停实例的请求后,Compute Engine 可能需要一些时间来保留实例所需的所有数据。在此期间,只要实例仍在运行,您都将为其付费。

Compute Engine 将已暂停的实例标记为 SUSPENDED 状态。请通过发出 GET 请求来检查实例的状态:

GET https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/INSTANCE_NAME

在状态字段中可以看到实例的状态。例如:

...
"zone": "https://content.googleapis.com/compute/v1/projects/example-project/zones/us-central1-a",
"status": "SUSPENDED",
"name": "example-vm",
...

要暂停具有本地 SSD 数据的实例,必须通过提供可选的 discardLocalSsd 查询参数来舍弃本地 SSD 数据:

https://www.googleapis.com/compute/beta/projects/PROJECT_ID/zones/ZONE/instances/INSTANCE_NAME/suspend?discardLocalSsd=true

恢复已暂停的实例

如需恢复已暂停的实例,请使用 Cloud Consolegcloud 工具Beta 版 API

控制台

  1. 在 Google Cloud Console 中,转到虚拟机实例页面。

    转到“虚拟机实例”页面

  2. 选择一个或多个要恢复的实例。

  3. 点击启动/恢复

gcloud

要通过 gcloud 命令行工具恢复实例,请使用以下命令:

 gcloud beta compute instances resume INSTANCE_NAME

在发出恢复实例的请求之后,Compute Engine 可能需要一些时间来恢复实例所需的所有数据。 在此期间,只要实例正在恢复,您都将为其付费。

当实例标记为 RUNNING 时,则该实例已恢复。请通过发出描述请求来检查实例的状态:

gcloud compute instances describe INSTANCE_NAME

API

instances.resume 方法发出请求:

https://www.googleapis.com/compute/beta/projects/PROJECT_ID/zones/ZONE/instances/INSTANCE_NAME/resume

替换以下内容:

  • PROJECT_ID:此请求的项目 ID
  • ZONE:虚拟机所在的区域
  • INSTANCE_NAME:要恢复的实例

在发出恢复实例的请求之后,Compute Engine 可能需要一些时间来恢复实例所需的所有数据。在此期间,只要实例正在恢复,您都将为其付费。

恢复完成后,Compute Engine 会将实例标记为 RUNNING 状态。请通过发出 GET 请求来检查实例的状态:

GET https://compute.googleapis.com/compute/v1/projects/example-project/zones/us-central1-a/instances/example-instance

在状态字段中可以看到实例的状态。例如:

...
"zone": "https://content.googleapis.com/compute/v1/projects/example-project/zones/us-central1-a",
"status": "RUNNING",
"name": "example-instance",
...

恢复具有加密磁盘的实例

如果要恢复的实例使用 CSEK(客户提供的加密密钥),则您必须在尝试恢复实例时提供这些密钥。

您可以使用 gcloud 工具API 恢复实例。

gcloud

您可以使用 --csek-key-file 标志以及要启动的实例的名称来提供密钥。如果您使用的是 RSA 封装密钥,请使用 gcloud beta 组件:

gcloud beta compute instances resume INSTANCE_NAME \
  --csek-key-file ENCRYPTION_KEY_FILE

替换以下内容:

  • INSTANCE_NAME:实例的名称
  • ENCRYPTION_KEY:包含加密密钥(用于对挂接到实例的永久性磁盘进行加密的加密密钥)的文件的相对路径

API

您可以使用加密密钥构建对 instances.resume 方法的 POST 请求,以恢复实例。

POST https://compute.googleapis.com/compute/beta/projects/PROJECT_ID/zones/ZONE/instances/INSTANCE_NAME/resume
{
  "disk": [
    {
       "source": "DISK_NAME",
       "diskEncryptionKey": {
         "rsaEncryptedKey": "ENCRYPTION_KEY"
       }
    }
  ]
}

替换以下内容:

  • INSTANCE_NAME:实例的名称
  • PROJECT_ID:此请求的项目 ID
  • ZONE:此实例的区域
  • DISK_NAME:使用 CSEK 加密的挂接磁盘
  • ENCRYPTION_KEY:用于加密挂接到实例的永久性磁盘的加密密钥

每个加密磁盘都必须与匹配的 diskEncryptionKey 一起列出,因为当实例处于 SUSPENDED 状态时,Compute Engine 不会在其服务器上存储这些密钥。

暂停过程

发出暂停请求时,您可以向虚拟机实例发送 ACPI 暂停信号。如果虚拟机在几分钟内未响应 ACPI S3 暂停信号,则 Compute Engine 将取消暂停尝试并将虚拟机恢复到 RUNNING 状态。

下表描述了暂停虚拟机实例对其关联资源的影响:

资源 支持
内存 您只能暂停内存小于或等于 120 GB 的虚拟机
本地 SSD 本地 SSD 数据会被舍弃
永久性磁盘 永久性 HDD 和 SSD 磁盘会保留
IP 地址 在暂停期间,临时 IP 地址会被释放,但静态 IP 地址仍然会挂接到虚拟机实例。如果您想保留临时 ID,请提升它。
虚拟机配置(例如机器类型、元数据、标签等等) 除了临时 IP 地址外,所有虚拟机配置都会保留并在实例恢复时恢复。

本地 SSD 和抢占式虚拟机

实例暂停后,系统不会保留本地 SSD 内容。默认情况下,如果暂停具有本地 SSD 的实例,则系统会返回错误。您可以通过指定舍弃本地 SSD 数据的标志来替换此默认行为,虽然这样可以暂停和恢复实例,但也会舍弃进程中本地 SSD 的内容。在这种情况下,Compute Engine 会恢复挂接了相同数量的本地 SSD 卷的实例,但这些卷将为空且未初始化。

您可以暂停抢占式虚拟机,但如果抢占操作(不是抢占操作之前的预先警告)在暂停操作完成之前执行,则暂停操作会退出并且实例会被抢占。

配置 Debian 虚拟机以支持暂停和恢复

运行 Debian 8 和 9 的虚拟机可以暂停和恢复,但必须事先配置。如需配置您的 Debian 实例,请按照以下一组说明(方案 A 或方案 B)操作。如果可以的话,我们建议您配置 ACPID(方案 A)。

方案 A

此方案会将 ACPID 配置为处理休眠按钮事件,并添加用于处理休眠事件的 Shell 脚本。

  1. 使用 ssh 连接到您的虚拟机实例:

    gcloud compute instances ssh INSTANCE_NAME
    
  2. 在虚拟机实例的 acpi 文件夹下,创建一个目录:

    sudo mkdir -p /etc/acpi/events/
    
  3. 将 ACPID 配置为处理休眠按钮事件:

    cat <<EOF | sudo tee /etc/acpi/events/sleepbtn-acpi-support
    event=button[ /]sleep
    action=/etc/acpi/sleepbtn-acpi-support.sh
    EOF
    
  4. 创建休眠事件处理脚本:

    cat <<EOF | sudo tee /etc/acpi/sleepbtn-acpi-support.sh
    #!/bin/sh
    echo mem > /sys/power/state
    EOF
    
  5. 设置脚本的权限:

    sudo chmod 755 /etc/acpi/sleepbtn-acpi-support.sh
    
  6. 重启 ACPID:

    sudo systemctl restart acpid.service
    

方案 B

  1. 使用 ssh 连接到您的虚拟机实例:

    gcloud compute instances ssh INSTANCE_NAME
    
  2. 在虚拟机实例上,安装 dbus

    sudo apt-get install dbus
    
  3. 重启 logind

    sudo systemctl restart systemd-logind.service
    

后续步骤