设置虚拟机主机维护政策


本文档介绍如何设置虚拟机 (VM) 实例的主机维护政策,以控制虚拟机在发生主机事件时的行为。

准备工作

  • 设置身份验证(如果尚未设置)。身份验证是通过其进行身份验证以访问 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. 安装 Google Cloud CLI,然后通过运行以下命令初始化 Google Cloud CLI:

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

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

        安装 Google Cloud CLI,然后通过运行以下命令初始化 Google Cloud CLI:

        gcloud init

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

限制

  • 您无法更改抢占式虚拟机的主机维护政策。发生维护事件时,抢占式虚拟机会停止且不会迁移。您必须手动重启抢占的虚拟机。
  • 使用 E2 机器类型创建虚拟机后,您无法将虚拟机的主机维护设置从 MIGRATE 更改为 TERMINATE,反之亦然。

可用的主机维护属性

您可以使用以下属性配置虚拟机的维护行为、重启行为以及发生主机错误后的行为。

除非您另行指定,否则 Compute Engine 会使用默认值配置每个虚拟机。

在主机事件期间,根据配置的主机维护政策,不支持实时迁移的虚拟机会被终止或自动重启。

  • onHostMaintenance:确定发生可能造成实例重新启动的维护事件时的行为。

    • MIGRATE默认值):在发生维护事件时,Compute Engine 会实时迁移实例。
    • TERMINATE:停止虚拟机,而不是迁移虚拟机。
  • automaticRestart:确定虚拟机崩溃或被系统停止时的行为。

    • true默认值):如果实例崩溃或停止,则 Compute Engine 会重启实例。
    • false:如果虚拟机崩溃或停止,则 Compute Engine 不会重启虚拟机。
  • localSsdRecoveryTimeout:设置本地 SSD 恢复超时。这是 Compute Engine 在主机错误后等待恢复本地 SSD 数据的最长时间(以小时为单位)。此设置仅适用于挂接了本地 SSD 磁盘的虚拟机。

    • 未设置默认值):Compute Engine 最长会等待 1 小时来恢复磁盘。对于 Z3 虚拟机(预览版),默认等待时间为 4 小时。
    • 介于 0 到 168 之间的数字:指定 Compute Engine 等待恢复磁盘的时长。该数字必须是整数,以 1 小时为增量,最大值为 7 天。值为 0 表示 Compute Engine 不会等待恢复数据。
  • hostErrorTimeoutSeconds预览版):设置 Compute Engine 在检测到虚拟机无响应后等待重启或终止虚拟机的最长时间(以秒为单位)。

    • 未设置默认值):Compute Engine 最长会等待 5.5 分钟(330 秒),然后再重启无响应的虚拟机。
    • 介于 90 到 330 之间的数字:指定 Compute Engine 在重启无响应的虚拟机之前等待的秒数(以 30 为增量)。

设置虚拟机的主机维护政策

当您首次创建虚拟机时或创建虚拟机后,可以更改虚拟机的主机维护政策。

在创建虚拟机期间设置主机维护政策

本部分中的信息重点介绍了如何在创建虚拟机时设置主机维护政策。如需查看更多虚拟机创建示例,请参阅创建并启动虚拟机实例

您可以使用 Google Cloud 控制台、gcloud CLI 或 Compute Engine API 在创建虚拟机时设置主机维护政策。

控制台

  1. 在 Google Cloud 控制台中,转到创建实例页面。

    转到“创建实例”

  2. 为虚拟机指定名称

  3. 为虚拟机选择区域可用区

  4. 机器配置部分中,执行以下操作:

    1. 指定虚拟机的机器类型的详细信息。
    2. 展开虚拟机预配模型高级设置菜单。
    3. 主机维护时菜单中,选择以下步骤之一:
    4. 如需在维护事件期间迁移虚拟机,请选择迁移虚拟机实例
    5. 如需在维护事件期间停止虚拟机,请选择终止虚拟机实例
  5. 如需创建虚拟机,请点击创建

gcloud

在 Google Cloud 控制台中,激活 Cloud Shell。

激活 Cloud Shell

Cloud Shell 会话随即会在 Google Cloud 控制台的底部启动,并显示命令行提示符。Cloud Shell 是一个已安装 Google Cloud CLI 且已为当前项目设置值的 Shell 环境。该会话可能需要几秒钟时间来完成初始化。

