在 Compute Engine 实例中启用正常关停


本文档介绍了如何在新建或现有 Compute Engine 实例中启用正常关闭功能。如需详细了解正常关停,请参阅正常关停概览

在实例中启用正常关闭功能后,当您停止或删除实例时,可以为其客机操作系统最多留出 1 小时的时间来彻底关闭。这有助于防止可能的数据丢失或文件系统损坏。

准备工作

  • 如果您尚未设置身份验证,请进行设置。身份验证是通过其进行身份验证以访问 Google Cloud 服务和 API 的过程。如需从本地开发环境运行代码或示例,您可以通过选择以下选项之一向 Compute Engine 进行身份验证:

    Select the tab for how you plan to use the samples on this page:

    Console

    When you use the Google Cloud console to access Google Cloud services and APIs, you don't need to set up authentication.

    gcloud

    1. Install the Google Cloud CLI, then initialize it by running the following command:

      gcloud init
    2. Set a default region and zone.
    3. REST

      如需在本地开发环境中使用本页面上的 REST API 示例,请使用您提供给 gcloud CLI 的凭据。

        Install the Google Cloud CLI, then initialize it by running the following command:

        gcloud init

      如需了解详情,请参阅 Google Cloud 身份验证文档中的使用 REST 时进行身份验证

所需的角色

如需获得在计算实例中启用正常关闭功能所需的权限,请让管理员向您授予项目的 Compute Instance Admin (v1) (roles/compute.instanceAdmin.v1) IAM 角色。 如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限

此预定义角色包含在计算实例中启用正常关闭所需的权限。如需查看所需的确切权限,请展开所需权限部分:

所需权限

如需在计算实例中启用正常关闭功能,您需要具备以下权限:

  • 如需创建实例,请执行以下操作:
    • 针对项目的 compute.instances.create 权限
    • 使用自定义映像创建虚拟机:针对映像的 compute.images.useReadOnly 权限
    • 使用快照创建虚拟机:针对快照的 compute.snapshots.useReadOnly 权限
    • 使用实例模板创建虚拟机:针对实例模板的 compute.instanceTemplates.useReadOnly 权限
    • 为虚拟机分配旧版网络:针对项目的 compute.networks.use 权限
    • 为虚拟机指定静态 IP 地址:针对项目的 compute.addresses.use 权限
    • 使用旧版网络时为虚拟机分配外部 IP 地址:针对项目的 compute.networks.useExternalIp 权限
    • 为虚拟机指定子网:针对项目或所选子网的 compute.subnetworks.use 权限
    • 在使用 VPC 网络时为虚拟机分配外部 IP 地址:针对项目或所选子网的 compute.subnetworks.useExternalIp 权限
    • 为虚拟机设置虚拟机实例元数据:针对项目的 compute.instances.setMetadata 权限
    • 为虚拟机设置标记:针对虚拟机的 compute.instances.setTags 权限
    • 为虚拟机设置标签:针对虚拟机的 compute.instances.setLabels 权限
    • 为虚拟机设置要使用的服务账号:针对虚拟机的 compute.instances.setServiceAccount 权限
    • 为虚拟机创建新磁盘:针对项目的 compute.disks.create 权限
    • 以只读或读写模式挂接现有磁盘:针对磁盘的 compute.disks.use 权限
    • 以只读模式挂接现有磁盘:针对磁盘的 compute.disks.useReadOnly 权限
  • 如需创建实例模板:针对项目的 compute.instanceTemplates.create 权限
  • 如需在现有实例中启用正常关闭功能,请执行以下操作: 在实例上执行 compute.instances.update

您也可以使用自定义角色或其他预定义角色来获取这些权限。

启用安全关停

如需在计算实例中启用正常关闭功能,请使用以下方法之一:

在现有实例中启用正常关闭

您可以在现有计算实例中启用正常关闭,而无需停止或重启该实例。默认的正常关闭时长为 10 分钟,但您可以指定 1 秒到 1 小时之间的自定义关闭时长。

如需在现有实例中启用正常关闭功能,请选择以下选项之一:

控制台

  1. 在 Google Cloud 控制台中,前往虚拟机实例页面。

    进入“虚拟机实例”

  2. 名称列中,点击要为其启用正常关闭的实例的名称。

    实例的详情页面随即打开。

  3. 点击 修改

  4. 管理部分中,执行以下操作:

    1. 选中正常关停虚拟机复选框。

    2. 可选:如需指定自定义正常关闭期限,请在时长上限字段中指定时长。

  5. 点击保存

