设置虚拟机主机维护政策


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

准备工作

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

    选择标签页以了解您打算如何使用本页面上的示例:

    控制台

    当您使用 Google Cloud 控制台访问 Google Cloud 服务和 API 时,无需设置身份验证。

    gcloud

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

      gcloud init
    2. 设置默认区域和可用区

    REST

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

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

      gcloud init

限制

  • 您无法更改抢占式虚拟机的主机维护政策。发生维护事件时,抢占式虚拟机会停止且不会迁移。您必须手动重启抢占的虚拟机。
  • 使用 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
  }

后续步骤