如需设置新虚拟机的主机维护政策,请使用 gcloud compute instances create 命令。包含以下一个或多个参数:

  • --maintenance-policy:虚拟机在主机维护期间是迁移还是停止。如果省略此属性,则默认情况下会迁移虚拟机。
  • --no-restart-on-failure--restart-on-failure:虚拟机是否在主机错误后自动重启。默认情况下,虚拟机始终会在检测到故障时重启。
  • --local-ssd-recovery-timeout:在主机错误发生后,Compute Engine 恢复任何挂接的本地 SSD 磁盘的时间。默认值为 1 小时。

使用以下命令设置新虚拟机的主机维护政策。如果您省略任何标志,则使用标志的默认值。

  gcloud compute instances create VM_NAME \
      --maintenance-policy=MAINTENANCE_POLICY \
      --RESTART_ON_FAILURE_BEHAVIOR \
      --local-ssd-recovery-timeout=SSD_RECOVERY_TIMEOUT

替换以下内容:

  • VM_NAME:虚拟机名称。
  • MAINTENANCE_POLICY:此虚拟机的维护政策,即 TERMINATEMIGRATE
  • RESTART_ON_FAILURE_BEHAVIOR:虚拟机的重启行为,设置为 --no-restart-on-failure--restart-on-failure
  • SSD_RECOVERY_TIMEOUT:恢复挂接到无响应的虚拟机的本地 SSD 所花费的小时数。有效值介于 0 到 168 之间,以 1 小时为增量。

设置主机错误检测超时

如需指定 Compute Engine 在重启或终止无响应的虚拟机之前等待的最长时间,请使用 gcloud compute instances create 命令。使用 --host-error-timeout-seconds 标志指定超时。

  gcloud beta compute instances create VM_NAME \
      --maintenance-policy=MAINTENANCE_POLICY \
      --RESTART_ON_FAILURE_BEHAVIOR \
      --local-ssd-recovery-timeout=SSD_RECOVERY_TIMEOUT \
      --host-error-timeout-seconds=ERROR_DETECTION_TIMEOUT

替换以下内容:

  • VM_NAME:虚拟机名称。
  • MAINTENANCE_POLICY:此虚拟机的维护政策,即 TERMINATEMIGRATE
  • RESTART_ON_FAILURE_BEHAVIOR:虚拟机的重启行为,设置为 --no-restart-on-failure--restart-on-failure
  • SSD_RECOVERY_TIMEOUT:Compute Engine 恢复挂接到无响应的虚拟机的本地 SSD 所花费的小时数。有效值介于 0 到 168 之间,以 1 小时为增量。
  • ERROR_DETECTION_TIMEOUT:Compute Engine 在重启无响应虚拟机之前等待的秒数,从 90 到 330(以 30 为增量)。

REST

如需使用 Compute Engine API 设置新虚拟机的主机维护政策,请使用 instances.insert 方法。 在请求正文的 scheduling 对象中添加以下一个或多个属性:

  • onHostMaintenance:虚拟机在主机维护期间是迁移还是停止。默认情况下,虚拟机会迁移。
  • automaticRestart:虚拟机在发生主机错误后是否自动重启。默认情况下,虚拟机会自动重启。
  • localSsdRecoveryTimeout:Compute Engine 在检测到主机错误后恢复任何挂接的本地 SSD 磁盘的时间。默认值为 1 小时。
      POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances

      {
        "name": "VM_NAME",

        "scheduling": {
          "onHostMaintenance": "MAINTENANCE_POLICY",
          "automaticRestart": "RESTART_POLICY,
          "localSsdRecoveryTimeout": SSD_RECOVERY_TIMEOUT
        }
      }

替换以下内容:

  • PROJECT_ID:虚拟机的项目。
  • ZONE:您要在其中创建虚拟机的可用区。
  • VM_NAME:虚拟机名称。
  • MAINTENANCE_POLICY:此虚拟机的维护政策,即 TERMINATEMIGRATE
  • RESTART_POLICY:此虚拟机的重启政策,即 truefalse
  • SSD_RECOVERY_TIMEOUT:Compute Engine 用于恢复挂接到无响应虚拟机的本地 SSD 磁盘的小时数。有效值为 0 到 168,以 1 小时为增量。

设置主机错误检测超时

如需设置 Compute Engine 等待重启或终止无响应虚拟机的最长时间,请使用 Beta 版 instances.insert 方法,因为此选项在预览版中可用。