gcloud

如需在现有实例中启用正常关闭功能,请使用带有 --graceful-shutdown 标志的 gcloud beta compute instances update 命令

gcloud beta compute instances update INSTANCE_NAME \
    --graceful-shutdown \
    --zone=ZONE

替换以下内容:

  • INSTANCE_NAME:实例的名称。

  • ZONE:实例所在的区域。

(可选)如需指定自定义正常关闭期限,请添加 --graceful-shutdown-max-duration 标志:

gcloud beta compute instances update INSTANCE_NAME \
    --graceful-shutdown \
    --graceful-shutdown-max-duration=MAX_DURATION \
    --zone=ZONE

MAX_DURATION 替换为关闭时段的持续时间。该值的格式必须为小时数、分钟数或秒数,后面分别跟 hms。例如,指定 1h 表示 1 小时,或指定 20m10s 表示 20 分钟 10 秒。

REST

  1. 创建一个空的 JSON 文件。

  2. 如需查看现有实例的属性,请向 Beta 版 instances.get 方法发出 GET 请求:

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

    替换以下内容:

    • PROJECT_ID:实例所在项目的 ID。

    • ZONE:实例所在的区域。

    • INSTANCE_NAME:现有实例的名称。

  3. 在您在上一步中创建的空 JSON 文件中,执行以下操作:

    1. 输入 GET 请求输出中的实例配置详细信息。

    2. scheduling 字段中,添加 gracefulShutdown 字段,如下所示:

      {
        ...
        "scheduling": {
          ...
          "gracefulShutdown": {
            "enabled": true
          }
        },
        ...
      }
      

      (可选)如需指定自定义正常关闭期限,请添加 maxDuration 字段:

      {
        ...
        "scheduling": {
          ...
          "gracefulShutdown": {
            ...
            "enabled": true,
            "maxDuration": {
              "seconds": "MAX_DURATION"
            }
          }
        },
        ...
      }
      

      MAX_DURATION 替换为正常关闭期的时长(以秒为单位)。该值必须介于 13600(3,600 秒,即 1 小时)之间。

  4. 如需更新实例并重启它,请向 Beta 版 instances.update 方法发出 PUT 请求。在请求中,执行以下操作:

    • 在请求网址中添加 mostDisruptiveAllowedAction 查询参数并设置为 RESTART

    • 在请求正文中,添加您在上一步中创建和更新的 JSON 文件中的实例属性。

    用于更新实例的 PUT 请求类似于以下内容:

    PUT https://compute.googleapis.com/compute/beta/projects/PROJECT_ID/zones/ZONE/instances/INSTANCE_NAME?mostDisruptiveAllowedAction=RESTART
    
    {
      ...
      "scheduling": {
        ...
        "gracefulShutdown": {
          "enabled": true
        }
      },
      ...
    }
    

如需详细了解如何更新实例的属性,请参阅更新实例属性

在创建实例时启用安全关闭

创建启用了正常关停功能的计算实例时,默认关停时段为 10 分钟。您还可以选择指定 1 秒到 1 小时之间的自定义关机时长。

如需创建已启用正常关闭的实例,请选择以下选项之一:

控制台

  1. 在 Google Cloud 控制台中,前往虚拟机实例页面。

    进入“虚拟机实例”

  2. 点击创建实例

    创建实例页面即会打开。

  3. 为该实例指定名称

  4. 指定要在其中创建实例的区域可用区

  5. 为实例指定机器类型。

  6. 在导航菜单中,点击高级

  7. 展开 虚拟机预配模型高级设置部分,然后执行以下操作:

    1. 选中正常关停虚拟机复选框。

    2. 可选:如需指定自定义正常关闭期限,请在时长上限字段中指定时长。

  8. 点击创建

gcloud

如需创建启用了正常关闭的实例,请使用带有 --graceful-shutdown 标志的 gcloud beta compute instances create 命令

gcloud beta compute instances create INSTANCE_NAME \
    --graceful-shutdown \
    --machine-type=MACHINE_TYPE \
    --zone=ZONE

替换以下内容:

  • INSTANCE_NAME:实例的名称。

  • MACHINE_TYPE:要用于实例的机器类型。

  • ZONE:要在其中创建实例的区域。

(可选)如需指定自定义正常关闭期限,请添加 --graceful-shutdown-max-duration 标志:

gcloud beta compute instances create INSTANCE_NAME \
    --graceful-shutdown \
    --graceful-shutdown-max-duration=MAX_DURATION \
    --machine-type=MACHINE_TYPE \
    --zone=ZONE

MAX_DURATION 替换为正常关闭期的时长。该值的格式必须为小时数、分钟数或秒数,后面分别跟 hms。例如,指定 1h 表示 1 小时,或指定 20m10s 表示 20 分钟 10 秒。

REST

如需创建已启用正常关闭的实例,请向 beta.instances.insert 方法发出 POST 请求。在请求正文中,添加 gracefulShutdown 字段:

POST https://compute.googleapis.com/compute/beta/projects/PROJECT_ID/zones/ZONE/instances

{
  "name": "INSTANCE_NAME",
  "machineType": "zones/ZONE/machineTypes/MACHINE_TYPE",
  "disks": [
    {
      "boot": true,
      "initializeParams": {
        "sourceImage": "projects/IMAGE_PROJECT/global/images/IMAGE"
      }
    }
  ],
  "networkInterfaces": [
    {
      "network": "global/networks/default"
    }
  ],
  "scheduling": {
    "gracefulShutdown": {
      "enabled": true
    }
  }
}

替换以下内容:

  • PROJECT_ID:要在其中创建实例的项目的 ID。

  • ZONE:要在其中创建实例的区域。

  • INSTANCE_NAME:实例的名称。

  • MACHINE_TYPE:实例的机器类型。

  • IMAGE_PROJECT:映像所属的映像项目;例如 debian-cloud。如需详细了解支持的映像项目,请参阅公共映像

  • IMAGE:指定以下其中一项:

    • 操作系统映像的特定版本,例如 debian-12-bookworm-v20240617

    • 映像系列,其格式必须为 family/IMAGE_FAMILY。此格式指定最新的未弃用操作系统映像。例如,如果您指定 family/debian-12,则系统会使用 Debian 12 映像系列中的最新版本。如需详细了解如何使用映像系列,请参阅映像系列最佳实践

(可选)如需指定自定义正常关闭期限,请在请求正文中添加 maxDuration 字段:

POST https://compute.googleapis.com/compute/beta/projects/PROJECT_ID/zones/ZONE/instances

{
  "name": "INSTANCE_NAME",
  "machineType": "zones/ZONE/machineTypes/MACHINE_TYPE",
  "disks": [
    {
      "boot": true,
      "initializeParams": {
        "sourceImage": "projects/IMAGE_PROJECT/global/images/IMAGE"
      }
    }
  ],
  "networkInterfaces": [
    {
      "network": "global/networks/default"
    }
  ],
  "scheduling": {
    "gracefulShutdown": {
      "enabled": true,
      "maxDuration": {
        "seconds": "MAX_DURATION"
      }
    }
  }
}

MAX_DURATION 替换为正常关闭期的时长(以秒为单位)。该值必须介于 13600(3,600 秒,即 1 小时)之间。

如需了解创建实例时的更多配置选项,请参阅创建和启动 Compute Engine 实例

在批量创建实例时启用安全关闭

当您批量创建启用了正常关停功能的计算实例时,默认关闭时段为 10 分钟。您还可以选择指定 1 秒到 1 小时之间的自定义关机时长。

如需批量创建已启用正常关闭的实例,请选择以下选项之一:

gcloud

如需批量创建启用了正常关闭功能的实例,请将 gcloud beta compute instances bulk create 命令--graceful-shutdown 标志结合使用。

例如,如需在单个可用区中批量创建实例并为实例指定名称模式,请运行以下命令:

gcloud beta compute instances bulk create \
    --count=COUNT \
    --graceful-shutdown \
    --machine-type=MACHINE_TYPE \
    --name-pattern="NAME_PATTERN" \
    --zone=ZONE

