在 MIG 中执行一键式操作系统映像升级


通过将映像系列滚动更新结合使用,您可以针对托管实例组 (MIG) 启用一键式操作系统映像升级。

使用一键式操作系统映像升级有许多好处,其中包括:

  • 适用于所有虚拟机机器类型和所有实例组大小。
  • 支持 Windows 和 Linux 映像和容器。
  • 系统会根据当前实例模板重新创建实例,也可以选择根据新模板重新创建实例,这样您可以保存定制脚本和元数据。
  • 支持有状态 MIG,因此您也可以选择将数据保留在非启动磁盘上。
  • 新操作系统版本的更新会自动发布,用户在发出初始请求后无需再进行额外输入。
  • 支持通过可选的健康检查进行批量更新。

准备工作

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

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

一键式操作系统映像升级的工作原理是什么?

如果您调用某个更新,则托管实例组会将该实例组中的所有虚拟机的启动磁盘替换为您定制映像系列中的最新可用操作系统映像版本。MIG 会保留您在实例模板中为该组中的每个虚拟机设置的元数据和启动脚本。系统会根据实例模板中的规范重新创建非启动磁盘。如需了解如何保留数据,请参阅在 MIG 中配置有状态磁盘

为了避免应用中断,您可以执行批量更新,并确保更新期间有指定百分比的虚拟机处于运行状态。要提高可靠性,您可以为托管实例组配置基于应用的健康检查:该实例组会在继续对其他虚拟机进行更新前,等待更新后的虚拟机上的应用返回健康状况良好的响应。

准备工作

  • 安装或更新到 Google Cloud CLI 的最新版本。

  • 确保您已创建一个指向映像系列的实例模板。Google 建议您使用自定义映像系列来降低发布与应用不兼容的映像版本的风险。通过只在与应用进行兼容性测试后才将映像添加到自定义映像系列,可以确保仅发布兼容的映像版本。

    如果您的实例模板指向某个映像系列,则托管实例组始终会通过该系列中的最新映像创建实例,例如在以下情况下:

    • 由于您或托管实例组的自动扩缩程序增加了托管实例组的大小,托管实例组添加新实例。
    • 托管实例组由于手动触发或者通过自动修复而重新创建实例。
  • 发布新映像并添加到映像系列之前,请使用您的应用测试新映像。

  • 或者,可以选择为您的托管实例组创建基于应用的健康检查。基于应用的健康检查会验证您的应用在托管实例组中的每个虚拟机上是否按预期响应。您可以配置更新,让不可用的虚拟机不超过一个。如果应用没有按预期响应,则托管实例组会将该虚拟机标记为不可用,而且您的发布不会继续。

针对托管实例组执行一键式操作系统映像升级

要将 MIG 中的所有虚拟机更新为自定义映像系列中的最新映像,请完成以下步骤:

  1. 使用以下命令启动滚动替换

    gcloud compute instance-groups managed rolling-action replace instance-group-name \
        [--max-surge=max-surge ] [--max-unavailable=max-unavailable]

    替换以下内容:

    • instance-group-name:要操作的托管实例组的名称。
    • max-surge:在更新过程中可以临时创建的额外虚拟机数量上限。这可以是固定数量(例如 5)或托管实例组大小的某一百分比(例如 10%)。
    • max-unavailable:更新过程中可能不可用的虚拟机数量上限。这可以是固定数量 (5) 或托管实例组大小的百分比 (10%)。

    您可以将 --max-unavailable--max-surge 选项一起使用来合并健康检查,以阻止会造成虚拟机无法使用的进一步更新。

  2. 使用 wait-until 子命令来检查托管实例组的 status.versionTarget.isReached 字段是否设为 true监控更新

    gcloud compute instance-groups managed wait-until instance-group-name --version-target-reached

    替换以下内容:

    • instance-group-name:要操作的托管实例组的名称。

    该命令会在实例组更新后返回。

    您还可以列出实例以查看每个实例的状态。

    gcloud compute instance-groups managed list-instances instance-group-name

    该命令会返回实例列表及其详细信息,包括每个虚拟机的状态运行状况当前操作。如果所有虚拟机都处于 RUNNING 状态且没有执行当前操作,则托管实例组是最新的且稳定

  3. 如果需要回滚到以前的操作系统映像,则必须创建实例模板并指定要使用的映像。然后启动滚动更新以将所有托管实例更新为使用该模板。如需了解详情,请参阅回滚更新

示例