hostErrorTimeoutSeconds 属性添加到请求正文的 scheduling 对象中。


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

   {
      "name": "VM_NAME",

      "scheduling": {
        "onHostMaintenance": "MAINTENANCE_POLICY",
        "automaticRestart": "RESTART_POLICY,
        "localSsdRecoveryTimeout": SSD_RECOVERY_TIMEOUT
        "hostErrorTimeoutSeconds": HOST_ERROR_TIMEOUT,
      }
    }

替换以下内容:

  • PROJECT_ID:虚拟机的项目。
  • ZONE:您要在其中创建虚拟机的可用区。
  • VM_NAME:虚拟机名称。
  • MAINTENANCE_POLICY:此虚拟机的维护政策,即 TERMINATEMIGRATE
  • RESTART_POLICY:此虚拟机的重启政策,即 truefalse
  • SSD_RECOVERY_TIMEOUT:Compute Engine 用于恢复挂接到无响应虚拟机的本地 SSD 磁盘的小时数。有效值为 0 到 168,以 1 小时为增量。
  • HOST_ERROR_TIMEOUT:Compute Engine 在重启或终止无响应虚拟机之前等待的秒数。有效值的范围介于 90 到 330 之间,以 30 为增量。

更新现有虚拟机的主机维护政策

控制台

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

    转到“虚拟机实例”

  2. 点击您要更改设置的虚拟机。此时将显示虚拟机详情页面。

  3. 在虚拟机详情页面上,完成以下步骤:

    1. 点击页面顶部的修改按钮。
    2. 找到管理部分。 在可用性政策部分中,您可以设置主机维护时自动重启选项。
    3. 点击保存

gcloud

在 Google Cloud 控制台中,激活 Cloud Shell。

激活 Cloud Shell

Cloud Shell 会话随即会在 Google Cloud 控制台的底部启动,并显示命令行提示符。Cloud Shell 是一个已安装 Google Cloud CLI 且已为当前项目设置值的 Shell 环境。该会话可能需要几秒钟时间来完成初始化。

使用 gcloud compute instances set-scheduling 命令更新现有虚拟机的主机维护政策。使用上一部分中创建的虚拟机命令中所述的相同参数。

    gcloud compute instances set-scheduling VM_NAME \
      --maintenance-policy=MAINTENANCE_POLICY \
      --RESTART_ON_FAILURE_BEHAVIOR \
      --local-ssd-recovery-timeout=SSD_RECOVERY_TIMEOUT

替换以下内容:

  • VM_NAME:虚拟机名称。
  • MAINTENANCE_POLICY:此虚拟机的政策,即 TERMINATEMIGRATE
  • RESTART_ON_FAILURE_BEHAVIOR:虚拟机的重启行为,即 --no-restart-on-failure--restart-on-failure
  • SSD_RECOVERY_TIMEOUT:Compute Engine 用于恢复挂接到无响应虚拟机的本地 SSD 磁盘的时间(以小时为单位)。有效值的范围介于 0 到 168 之间。

更新主机错误检测超时

如需更新 Compute Engine 等待重启或终止无响应虚拟机的最长时间,请使用 gcloud beta compute instances set-scheduling 命令,因为此功能仅在预览版中可用。

使用 --host-error-timeout-seconds 参数更新超时。例如:

    gcloud beta compute instances set-scheduling VM_NAME \
      --maintenance-policy=MAINTENANCE_POLICY \
      --RESTART_ON_FAILURE_BEHAVIOR \
      --local-ssd-recovery-timeout=SSD_RECOVERY_TIMEOUT \
      --host-error-timeout-seconds=NUMBER_OF_SECONDS

替换以下内容:

  • VM_NAME:虚拟机名称。
  • MAINTENANCE_POLICY:此虚拟机的维护政策,即 TERMINATEMIGRATE
  • RESTART_ON_FAILURE_BEHAVIOR:虚拟机的重启行为,设置为 --no-restart-on-failure--restart-on-failure
  • SSD_RECOVERY_TIMEOUT:Compute Engine 用于恢复挂接到无响应虚拟机的本地 SSD 磁盘的时间(以小时为单位)。有效值的范围介于 0 到 168 之间。
  • NUMBER_OF_SECONDS:Compute Engine 在重启或终止无响应虚拟机之前等待的秒数,从 90 到 330(以 30 为增量)

REST

instances.setScheduling 方法 发出的 POST 请求,以更新现有虚拟机的主机维护政策。