替换以下内容:

  • COUNT:要创建的实例数量。

  • MACHINE_TYPE:实例的机器类型。

  • NAME_PATTERN:实例的名称模式。如需替换实例名称中的数字序列,请使用哈希值 (#) 字符序列。例如,使用 instance-# 作为名称模式将生成名称以 instance-1instance-2 开头的实例,一直到由 COUNT 指定的实例数量。

  • ZONE:要用于批量创建实例的可用区。

(可选)如需指定自定义正常关闭期限,请添加 --graceful-shutdown-max-duration 标志:

gcloud beta compute instances bulk create \
    --count=COUNT \
    --graceful-shutdown \
    --graceful-shutdown-max-duration=MAX_DURATION \
    --machine-type=MACHINE_TYPE \
    --name-pattern="NAME_PATTERN" \
    --zone=ZONE

MAX_DURATION 替换为正常关闭期的时长。该值的格式必须为小时数、分钟数或秒数,后面分别跟 hms。例如,指定 1h 表示 1 小时,或指定 20m10s 表示 20 分钟 10 秒。

REST

如需批量创建启用了正常关停的实例,请向 Beta 版 instances.bulkInsert 方法发出 POST 请求。在请求正文中,包含 gracefulShutdown 字段。

例如,如需在单个可用区中批量创建实例并为实例指定名称模式,请发出 POST 请求,如下所示:

POST https://compute.googleapis.com/compute/beta/projects/PROJECT_ID/zones/ZONE/instances/bulkInsert

{
  "count": COUNT,
  "namePattern": "NAME_PATTERN",
  "instanceProperties": {
    "machineType": "MACHINE_TYPE",
    "disks": [
      {
        "boot": true,
        "initializeParams": {
          "sourceImage": "projects/IMAGE_PROJECT/global/images/IMAGE"
        }
      }
    ],
    "networkInterfaces": [
      {
        "network": "global/networks/default"
      }
    ],
    "scheduling": {
      "gracefulShutdown": {
        "enabled": true
      }
    }
  }
}

替换以下内容:

  • PROJECT_ID:要在其中批量创建实例的项目的 ID。

  • ZONE:要用于批量创建实例的可用区。

  • COUNT:要创建的实例数量。

  • NAME_PATTERN:实例的名称模式。如需替换实例名称中的数字序列,请使用哈希值 (#) 字符序列。例如,使用 instance-# 作为名称模式将生成名称以 instance-1instance-2 开头的实例,一直到由 COUNT 指定的实例数量。

  • MACHINE_TYPE:实例的机器类型。

  • IMAGE_PROJECT:映像所属的映像项目;例如 debian-cloud。如需详细了解支持的映像项目,请参阅公共映像

  • IMAGE:指定以下其中一项:

    • 操作系统映像的特定版本,例如 debian-12-bookworm-v20240617

    • 映像系列,其格式必须为 family/IMAGE_FAMILY。此格式指定最新的未弃用操作系统映像。例如,如果您指定 family/debian-12,则系统会使用 Debian 12 映像系列中的最新版本。如需详细了解如何使用映像系列,请参阅映像系列最佳实践

  • ZONE:要用于批量创建实例的可用区。

(可选)如需指定自定义正常关闭期限,请在请求正文中添加 maxDuration 字段:

POST https://compute.googleapis.com/compute/beta/projects/PROJECT_ID/zones/ZONE/instances/bulkInsert

{
  "count": COUNT,
  "namePattern": "NAME_PATTERN",
  "instanceProperties": {
    "machineType": "MACHINE_TYPE",
    "disks": [
      {
        "boot": true,
        "initializeParams": {
          "sourceImage": "projects/IMAGE_PROJECT/global/images/IMAGE"
        }
      }
    ],
    "networkInterfaces": [
      {
        "network": "global/networks/default"
      }
    ],
    "scheduling": {
      "gracefulShutdown": {
        "enabled": true,
        "maxDuration": {
          "seconds": "MAX_DURATION"
        }
      }
    }
  }
}

MAX_DURATION 替换为正常关闭期的时长(以秒为单位)。该值必须介于 13600(3,600 秒,即 1 小时)之间。

如需了解批量创建实例时的更多配置选项,请参阅批量创建虚拟机

在创建实例模板时启用正常关闭

创建启用了正常关停的实例模板时,默认关闭时段为 10 分钟。您还可以选择指定 1 秒到 1 小时之间的自定义关机时长。

使用实例模板创建的所有计算实例都启用了正常关闭功能。

如需创建已启用正常关闭的实例模板,请选择以下选项之一:

控制台

  1. 在 Google Cloud 控制台中,打开实例模板页面。

    转到“实例模板”

  2. 点击创建实例模板

    系统随即会打开创建实例模板页面。

  3. 名称字段中,输入实例模板的名称。

  4. 按如下方式选择位置

    • 如需通过创建区域级实例模板来减少跨区域依赖项,请执行以下操作:

      1. 选择地区级(如果尚未选择)。

      2. 区域字段中,选择要在其中创建实例模板的区域。

    • 否则,如需跨区域使用实例模板,请选择全球级

  5. 机器配置部分中,指定机器类型。

  6. 展开 虚拟机预配模型高级设置部分,然后执行以下操作:

    1. 选中正常关停虚拟机复选框。

    2. 可选:如需指定自定义正常关闭期限,请在时长上限字段中指定时长。

  7. 点击创建

gcloud

如需创建启用了正常关闭的实例模板,请将 gcloud beta compute instance-templates create 命令--graceful-shutdown 标志结合使用。

例如,如需创建已启用优雅关闭功能的区域实例模板,请运行以下命令:

gcloud beta compute instance-templates create INSTANCE_TEMPLATE_NAME \
    --graceful-shutdown \
    --instance-template-region=REGION \
    --machine-type=MACHINE_TYPE

替换以下内容:

  • INSTANCE_TEMPLATE_NAME:实例模板的名称。

  • REGION:要在其中创建实例模板的区域。

  • MACHINE_TYPE:使用实例模板创建的实例的机器类型。

(可选)如需指定自定义正常关闭期限,请添加 --graceful-shutdown-max-duration 标志。

gcloud beta compute instance-templates create INSTANCE_TEMPLATE_NAME \
    --graceful-shutdown \
    --graceful-shutdown-max-duration=MAX_DURATION \
    --instance-template-region=REGION \
    --machine-type=MACHINE_TYPE

MAX_DURATION 替换为关闭时段的持续时间。该值的格式必须为小时数、分钟数或秒数,后面分别跟 hms。例如,指定 1h 表示 1 小时,或指定 20m10s 表示 20 分钟 10 秒。

REST

如需创建已启用正常关闭的实例模板,请向以下方法之一发出 POST 请求:

例如,如需创建已启用优雅关闭功能的区域实例模板,请发出 POST 请求,如下所示:

POST https://compute.googleapis.com/compute/beta/projects/PROJECT_ID/regions/REGION/instanceTemplates

{
  "name": "INSTANCE_TEMPLATE_NAME",
  "properties": {
    "disks": [
      {
        "boot": true,
        "initializeParams": {
          "sourceImage": "projects/IMAGE_PROJECT/global/images/IMAGE"
        }
      }
    ],
    "machineType": "MACHINE_TYPE",
    "networkInterfaces": [
      {
        "network": "global/networks/default"
      }
    ],
    "scheduling": {
      "gracefulShutdown": {
        "enabled": true
      }
    }
  }
}

替换以下内容:

  • PROJECT_ID:要在其中创建实例模板的项目的 ID。

  • REGION:要创建实例模板的区域。

  • INSTANCE_TEMPLATE_NAME:实例模板的名称。

  • IMAGE_PROJECT:映像所属的映像项目;例如 debian-cloud。如需详细了解支持的映像项目,请参阅公共映像

  • IMAGE:指定以下其中一项:

    • 操作系统映像的特定版本,例如 debian-12-bookworm-v20240617

    • 映像系列,其格式必须为 family/IMAGE_FAMILY。此格式指定最新的未弃用操作系统映像。例如,如果您指定 family/debian-12,则系统会使用 Debian 12 映像系列中的最新版本。如需详细了解如何使用映像系列,请参阅映像系列最佳实践

  • MACHINE_TYPE:使用实例模板创建的实例的机器类型。

(可选)如需指定自定义正常关闭期限,请在请求正文中添加 maxDuration 字段。

POST https://compute.googleapis.com/compute/beta/projects/PROJECT_ID/global/instanceTemplates

{
  "name": "INSTANCE_TEMPLATE_NAME",
  "properties": {
    "disks": [
      {
        "boot": true,
        "initializeParams": {
          "sourceImage": "projects/IMAGE_PROJECT/global/images/IMAGE"
        }
      }
    ],
    "machineType": "MACHINE_TYPE",
    "networkInterfaces": [
      {
        "network": "global/networks/default"
      }
    ],
    "scheduling": {
      "gracefulShutdown": {
        "enabled": true,
        "maxDuration": {
          "seconds": "MAX_DURATION"
        }
      }
    }
  }
}

MAX_DURATION 替换为关机时长的时长(以秒为单位)。该值必须介于 13600(3,600 秒,即 1 小时)之间。

如需了解创建实例模板时的更多配置选项,请参阅创建实例模板

后续步骤