此示例包含以下任务:

  1. 创建实例模板以轻松进行操作系统映像更新:
  2. 基于模板创建托管实例组。
  3. 设置健康检查以通过映像更新来避免中断。
  4. 向映像系列添加新映像。
  5. 使用单个命令调用操作系统更新。
  6. 监控更新。

使用以下步骤,针对托管实例组启用并执行一键式操作系统升级:

  1. 创建一个指定自定义映像系列的实例模板。该映像系列应包含经过测试且受信任的映像。MIG 通过模板创建的每个虚拟机都使用该系列中最新的可用映像。

    gcloud compute instance-templates create example-template \
        --machine-type n1-standard-4 \
        --image-family my-image-family \
        --image-project my-project \
        --tags=http-server
    
  2. 基于实例模板创建托管实例组。此示例基于 example-template 启动含有三个实例的托管实例组。由于实例模板指定了映像系列,因此托管实例组会使用该系列中的最新映像来创建每个虚拟机。

    gcloud compute instance-groups managed create example-group \
      --base-instance-name example \
      --size 3 \
      --zone us-east1-b \
      --template example-template
    
  3. 可选:配置并启用基于应用的健康检查。如果应用在映像更新后没有响应,您可以使用健康检查状态并结合 maxUnavailable 设置,以阻止托管实例组进一步发布。

    1. 创建健康检查,以在请求路径 /health 上查找 HTTP 200 响应。每个实例上的 GitHub 应用都会提供该路径。

      gcloud compute health-checks create http example-autohealer-check \
          --check-interval 10 \
          --timeout 5 \
          --healthy-threshold 2 \
          --unhealthy-threshold 3 \
          --request-path "/health"
      
    2. 创建防火墙规则以允许健康检查器探测对实例进行访问。健康检查器探测来自 130.211.0.0/2235.191.0.0/16 范围内的地址

      gcloud compute firewall-rules create default-allow-http-health-check \
          --network default \
          --allow tcp:80 \
          --source-ranges 130.211.0.0/22,35.191.0.0/16
      
    3. 向托管实例组添加健康检查。

      gcloud compute instance-groups managed update example-group \
          --zone us-east1-b --health-check example-autohealer-check
      
  4. 当有可用的更新、经过测试且确定与您的应用兼容时,请创建新映像,并使用 --family 标志将该映像添加到自定义映像系列中。

    gcloud compute images my-image-v2 \
        --source-disk boot-disk-1 \
        --source-disk-zone us-central1-f \
        --family my-image-family

    在此示例中,my-image-family 中的最新映像现在是 my-image-v2,它基于来源磁盘 boot-disk-1

  5. 调用滚动替换以替换 MIG 中的所有虚拟机。MIG 会根据组的实例模板替换每个虚拟机。实例模板指定 my-image-family,因此每个虚拟机都将获得系列中的最新映像 (my-image-v2)。

    您可以配置更新所导致的中断级别。在此示例中,托管实例组会额外创建一个大于组目标大小的虚拟机,并且在该虚拟机已启动并运行之前不会移除任何现有虚拟机。

    gcloud compute instance-groups managed rolling-action replace example-group \
        --max-surge 1 --max-unavailable 0
    
  6. 如果您要监控更新的状态,请使用带有 --version-target-reached 标志的 wait-until 命令。该命令会在实例组更新后返回。

    gcloud compute instance-groups managed wait-until --version-target-reached example-group \
        --zone us-east1-
    Waiting for group to reach version target
    ...
    Version target is reached
    

    您还可以使用 list-instances 命令查看每个虚拟机的状态运行状况当前操作、实例模板和版本。

    gcloud compute instance-groups managed list-instances example-group \
        --zone us-east1-b
    
    
    NAME       ZONE        STATUS   HEALTH_STATE  ACTION     INSTANCE_TEMPLATE  VERSION_NAME                        LAST_ERROR
    test-211p  us-east1-b  RUNNING  HEALTHY       NONE       example-template   0/2020-01-30 13:34:28.843377+00:00
    test-t5qb  us-east1-b  RUNNING  UNKNOWN       VERIFYING  example-template   0/2020-01-30 13:34:28.843377+00:00
    test-x331  us-east1-b  RUNNING  HEALTHY       NONE       example-template   0/2020-01-20 20:39:51.819399+00:00
    
  7. 如果您需要回滚到之前的映像,请按照以下步骤操作:

    1. 创建新的实例模板以指定所需的映像。
    2. 启动滚动更新以应用实例模板。

后续步骤