在请求正文中添加以下一个或多个属性:

  • onHostMaintenance:虚拟机在主机维护期间是迁移还是停止。默认情况下,虚拟机会迁移。
  • automaticRestart:虚拟机在发生主机错误后是否自动重启。默认情况下,虚拟机会自动重启。
  • localSsdRecoveryTimeout:Compute Engine 在检测到主机错误后恢复任何挂接的本地 SSD 磁盘的时间。如果省略,则默认值为 1 小时。
    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME/setScheduling

    {
      "onHostMaintenance": "MAINTENANCE_POLICY",
      "automaticRestart": RESTART_POLICY,
      "localSsdRecoveryTimeout": SSD_RECOVERY_TIMEOUT
    }

替换以下内容:

  • PROJECT_ID:虚拟机的项目。
  • ZONE:该虚拟机所在的可用区。
  • VM_NAME:虚拟机名称。
  • MAINTENANCE_POLICY:此虚拟机的维护政策,即 TERMINATEMIGRATE
  • RESTART_POLICY:此虚拟机的重启政策,即 truefalse
  • SSD_RECOVERY_TIMEOUT:Compute Engine 用于恢复挂接到无响应虚拟机的本地 SSD 磁盘的时间(以小时为单位)。有效值的范围介于 0 到 168 之间。

更新主机错误检测超时

如需更新 Compute Engine 等待重启或终止无响应虚拟机的最长时间,您必须使用 Beta 版 instances.setScheduling 方法,因为此功能在预览版中可用。

hostErrorTimeoutSeconds 参数添加到请求正文。

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

  {
    "hostErrorTimeoutSeconds": NUMBER_OF_SECONDS,
  }

替换以下内容:

  • PROJECT_ID:虚拟机的项目。
  • ZONE:该虚拟机所在的可用区。
  • VM_NAME:虚拟机名称。
  • NUMBER_OF_SECONDS:Compute Engine 在重启或终止无响应虚拟机之前等待的秒数,从 90 到 330(以 30 为增量)

查看虚拟机的主机维护政策设置

控制台

  1. 转到虚拟机实例页面。

    转到“虚拟机实例”

  2. 点击要查看其设置的虚拟机的名称虚拟机实例详情页面随即打开。

  3. 找到管理部分。 可用性政策子部分会显示主机维护时自动重启的当前设置。

gcloud

使用 gcloud compute instances describe 命令查看虚拟机的主机维护选项设置:

    gcloud compute instances describe VM_NAME --format="yaml(scheduling)"

VM_NAME 替换为虚拟机名称。

输出包括虚拟机的主机错误检测超时,例如:

    scheduling:
      automaticRestart: true
      localSsdRecoveryTimeout:
        nanos: 0
        seconds: '10800'
      onHostMaintenance: MIGRATE
      preemptible: false
      provisioningModel: STANDARD

查看主机错误检测超时设置

使用 gcloud beta compute instances describe 命令查看 hostErrorTimeoutSeconds 的当前值,因为此选项仅在预览版中可用。

  gcloud beta compute instances describe VM_NAME --format="yaml(scheduling)"

VM_NAME 替换为虚拟机名称。

输出包括虚拟机的主机错误检测超时,例如:

  scheduling:
    automaticRestart: true
    hostErrorTimeoutSeconds: 120
    localSsdRecoveryTimeout:
      nanos: 0
      seconds: '10800'
    onHostMaintenance: MIGRATE
    preemptible: false
    provisioningModel: STANDARD

REST

如需查看虚拟机的主机维护设置,请使用 instances.get 方法

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

替换以下内容:

  • PROJECT_ID:虚拟机所在的项目。
  • ZONE:该虚拟机所在的可用区。
  • VM_NAME:虚拟机名称。

在输出中,scheduling 对象包含虚拟机的主机维护政策,例如:

  "scheduling": {
      "onHostMaintenance": "MIGRATE",
      "automaticRestart": true,
      "preemptible": false,
      "provisioningModel": "STANDARD",
      "localSsdRecoveryTimeout": {
        "seconds": "10800",
        "nanos": 0
      }
    }

查看主机错误超时设置

使用 Beta 版 instances.get 方法GET 请求来查看当前 hostErrorTimeoutSeconds 设置,因为此选项仅在预览版中可用。

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

替换以下内容:

  • PROJECT_ID:虚拟机的项目。
  • ZONE:该虚拟机所在的可用区。
  • VM_NAME:虚拟机名称。

在输出中,scheduling 对象包含虚拟机的主机错误检测超时,例如:

  "scheduling": {
    "hostErrorTimeoutSeconds": 120
  }

后续步骤