在 MIG 中配置有状态 IP 地址


通过在代管式实例组 (MIG) 中配置有状态 IP 地址,可确保在自动修复、更新和重新创建该组中的虚拟机实例时保留 IP 地址。

您可以保留内部和外部 IPv4 地址。您可以将 IP 地址配置为自动分配,也可以将特定 IP 地址分配给 MIG 中的每个虚拟机实例。

准备工作

  • 查看何时使用有状态 MIG 以及有状态 MIG 的工作原理
  • 如果您尚未设置身份验证,请进行设置。身份验证是通过其进行身份验证以访问 Google Cloud 服务和 API 的过程。如需从本地开发环境运行代码或示例,您可以按如下方式向 Compute Engine 进行身份验证。

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

    控制台

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

    gcloud

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

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

    Terraform

    如需从本地开发环境使用本页面上的 Terraform 示例,请安装并初始化 gcloud CLI,然后使用用户凭据设置应用默认凭据。

    1. 安装 Google Cloud CLI。
    2. 如需初始化 gcloud CLI,请运行以下命令:

      gcloud init
    3. 为您的 Google 账号创建本地身份验证凭据:

      gcloud auth application-default login

    如需了解详情,请参阅 为本地开发环境设置身份验证

    REST

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

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

      gcloud init

限制

具有有状态 IP 地址的 MIG 存在以下限制:

  • 系统不支持 IPv6 地址。

  • 没有子网的网络(例如旧版网络)不支持内部 IP 地址。

具有有状态配置的 MIG(有状态 MIG)具有以下限制:

  • 如果您的 MIG 采用有状态配置,则您无法使用自动扩缩功能。
  • 如果您要使用自动滚动更新,则必须将替换方法设置为 RECREATE
  • 对于有状态区域级 MIG,您必须停用主动式重新分布功能(将重新分布类型设置为 NONE),以防止通过自动跨可用区重新分布删除有状态实例。
  • 如果您使用所有实例配置来替换实例模板属性,则无法在任何每个实例配置中指定这些属性,同时也无法在组的所有实例配置中指定这些属性。

价格

您需要根据网络价格为外部 IP 地址付费。

何时使用有状态 IP 地址

在以下场景中,保留实例的 IP 地址非常有用:

  • 您的应用要求在分配 IP 地址后保持静态,例如 Kafka。
  • 您的应用的配置取决于特定的 IP 地址,例如 DNS 服务器。
  • 用户(包括其他应用)通过专用静态 IP 地址访问您的服务器,例如文件服务器。
  • 您需要在不更改网络配置的情况下迁移现有工作负载。

为实例组中的所有虚拟机配置有状态 IP 地址

在以下场景中,为 MIG 中的所有虚拟机配置有状态 IP 地址非常有用:

  • 您的应用要求在分配 IP 地址后保持静态。但是您的应用不需要为特定实例分配特定的 IP 地址。IP 地址可以在创建实例时自动分配。
  • 您的用户(包括其他应用)通过您在部署应用后发布的静态 IP 地址访问您的服务器。
  • 您希望从实例自动修复和自动更新中受益,同时保留在创建实例时自动分配的静态 IP 地址。

如需为实例组中的现有和未来的虚拟机实例保留静态内部或外部 IP 地址,请在有状态政策中配置该实例组。

当您将有状态 IP 地址配置添加到实例组的有状态政策时,MIG 会通过以下方式应用配置:

  • 对于新实例,MIG 会自动分配和预留静态 IP 地址。
  • 对于现有实例,MIG 会通过预留相应的静态 IP 地址将使用中的临时内部外部 IP 地址升级为静态地址。
  • 对于没有外部 IP 地址的现有实例,MIG 会分配并预留静态 IP 地址,并使用以下默认值将访问权限配置添加到相应的网络接口:

    "accessConfigs": [
      {
        "kind": "compute#accessConfig",
        "name": "External NAT",
        "natIP": "XX.XX.XX.XX",
        "networkTier": "PREMIUM",
        "type": "ONE_TO_ONE_NAT"
      }
    ]
    

如需预留静态 IP 地址,MIG 会创建地址资源。

在创建 MIG 时配置有状态 IP 地址

使用 Google Cloud 控制台、gcloud CLI、Terraform 或 REST。

控制台

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

    进入“实例组”

  2. 选择您的项目并点击继续

  3. 点击创建实例组

  4. 选择新建代管式实例组(有状态)

  5. 为该实例组指定名称

  6. 选择实例模板

  7. 实例数下方,指定此代管式实例组将要包含的实例数量。

  8. 有状态配置下,展开要设为有状态地址的外部 IP 地址和内部 IP 地址。

    1. 有状态下,选择
    2. 永久性实例删除时下拉列表中,选择在删除虚拟机实例后要对有状态 IP 地址执行的操作。可用的选项包括:
      • 分离 IP 地址(默认):在删除实例时取消分配地址并保留地址。
      • 删除 IP 地址:从实例组永久删除实例时(例如,手动删除实例或减小实例组的大小时),删除静态 IP 地址预留。
    3. 完成有状态配置后,点击完成
  9. 点击创建

gcloud

创建 MIG 时,如需指定实例模板的网络接口中的哪些 IP 地址应为有状态,请将以下一个或多个标志与 gcloud compute instance-groups managed create 命令结合使用:

  • --stateful-internal-ip,用于将给定网络接口的内部 IP 地址标记为有状态。
  • --stateful-external-ip,用于将给定网络接口的外部 IP 地址标记为有状态。
gcloud compute instance-groups managed create INSTANCE_GROUP_NAME \
    --template INSTANCE_TEMPLATE \
    --size SIZE \
    --instance-redistribution-type NONE \
    --stateful-internal-ip [enabled | interface-name=NI_NAME][,auto-delete=DELETE_RULE] \
    --stateful-external-ip [enabled | interface-name=NI_NAME][,auto-delete=DELETE_RULE]

替换以下内容:

  • INSTANCE_GROUP_NAME:要创建的 MIG 的名称。
  • INSTANCE_TEMPLATE:创建新实例时要使用的实例模板的名称。
  • SIZE:此实例组中所需的初始实例数量。
  • NI_NAME:(可选)网络接口名称。如果未提供,则必须提供 enabled 选项,并且默认采用名为 nic0 的主要网络接口。 如果您有多个网络接口,可以为每个网络接口中的每个 IP 地址指定此标志。
  • DELETE_RULE:(可选)设置在虚拟机实例永久删除后应如何处理关联的静态地址资源。可用的选项如下所示:

    • never:(默认值)切勿删除静态 IP 地址。请改为在删除实例时取消分配地址并保留地址。
    • on-permanent-instance-deletion:从实例组永久删除实例时(例如,手动删除实例或减小实例组的大小时),删除静态 IP 地址预留。

    无论删除规则的值如何,实例组都始终会在实例自动修复、更新和重新创建操作时保留有状态 IP 地址。

示例

您需要为默认和自定义网络创建具有静态内部 IP 地址的区域级虚拟机实例组,并且仅为默认网络创建静态外部 IP 地址。您希望自动分配地址,但需要通过实例自动修复、更新和重新创建事件保留地址。将实例配置存储在名为 node-template 的实例模板中。

如需创建该实例组,请运行以下命令:

gcloud compute instance-groups managed create example-group \
    --region us-east1 \
    --template node-template \
    --base-instance-name node \
    --instance-redistribution-type NONE \
    --size 3 \
    --stateful-internal-ip interface-name=nic0,auto-delete=on-permanent-instance-deletion
    --stateful-internal-ip interface-name=nic1,auto-delete=on-permanent-instance-deletion
    --stateful-external-ip enabled,auto-delete=on-permanent-instance-deletion

nic0nic1 网络接口中的内部 IP 地址和 nic0 网络接口中的外部 IP 地址针对该实例组中的所有实例都配置为有状态。该实例组会自动为每个实例预留静态内部和外部 IP 地址。由于 auto-delete 标志设置为 on-permanent-instance-deletion,因此,当您删除关联的实例或整个实例组时,该实例组将自动删除静态 IP 地址预留。

如需验证 nic0nic1 网络接口中的内部 IP 地址以及 nic0 网络接口中的外部 IP 地址是否配置为有状态,请运行以下命令:

gcloud compute instance-groups managed describe example-group \
    --zone us-east1-c

输出类似以下内容:

baseInstanceName: node
...
name: example-group
...
statefulPolicy:
  preservedState:
    internalIPs:
      nic0:
        autoDelete: ON_PERMANENT_INSTANCE_DELETION
      nic1:
        autoDelete: ON_PERMANENT_INSTANCE_DELETION
    externalIPs:
      nic0:
        autoDelete: ON_PERMANENT_INSTANCE_DELETION
...

您可以看到,该实例组的有状态政策将 nic0nic1 网络接口中的内部 IP 地址以及 nic0 网络接口中的外部 IP 地址声明为有状态,并规定在永久删除实例时删除静态 IP 地址预留。

Terraform

如果您尚未创建您希望为 MIG 中的每个虚拟机指定机器类型、启动磁盘映像、网络和其他虚拟机属性的实例模板,请创建实例模板

创建 MIG 时,如需指定实例模板的网络接口中的哪些 IP 地址应为有状态,请使用以下一个或多个块:

  • stateful_internal_ip,用于将给定网络接口的内部 IP 地址标记为有状态。
  • stateful_external_ip,用于将给定网络接口的外部 IP 地址标记为有状态。

以下示例在创建区域级 MIG 时配置有状态 IP 地址。如需详细了解示例中使用的资源,请参阅 google_compute_region_instance_group_manager 资源

resource "google_compute_region_instance_group_manager" "default" {
  name               = "example-group"
  base_instance_name = "node"
  target_size        = 3
  region             = "us-east1"

  version {
    instance_template = google_compute_instance_template.default.id
    name              = "primary"
  }
  update_policy {
    type                         = "OPPORTUNISTIC"
    minimal_action               = "REFRESH"
    instance_redistribution_type = "NONE"
    max_unavailable_fixed        = 3
  }
  stateful_internal_ip {
    interface_name = "nic0"
    delete_rule    = "ON_PERMANENT_INSTANCE_DELETION"
  }
  stateful_internal_ip {
    interface_name = "nic1"
    delete_rule    = "ON_PERMANENT_INSTANCE_DELETION"
  }
  stateful_external_ip {
    interface_name = "nic0"
    delete_rule    = "ON_PERMANENT_INSTANCE_DELETION"
  }
}

如需了解如何应用或移除 Terraform 配置,请参阅基本 Terraform 命令

REST

创建 MIG 时,如需指定实例模板的网络接口中的哪些 IP 地址应为有状态,请将这些 IP 地址添加到 instanceGroupManagers.insertregionInstanceGroupManagers.insert 方法的请求正文中的 statefulPolicy 字段。

POST https://compute.googleapis.com/compute/v1/projects/PROJECT/regions/REGION/instanceGroupManagers

{
  "name": "INSTANCE_GROUP_NAME",
  "versions": [
    {
      "instanceTemplate": "global/instanceTemplates/INSTANCE_TEMPLATE"
    }
  ],
  "targetSize": SIZE,
  "statefulPolicy": {
    "preservedState": {
      "internalIPs": {
        "NI_NAME": {"autoDelete": "DELETE_RULE" }
      },
      "externalIPs": {
        "NI_NAME": {"autoDelete": "DELETE_RULE" }
      }
    }
  },
  "updatePolicy": {
    "instanceRedistributionType": "NONE"
  }
}

替换以下内容:

  • PROJECT:请求的项目 ID。
  • REGION:对于区域级 MIG,这是实例组所在的区域。对于可用区级 MIG,将 regions/REGION 替换为 zones/ZONE 并指定 MIG 所在的可用区。
  • NAME:要创建的 MIG 的名称。
  • INSTANCE_TEMPLATE:创建新实例时要使用的实例模板的名称。
  • SIZE:此实例组中所需的初始实例数量。
  • NI_NAME:(可选)网络接口名称。如果未提供,则必须提供 enabled 选项,并且默认采用名为 nic0 的主要网络接口。 如果您有多个网络接口,可以指定多个 NI_NAMES
  • DELETE_RULE:(可选)设置在虚拟机实例永久删除后应如何处理关联的静态地址资源。可用的选项如下所示:

    • NEVER:(默认)切勿删除静态 IP 地址。请改为在删除实例时取消分配地址并保留地址。
    • ON_PERMANENT_INSTANCE_DELETION:从实例组永久删除实例时(例如,手动删除实例或减小实例组的大小时),删除静态 IP 地址预留。

    无论删除规则的值如何,实例组都始终会在实例自动修复、更新和重新创建操作时保留有状态 IP 地址。

示例

您需要为默认和自定义网络创建具有静态内部 IP 地址的区域级虚拟机实例组,并且仅为默认网络创建静态外部 IP 地址。您希望自动分配地址,但需要通过实例自动修复、更新和重新创建事件保留地址。将实例配置存储在名为 node-template 的实例模板中。

如需创建该实例组,请使用 regionInstanceGroupManagers.insert 方法:

POST https://compute.googleapis.com/compute/v1/projects/example-project/regions/us-east1/instanceGroupManagers

{
  "name": "example-group",
  "baseInstanceName": "node",
  "versions": [
    {
      "instanceTemplate": "global/instanceTemplates/node-template"
    }
  ],
  "targetSize": 3,
  "statefulPolicy": {
    "preservedState": {
      "internalIPs": {
        "nic0": {"autoDelete": "ON_PERMANENT_INSTANCE_DELETION" },
        "nic1": {"autoDelete": "ON_PERMANENT_INSTANCE_DELETION" }
      }
      "externalIPs": {
        "nic0": {"autoDelete": "ON_PERMANENT_INSTANCE_DELETION" }
      }
    }
  },
  "updatePolicy": {
    "instanceRedistributionType": "NONE"
  }
}

nic0nic1 网络接口中的内部 IP 地址和 nic0 网络接口中的外部 IP 地址针对该实例组中的所有实例都配置为有状态。该实例组会自动为每个实例预留静态内部和外部 IP 地址。由于 auto-delete 字段设置为 ON_PERMANENT_INSTANCE_DELETION,因此,当您删除关联的实例或整个实例组时,该实例组将自动删除静态 IP 地址预留。

使用 regionInstanceGroupManagers.get 方法验证 nic0nic1 网络接口中的内部 IP 以及 nic0 网络接口中的外部 IP 是否在新的 regionInstanceGroupManagers 资源的有状态政策中进行了配置:

GET https://compute.googleapis.com/compute/v1/projects/example-project/regions/us-east1/instanceGroupManagers/example-group

响应包含已配置的有状态政策:

{
  "name": "example-group",
  "baseInstanceName": "node",
  ...
  "statefulPolicy": {
    "preservedState": {
      "internalIPs": {
        "nic0": {"autoDelete": "ON_PERMANENT_INSTANCE_DELETION" },
        "nic1": {"autoDelete": "ON_PERMANENT_INSTANCE_DELETION" }
      }
      "externalIPs": {
        "nic0": {"autoDelete": "ON_PERMANENT_INSTANCE_DELETION" }
      }
    }
  }
  ...
}

您可以看到,该实例组的有状态政策将 nic0nic1 网络接口中的内部 IP 地址以及 nic0 网络接口中的外部 IP 地址声明为有状态,并规定在永久删除实例时删除关联的静态 IP 地址预留。

为现有 MIG 中的 IP 地址设置和更新有状态配置

如果您在无状态 MIG(未进行任何有状态配置的 MIG)上运行工作负载,并且该工作负载需要静态 IP 地址,则可以将已分配给代管式虚拟机实例的 IP 地址配置为有状态。这可确保在实例自动修复、更新和重新创建事件时保留现有虚拟机的 IP 地址。您可以选择在删除实例后保留静态 IP 地址预留。

通过为现有 MIG 中的 IP 地址配置有状态政策,您可以执行以下操作:

  • 将 IP 地址配置为实例组中所有现有实例和未来实例的有状态地址。这会将所有现有实例的相应临时 IP 地址提升为静态 IP 地址。
  • 更新 IP 地址的现有有状态配置。

MIG 会将有状态政策中更新后的配置自动且异步地应用于所有实例。更新有状态政策中的 IP 地址配置不会中断正在运行的虚拟机实例。如需了解详情,请参阅应用有状态政策更新

控制台

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

    进入“实例组”

  2. 点击要指定有状态 IP 地址的实例组的名称。

  3. 点击修改以修改此代管式实例组。

  4. 有状态配置下,展开要设为有状态地址的外部 IP 地址和内部 IP 地址。

    1. 有状态下,选择
    2. 永久性实例删除时下拉列表中,选择在删除虚拟机实例后要对有状态 IP 地址执行的操作。可用的选项包括:
      • 分离 IP 地址(默认):在删除实例时取消分配地址并保留地址。
      • 删除 IP 地址:从实例组永久删除实例时(例如,手动删除实例或减小实例组的大小时),删除静态 IP 地址预留。
    3. 更新有状态配置后,点击完成
    4. 点击保存以完成更新。

gcloud

如需指定哪些 IP 地址应为有状态,或更新现有 MIG 的有状态 IP 配置,请将一个或多个 --stateful-internal-ip--stateful-external-ip 标志与 gcloud compute instance-groups managed update 命令结合使用。

gcloud compute instance-groups managed update INSTANCE_GROUP_NAME \
    --stateful-internal-ip [enabled | interface-name=NI_NAME][,auto-delete=DELETE_RULE] \
    --stateful-external-ip [enabled | interface-name=NI_NAME][,auto-delete=DELETE_RULE]

替换以下内容:

  • INSTANCE_GROUP_NAME:要更新的 MIG 的名称。
  • NI_NAME:(可选)网络接口名称。如果未提供,则必须提供 enabled 选项,并且默认采用名为 nic0 的主要网络接口。 如果您有多个网络接口,可以为每个网络接口中的每个 IP 地址指定此标志。
  • DELETE_RULE:(可选)设置在虚拟机实例永久删除后应如何处理关联的静态地址资源。可用的选项如下所示:

    • never:(默认值)切勿删除静态 IP 地址。请改为在删除实例时取消分配地址并保留地址。
    • on-permanent-instance-deletion:从实例组永久删除实例时(例如,手动删除实例或减小实例组的大小时),删除静态 IP 地址预留。

    无论删除规则的值如何,实例组都始终会在实例自动修复、更新和重新创建操作时保留有状态 IP 地址。

如果已在给定网络接口的有状态政策中配置指定的 IP 地址,则该命令会更新配置。

示例

您需要通过静态外部 IP 地址将在名为 example-fs-group 的有状态 MIG 上运行的文件服务器公开给外部用户。实例组中的实例具有临时外部 IP 地址。您必须确保在实例自动修复和更新时保留该 IP 地址,以便外部用户能够通过发布的 IP 地址持续访问服务器。您还需要预留该 IP 地址,以确保在意外删除实例组时保持持续性。

更新 MIG 以使用以下命令将外部 IP 地址定义为有状态:

gcloud compute instance-groups managed update example-fs-group \
    --stateful-external-ip enabled

因此,实例组会针对所有代管式实例将 nic0 网络接口中的临时外部 IP 地址异步提升为静态 IP 地址。

现在,外部 IP 地址会在实例自动修复、更新和重新创建事件时保留。由于未指定的 auto-delete 规则默认设置为 never,因此关联的静态 IP 地址预留在实例删除时会取消分配并保留。

您可以通过运行 gcloud compute instance-groups managed describe example-fs-group 命令来验证是否已在有状态政策中配置有状态外部 IP。

REST

如需指定哪些 IP 地址应为有状态,或更新现有 MIG 的有状态 IP 配置,请使用 instanceGroupManagers.patchregionInstanceGroupManagers.patch 方法:

PATCH https://compute.googleapis.com/compute/v1/projects/PROJECT/regions/REGION/instanceGroupManagers/INSTANCE_GROUP_NAME

{
  "statefulPolicy": {
    "preservedState": {
      "internalIPs": {
        "NI_NAME": {"autoDelete": "DELETE_RULE" }
      },
      "externalIPs": {
        "NI_NAME": {"autoDelete": "DELETE_RULE" }
      }
    }
  }
}

替换以下内容:

  • PROJECT:请求的项目 ID。
  • REGION:对于区域级 MIG,这是实例组所在的区域。对于可用区级 MIG,将 regions/REGION 替换为 zones/ZONE 并指定 MIG 所在的可用区。
  • NAME:要创建的 MIG 的名称。
  • NI_NAME:(必需)网络接口名称。主要网络接口名为 nic0。 如果您有多个网络接口,可以指定多个 NI_NAMES
  • DELETE_RULE:(可选)设置在虚拟机实例永久删除后应如何处理关联的静态地址资源。可用的选项如下所示:

    • NEVER:(默认)切勿删除静态 IP 地址。请改为在删除实例时取消分配地址并保留地址。
    • ON_PERMANENT_INSTANCE_DELETION:从实例组永久删除实例时(例如,手动删除实例或减小实例组的大小时),删除静态 IP 地址预留。

    无论删除规则的值如何,实例组都始终会在实例自动修复、更新和重新创建操作时保留有状态 IP 地址。

如果已在有状态政策中配置指定的 IP 地址,则该方法会修补配置。

示例

您需要通过静态外部 IP 地址将在名为 example-fs-group 的有状态 MIG 上运行的文件服务器公开给外部用户。实例组中的实例具有临时外部 IP 地址。您必须确保在实例自动修复和更新时保留该 IP 地址,以便外部用户能够通过发布的网络接口持续访问服务器。您还需要预留该 IP 地址,以确保在意外删除实例组时保持持续性。

修补 MIG 以将外部 IP 地址定义为有状态:

PATCH https://compute.googleapis.com/compute/v1/projects/example-project/regions/us-east1/instanceGroupManagers/example-fs-group

{
  "statefulPolicy": {
    "preservedState": {
      "externalIPs": {
        "nic0": {"autoDelete": "NEVER" }
      }
    }
  }
}

因此,实例组会针对所有代管式实例将 nic0 网络接口中的临时外部 IP 地址异步提升为静态 IP 地址。

现在,外部 IP 地址会在实例自动修复、更新和重新创建事件时保留。由于 autoDelete 规则设置为 NEVER,因此关联的静态 IP 地址预留在实例删除时会取消分配并保留。

通过查看 regionInstanceGroupManagers.get 方法返回的 regionInstanceGroupManagers 资源,验证是否已在有状态政策中配置外部 IP 地址。

将之前的有状态 IP 地址声明为无状态

出于以下等原因,您可能需要将有状态 IP 地址配置为临时 IP 地址:

  • 重新设计应用的架构,使其不再依赖于静态 IP 地址。
  • 您误将 IP 配置为有状态并想要将其还原。

您可以从实例组的有状态政策中移除有状态 IP 配置,以针对所有代管式实例将给定网络接口中的 IP 地址声明为临时 IP 地址。

从有状态政策中移除有状态 IP 配置时,MIG 会自动以异步方式从实例组中所有实例的保留状态中移除 IP 地址。此操作不会中断正在运行的虚拟机实例。这些 IP 地址在实例上保持活跃,但不再为有状态。当您重新创建或更新实例或者实例自动修复时,MIG 会取消分配关联的静态 IP 地址并自动分配临时地址。如果您不再需要保留静态外部 IP 地址预留,现在可以将其释放

如需了解详情,请参阅以下文档:

控制台

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

    进入“实例组”

  2. 点击要移除 IP 地址的有状态配置的实例组的名称。

  3. 点击修改以修改此代管式实例组。

  4. 有状态配置下,展开您要设为无状态地址的外部 IP 地址和内部 IP 地址。

    1. 有状态选项更改为
    2. 点击完成
  5. 完成更改后,点击保存

gcloud

如需指定将 MIG 的有状态政策中的哪些 IP 地址设为临时 IP 地址,请将 --remove-stateful-internal-ips--remove-stateful-external-ips 标志与 gcloud compute instance-groups managed update 命令结合使用:

gcloud compute instance-groups managed update INSTANCE_GROUP_NAME \
    --remove-stateful-internal-ips NI_NAME[,NI_NAME,...] \
    --remove-stateful-external-ips NI_NAME[,NI_NAME,...]

替换以下内容:

  • INSTANCE_GROUP_NAME:要更新的 MIG 的名称。
  • NI_NAME(必需):网络接口名称。主要网络接口名为 nic0。 如果您有多个网络接口,可以指定多个 NI_NAMES

如果您需要将名为 nic0 的默认主要网络接口中的有状态 IP 地址转变为临时 IP 地址,您还可以使用以下命令:

gcloud compute instance-groups managed update INSTANCE_GROUP_NAME \
    --stateful-internal-ip disabled \
    --stateful-external-ip disabled

示例

您的应用已通过名为 example-group 的 MIG 中虚拟机实例的已发布静态外部 IP 地址公开给用户。您已通过在 MIG 前面部署负载均衡器并借助该负载均衡器将流量路由到托管式虚拟机来重新设计服务的架构。您不再需要保留静态外部 IP 地址,并希望将虚拟机的外部 IP 地址设为临时 IP 地址。

如需将 MIG 中虚拟机的有状态外部 IP 地址设为临时 IP 地址,请运行以下命令:

gcloud compute instance-groups managed update example-group \
    --remove-stateful-external-ips nic0

MIG 会自动以异步方式从实例组中所有实例的保留状态中移除 nic0 网络接口的静态外部 IP 地址。外部 IP 地址在实例上保持活跃,但不再为有状态。当您重新创建或更新实例或者实例自动修复时,MIG 会取消分配关联的静态 IP 地址并自动分配临时地址。如果您不再需要保留静态外部 IP 地址预留,现在可以将其释放

REST

如需指定将 MIG 的有状态政策中的哪些 IP 地址设为临时 IP 地址,请使用 instanceGroupManagers.patchregionInstanceGroupManagers.patch 方法从 MIG 的有状态政策中移除每个 IP 的配置:

PATCH https://compute.googleapis.com/compute/v1/projects/PROJECT/regions/REGION/instanceGroupManagers/INSTANCE_GROUP_NAME

{
  "statefulPolicy": {
    "preservedState": {
      "internalIPs": {
        "NI_NAME": null
      },
      "externalIPs": {
        "NI_NAME": null
      }
    }
  }
}

替换以下内容:

  • PROJECT:请求的项目 ID。
  • REGION:对于区域级 MIG,这是实例组所在的区域。对于可用区级 MIG,将 regions/REGION 替换为 zones/ZONE 并指定 MIG 所在的可用区。
  • INSTANCE_GROUP_NAME:要创建的 MIG 的名称。
  • NI_NAME:(必需)网络接口名称。主要网络接口名为 nic0。 如果您有多个网络接口,可以指定多个 NI_NAMES

示例

您的应用已通过名为 example-group 的 MIG 中虚拟机实例的已发布静态外部 IP 地址公开给用户。您已通过在 MIG 前面部署负载均衡器并借助该负载均衡器将流量路由到代管式虚拟机来重新设计服务的架构。您不再需要保留静态外部 IP 地址,并希望将虚拟机的外部 IP 地址设为临时 IP 地址。

如需将 MIG 中虚拟机的有状态外部 IP 地址设为临时 IP 地址,请修补 MIG:

PATCH https://compute.googleapis.com/compute/v1/projects/example-project/regions/us-east1/instanceGroupManagers/example-group

{
  "statefulPolicy": {
    "preservedState": {
      "externalIPs": {
        "nic0": null
      }
    }
  }
}

MIG 会自动以异步方式从实例组中所有实例的保留状态中移除 nic0 网络接口的静态外部 IP 地址。外部 IP 地址在实例上保持活跃,但不再为有状态。当您重新创建或更新实例或者实例自动修复时,MIG 会取消分配关联的静态 IP 地址并自动分配临时地址。如果您不再需要保留静态外部 IP 地址预留,现在可以将其释放

为 MIG 中的虚拟机单独配置有状态 IP 地址

在以下场景中,为 MIG 中的虚拟机单独配置有状态 IP 地址非常有用:

  • 将现有工作负载(引入现有预留的静态 IP 地址)从独立虚拟机实例迁移到有状态 MIG,以便从自动修复和自动更新中受益。
  • 分配架构或工作负载配置所需的特定预留的静态 IP 地址。

在 MIG 中创建虚拟机时配置静态 IP 地址

在 MIG 中单独创建特定实例时,您可以预留静态 IP 地址并将其分配给这些实例。在架构、配置或用户依赖于特定静态 IP 地址的情况下,这种做法对于将有状态应用从现有的独立虚拟机迁移到有状态 MIG 非常有用。

当您在 MIG 中手动创建实例并提供静态 IP 地址时,MIG 会执行以下操作:

  1. 为提供的 IP 地址创建静态内部外部 IP 地址预留(如果它们尚不存在)。
  2. 使用提供的实例名称和 IP 地址通过实例模板创建实例。
  3. 使用为 IP 地址提供的有状态配置创建实例配置

gcloud

如需创建具有预定义静态 IP 地址的实例,请将 gcloud compute instance-groups managed create-instance 命令与以下一个或多个标志结合使用:

  • --stateful-internal-ip,用于设置给定网络接口的静态内部 IP 地址。
  • --stateful-external-ip,用于设置给定网络接口的静态外部 IP 地址。
gcloud compute instance-groups managed create-instance INSTANCE_GROUP_NAME \
    --instance INSTANCE_NAME \
    --stateful-internal-ip address=ADDRESS[,interface-name=NI_NAME][,auto-delete=DELETE_RULE] \
    --stateful-external-ip address=ADDRESS[,interface-name=NI_NAME][,auto-delete=DELETE_RULE]

替换以下内容:

  • INSTANCE_GROUP_NAME:MIG 的名称。
  • INSTANCE_NAME:要创建的实例的名称。
  • NI_NAME:(可选)网络接口名称。如果未提供,则默认使用名为 nic0 的主要网络接口。 如果您有多个网络接口,可以为每个网络接口中的每个 IP 指定此标志。
  • ADDRESS(必需):要采用以下格式之一分配给实例的静态 IP 地址:

    • 地址。静态 IP 地址预留的网址,例如:"projects/example-project/regions/us-east1/addresses/example-ip-name"
    • 字面量 - 例如:"130.211.181.55"
      • 如果提供的 IP 地址尚未预留,则 MIG 会自动创建相应的 IP 地址预留。
      • 如果提供的 IP 地址已预留,则 MIG 会将预留分配给实例。
  • DELETE_RULE:(可选)设置在虚拟机实例永久删除后应如何处理关联的静态地址资源。可用的选项如下所示:

    • never:(默认值)切勿删除静态 IP 地址。请改为在删除实例时取消分配地址并保留地址。
    • on-permanent-instance-deletion:从实例组永久删除实例时(例如,手动删除实例或减小实例组的大小时),删除静态 IP 地址预留。

    无论删除规则的值如何,实例组都始终会在实例自动修复、更新和重新创建操作时保留有状态 IP 地址。

示例

您需要向代理服务器集群再添加一个虚拟机实例,该实例在名为 proxy-cluster 的 MIG 上运行。您已创建了一个名为 proxy-node-03-ip 的静态内部 IP 地址预留,并需要将其分配给新节点。即使决定将来删除节点,您也需要保留 IP 地址预留。

运行以下命令来创建该节点:

gcloud compute instance-groups managed create-instance proxy-cluster \
    --instance proxy-node-03 \
    --stateful-internal-ip address="projects/example-project/regions/us-east1/addresses/proxy-node-03-ip",auto-delete=never

该命令会创建一个名为 proxy-node-03 的实例,将提供的名为 proxy-node-03-ip 的静态内部 IP 地址分配给该实例,并将 IP 的有状态配置存储在相应的实例配置中。由于 auto-delete 标志设置为 never,因此如果您以后删除该实例,IP 仍会预留。

Terraform

如需创建具有预定义静态 IP 地址的虚拟机,请使用以下一个或多个块:

  • preserved_state.internal_ip,用于将给定网络接口的内部 IP 地址标记为有状态。
  • preserved_state.external_ip,用于将给定网络接口的外部 IP 地址标记为有状态。

以下示例在区域级 MIG 中创建虚拟机时配置静态 IP 地址。如需详细了解示例中使用的资源,请参阅 google_compute_region_per_instance_config 资源。 对于可用区级 MIG,请使用 google_compute_per_instance_config 资源

resource "google_compute_region_per_instance_config" "default" {
  region_instance_group_manager = google_compute_region_instance_group_manager.default.name
  region                        = google_compute_region_instance_group_manager.default.region
  name                          = "proxy-node-03-ip"
  preserved_state {
    internal_ip {
      interface_name = "nic0"
      auto_delete    = "NEVER"
      ip_address {
        address = google_compute_address.default.id
      }
    }
  }
}

如需了解如何应用或移除 Terraform 配置,请参阅基本 Terraform 命令

REST

如需在 MIG 中创建一个或多个实例,设置自定义实例名称,并将预定义静态 IP 地址分配给这些实例,请使用 instanceGroupManagers.createInstancesregionInstanceGroupManagers.createInstances 方法。

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/instanceGroupManagers/INSTANCE_GROUP_NAME/createInstances

{
  "instances": [
    {
      "name": "INSTANCE_NAME",
      "preservedState" : {
        "internalIPs": {
          "NI_NAME" : {
            "ipAddress": {
              "address": "ADDRESS",
              "literal": "LITERAL"
            },
            "autoDelete": "DELETE_RULE"
          },
          ...
        },
        "externalIPs": {
          "NI_NAME" : {
            "ipAddress": {
              "address": "ADDRESS",
              "literal": "LITERAL"
            },
            "autoDelete": "DELETE_RULE"
          },
          ...
        },
        ...
      }
    },
    ...
  ]
}

替换以下内容:

  • PROJECT_ID:请求的项目 ID。
  • NAME:MIG 的名称。
  • REGION:对于区域级 MIG,这是实例组所在的区域。对于可用区级 MIG,将 regions/REGION 替换为 zones/ZONE 并指定 MIG 所在的可用区。
  • INSTANCE_NAME:要创建的实例的名称。
  • NI_NAME(必需):网络接口名称。主要网络接口名为 nic0。 如果您有多个网络接口,可以指定多个 NI_NAMES
  • ADDRESS:(可选)要以静态 IP 地址预留的网址格式分配给实例的静态 IP 地址,例如:"projects/example-project/regions/us-east1/addresses/example-ip-name"。在分配静态 IP 地址时,您一次必须且只能设置一个字段(addressliteral)。
  • LITERAL:(可选)要以字面量格式分配给实例的静态 IP 地址,例如:"130.211.181.55"。在分配静态 IP 地址时,您一次必须且只能设置一个字段(addressliteral)。
    • 如果提供的字面量 IP 地址尚未预留,则 MIG 会自动创建相应的 IP 地址预留。
    • 如果提供的字面量 IP 地址已预留,则 MIG 会将预留分配给实例。
  • DELETE_RULE:(可选)设置在虚拟机实例永久删除后应如何处理关联的静态地址资源。可用的选项如下所示:

    • NEVER:(默认值)切勿删除静态 IP 地址。请改为在删除实例时取消分配地址并保留地址。
    • ON_PERMANENT_INSTANCE_DELETION:从实例组永久删除实例时(例如,手动删除实例或减小实例组的大小时),删除静态 IP 地址预留。

    无论删除规则的值如何,实例组都始终会在实例自动修复、更新和重新创建操作时保留有状态 IP 地址。

示例

您需要向代理服务器集群再添加一个虚拟机实例,该实例在名为 proxy-cluster 的 MIG 上运行。您已创建了一个名为 proxy-node-03-ip 的静态内部 IP 地址预留,并需要将其分配给新节点。即使决定将来删除节点,您也需要保留 IP 地址预留。

调用 regionInstanceGroupManagers.createInstances 方法来创建其他实例:

POST https://compute.googleapis.com/compute/v1/projects/example-project/regions/us-east1/instanceGroupManagers/proxy-cluster/createInstances

{
  "instances": [
    {
      "name": "proxy-node-03",
      "preservedState" : {
        "internalIPs": {
          "nic0" : {
            "ipAddress": {
              "address": "projects/example-project/regions/us-east1/addresses/proxy-node-03-ip"
            },
            "autoDelete": "NEVER"
          }
        }
      }
    }
  ]
}

该方法会创建一个名为 proxy-node-03 的实例,将提供的名为 proxy-node-03-ip 的静态内部 IP 地址分配给该实例,并将 IP 的有状态配置存储在相应的实例配置中。由于 autoDelete 字段设置为 NEVER,因此如果您以后删除该实例,IP 仍会预留。

为 MIG 中的现有虚拟机配置静态 IP 地址

您可以单独为代管式实例设置预定义的静态 IP 地址或更新有状态 IP 配置,例如:

  • 为 MIG 中的现有实例分配静态 IP 地址。对于静态外部 IP 地址,此操作需要刷新实例;对于静态内部 IP 地址,此操作需要重新创建实例。
  • 更新已分配的静态 IP 地址的删除规则。此操作可以在不中断正在运行的实例的情况下完成。

对于您要为其配置外部静态 IP 的无外部 IP 地址的现有实例,MIG 会使用以下默认值将访问权限配置添加到相应的网络接口:

"accessConfigs": [
  {
    "kind": "compute#accessConfig",
    "name": "External Nat",
    "natIP": "XX.XX.XX.XX",
    "networkTier": "PREMIUM",
    "type": "ONE_TO_ONE_NAT"
  }
]

gcloud

如需为 MIG 中的虚拟机实例单独配置有状态 IP 地址,请在关联的实例配置中添加或更新有状态 IP 配置。

如果实例不存在每个实例配置,请将 gcloud compute instance-groups managed instance-configs create 命令与以下一个或多个标志结合使用:

  • --stateful-internal-ip,用于设置给定网络接口的静态内部 IP 地址。
  • --stateful-external-ip,用于设置给定网络接口的静态外部 IP 地址。
gcloud compute instance-groups managed instance-configs create INSTANCE_GROUP_NAME \
    --instance INSTANCE_NAME \
    --stateful-internal-ip address=ADDRESS[,interface-name=NI_NAME][,auto-delete=DELETE_RULE] \
    --stateful-external-ip address=ADDRESS[,interface-name=NI_NAME][,auto-delete=DELETE_RULE] \
    [--no-update-instance | --update-instance]
    [--instance-update-minimal-action MINIMAL_ACTION]

如果实例已存在实例配置,请将 gcloud compute instance-groups managed instance-configs update 命令与一个或多个 --stateful-internal-ip--stateful-external-ip 标志结合使用:

gcloud compute instance-groups managed instance-configs update INSTANCE_GROUP_NAME \
    --instance INSTANCE_NAME \
    --stateful-internal-ip address=ADDRESS[,interface-name=NI_NAME][,auto-delete=DELETE_RULE] \
    --stateful-external-ip address=ADDRESS[,interface-name=NI_NAME][,auto-delete=DELETE_RULE] \
    [--no-update-instance | --update-instance]
    [--instance-update-minimal-action MINIMAL_ACTION]

替换以下内容:

  • INSTANCE_GROUP_NAME:MIG 的名称。
  • INSTANCE_NAME:要为其配置有状态 IP 地址的实例的名称。
  • NI_NAME:(可选)网络接口名称。如果未提供,则默认使用名为 nic0 的主要网络接口。 如果您有多个网络接口,可以为每个网络接口中的每个 IP 指定此标志。
  • ADDRESS:要采用以下格式之一分配给实例的静态 IP 地址:
    • 地址。静态 IP 地址预留的网址,例如:"projects/example-project/regions/us-east1/addresses/example-ip-name"
    • 字面量。例如 "130.211.181.55"
      • 如果提供的 IP 地址尚未预留,则 MIG 会自动创建相应的 IP 地址预留。
      • 如果提供的 IP 地址已预留,则 MIG 会将预留分配给实例。
    • 如果实例的个别实例配置中已定义地址,则此子标志为可选项。否则为必需项。
    • 如果省略,则配置的地址将保持不变。
  • DELETE_RULE:(可选)设置在虚拟机实例永久删除后应如何处理关联的静态地址资源。可用的选项如下所示:

    • never:(默认值)切勿删除静态 IP 地址。请改为在删除实例时取消分配地址并保留地址。
    • on-permanent-instance-deletion:从实例组永久删除实例时(例如,手动删除实例或减小实例组的大小时),删除静态 IP 地址预留。
    • 如果省略,则系统会为新的有状态 IP 配置设置默认值;该值在现有配置中将保持不变。

    无论删除规则的值如何,实例组都始终会在实例自动修复、更新和重新创建操作时保留有状态 IP 地址。

  • --update-instance:(可选。默认。)立即将更改应用于实例。如果您使用 --no-update-instance 标志,则更改会保持未应用状态,并在您重新创建实例或之后将更新应用于实例时应用

  • MINIMAL_ACTION:(可选)在将实例配置更新应用于实例时,至少执行指定的操作。必须与 --update-instance 标志结合使用。该值必须为以下项之一:

    • none:不执行任何操作。
    • refresh:应用可在不停止实例的情况下应用的更新。
    • restart:停止实例,然后重新启动。
    • replace:重新创建实例。

如果省略此项,则使用更新所需的中断性最低的操作。

示例

您有一个名为 file-server 的文件服务器实例,它是有状态 MIG 中名为 fs-group 的单个实例。实例组具有相应的个别实例配置,并配置了有状态数据磁盘。文件服务器只能在内部访问,但现在您的用户需要通过静态 IP 地址从外部访问它。您已通过创建 file-server-ip 地址预留来预留静态外部 IP 地址。现在,您需要将此 IP 分配给文件服务器实例。

运行以下命令来配置文件服务器实例的有状态外部 IP:

gcloud compute instance-groups managed instance-configs update fs-group \
    --instance file-server \
    --stateful-external-ip interface-name=nic0,address="projects/example-project/regions/us-east1/addresses/file-server-ip",auto-delete=never \
    --update-instance

该命令将执行以下操作:

  1. 更新 file-server 实例的实例配置:
    1. 添加有状态外部 IP 配置,并指向 file-server-ip 地址预留。
    2. 保持现有有状态数据磁盘配置不变。
  2. 立即将每个实例配置更新应用于 file-server 实例,因为 --update-instance 标志已包含在内:刷新实例并分配 file-server-ip 预留中的外部静态 IP 地址。

REST

如需为 MIG 中的虚拟机实例单独配置有状态 IP,请在关联的实例配置中添加或更新有状态 IP 配置。

如果给定实例尚不存在实例配置,请将 instanceGroupManagers.updatePerInstanceConfigs 方法regionInstanceGroupManagers.updatePerInstanceConfigs 方法与一个或多个 IP 地址的有状态配置结合使用:

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/instanceGroupManagers/INSTANCE_GROUP_NAME/updatePerInstanceConfigs

{
  "perInstanceConfigs": [
    {
      "name": "INSTANCE_NAME",
      "preservedState" : {
        "internalIPs": {
          "NI_NAME" : {
            "ipAddress": {
              "address": "ADDRESS",
              "literal": "LITERAL"
            },
            "autoDelete": "DELETE_RULE"
          },
          ...
        },
        "externalIPs": {
          "NI_NAME" : {
            "ipAddress": {
              "address": "ADDRESS",
              "literal": "LITERAL"
            },
            "autoDelete": "DELETE_RULE"
          },
          ...
        },
        ...
      },
      "fingerprint: "FINGERPRINT"
    },
    ...
  ]
}

如果给定实例尚不存在实例配置,请将 instanceGroupManagers.patchPerInstanceConfigs 方法regionInstanceGroupManagers.patchPerInstanceConfigs 方法与一个或多个 IP 地址的有状态配置结合使用:

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/instanceGroupManagers/INSTANCE_GROUP_NAME/patchPerInstanceConfigs

{
  "perInstanceConfigs": [
    {
      "name": "INSTANCE_NAME",
      "preservedState" : {
        "internalIPs": {
          "NI_NAME" : {
            "ipAddress": {
              "address": "ADDRESS",
              "literal": "LITERAL"
            },
            "autoDelete": "DELETE_RULE"
          },
          ...
        },
        "externalIPs": {
          "NI_NAME" : {
            "ipAddress": {
              "address": "ADDRESS",
              "literal": "LITERAL"
            },
            "autoDelete": "DELETE_RULE"
          },
          ...
        },
        ...
      },
      "fingerprint: "FINGERPRINT"
    },
    ...
  ]
}

替换以下内容:

  • PROJECT_ID:请求的项目 ID。
  • NAME:MIG 的名称。
  • REGION:对于区域级 MIG,这是实例组所在的区域。对于可用区级 MIG,将 regions/REGION 替换为 zones/ZONE 并指定 MIG 所在的可用区。
  • INSTANCE_NAME(必需):要为其配置静态 IP 的实例的名称。
  • NI_NAME(必需):网络接口名称。主要网络接口名为 nic0。 如果您有多个网络接口,可以指定多个 NI_NAMES
  • ADDRESS:(可选)要以静态 IP 地址预留的网址格式分配给实例的静态 IP 地址,例如:"projects/example-project/regions/us-east1/addresses/example-ip-name"。在分配静态 IP 地址时,您一次必须且只能设置一个字段(地址或字面量)。
  • LITERAL:(可选)要以字面量格式分配给实例的静态 IP 地址。例如:"130.211.181.55"。在分配静态 IP 地址时,您一次必须且只能设置一个字段(地址或字面量)。
    • 如果提供的字面量 IP 地址尚未预留,则 MIG 会自动创建相应的 IP 地址预留。
    • 如果提供的字面量 IP 地址已预留,则 MIG 会将预留分配给实例。
  • DELETE_RULE:(可选)设置在虚拟机实例永久删除后应如何处理关联的静态地址资源。可用的选项如下所示:

    • NEVER:(默认值)切勿删除静态 IP 地址。请改为在删除实例时取消分配地址并保留地址。
    • ON_PERMANENT_INSTANCE_DELETION:从实例组永久删除实例时(例如,手动删除实例或减小实例组的大小时),删除静态 IP 地址预留。
    • 如果省略,则系统会为新的有状态 IP 配置设置默认值;该值在现有配置中将保持不变。

    无论删除规则的值如何,实例组都始终会在实例自动修复、更新和重新创建操作时保留有状态 IP 地址。

  • FINGERPRINT:(可选)给定配置的指纹(如果已存在)。用于乐观锁定。如果该指纹与提供的指纹不同,则操作会失败,因为这表示实例配置在上次读取后发生了更改。如需查看最新指纹,请参阅区域级可用区级 MIG 的 listPerInstanceConfigs 方法的输出。如果省略 fingerprint,操作会继续,而不会进行指纹比较。

updatePerInstanceConfigspatchPerInstanceConfigs 方法会更新指定的每个实例配置,但不会将配置更新应用于关联的代管式实例。当系统指示 MIG 重新创建或更新实例时,更改会应用于实例。您可以手动应用更新以将更改应用于实例。

示例

您有一个名为 file-server 的文件服务器实例,它是有状态 MIG 中名为 fs-group 的单个实例。实例组具有相应的个别实例配置,并配置了有状态数据磁盘。文件服务器只能在内部访问,但现在您的用户需要通过静态 IP 地址从外部访问它。您已通过创建 file-server-ip 地址预留来预留静态外部 IP 地址。现在,您需要将此 IP 分配给文件服务器实例。

如需使用新的有状态外部 IP 更新 file-server 的个别实例配置,请调用 patchPerInstanceConfigs 方法:

POST https://compute.googleapis.com/compute/v1/projects/example-project/regions/us-east1/instanceGroupManagers/fs-group/patchPerInstanceConfigs

{
  "perInstanceConfigs": [
    {
      "name": "file-server",
      "preservedState" : {
        "externalIPs": {
          "nic0" : {
            "ipAddress": {
              "address": "projects/example-project/regions/us-east1/addresses/file-server-ip"
            },
            "autoDelete": "NEVER"
          }
        }
      }
    }
  ]
}

该方法会修补 file-server 实例的实例配置:

  1. 添加有状态外部 IP 配置,并指向 file-server-ip 地址预留。
  2. 保持现有有状态数据磁盘配置不变。

配置更新尚未应用于 file-server 虚拟机实例。以后在重新创建实例或将更新应用于实例时,MIG 会应用配置更新。

如需将实例配置更新应用于 file-server 虚拟机实例,请为该实例调用 regionInstanceGroupManagers.applyUpdatesToInstances 方法

POST https://compute.googleapis.com/compute/v1/projects/example-project/regions/us-east1/instanceGroupManagers/gs-group/applyUpdatesToInstances

{
  "instances": ["/zones/us-east1-b/instances/file-server"]
}

该方法将配置的静态外部 IP 地址从 file-server-ip 预留分配给代管式实例。方法会刷新 file-server 实例以分配外部 IP 地址。

由于在有状态 IP 配置中 autoDelete 设置为 NEVER,因此如果您以后删除实例,IP 仍会预留。

将静态 IP 地址与 MIG 中的现有虚拟机取消关联

您可能需要将静态 IP 地址与现有虚拟机取消关联,从而使网络接口对于虚拟机为临时接口。这在以下情况下非常有用:

  • 重新设计应用的架构,使其不再依赖于静态 IP 地址。
  • 您误将 IP 配置为有状态并想要将其还原。

如需将静态 IP 地址与 MIG 中的现有虚拟机取消关联并针对单个虚拟机将 IP 地址设为临时,您可以将此 IP 的有状态配置从关联的实例配置中移除或删除整个实例配置(如果不包含任何其他状态)应用更改会产生以下影响:

  • IP 地址在实例上保持活跃,但不再为有状态。
  • 当您重新创建或更新实例或者实例自动修复时,MIG 会取消分配关联的静态 IP 地址预留并自动分配临时地址。
  • 取消分配后,静态 IP 地址仍会预留。

从个别实例配置中移除有状态 IP 配置不会中断正在运行的虚拟机实例,除非您明确选择这样做。

如需了解详情,请参阅以下文档:

gcloud

如需从关联的实例配置中移除有状态 IP 配置,请将 gcloud compute instance-groups managed instance-configs update 命令--remove-stateful-internal-ips--remove-stateful-external-ips 标志结合使用:

gcloud compute instance-groups managed instance-configs update INSTANCE_GROUP_NAME \
    --instance INSTANCE_NAME \
    --remove-stateful-internal-ips NI_NAME[,NI_NAME,...] \
    --remove-stateful-external-ips NI_NAME[,NI_NAME,...]
    [--no-update-instance | --update-instance] \
    [--instance-update-minimal-action MINIMAL_ACTION]

替换以下内容:

  • INSTANCE_GROUP_NAME:MIG 的名称。
  • INSTANCE_NAME(必需):要移除其有状态 IP 配置的实例的名称。
  • NI_NAME(必需):网络接口名称。主要网络接口名为 nic0。 如果您有多个网络接口,可以指定多个 NI_NAMES
  • --update-instance:(可选。默认。)立即将更改应用于实例。如果您使用 --no-update-instance 标志,则更改会保持未应用状态,并在您重新创建实例或之后将更新应用于实例时应用
  • MINIMAL_ACTION:(可选)在将实例配置更新应用于实例时,至少执行指定的操作。此标志只能与 --update-instance 标志一起使用。该值必须为以下项之一:

    • none:不执行任何操作。
    • refresh:应用可在不停止实例的情况下应用的更新。
    • restart:停止实例,然后重新启动。
    • replace:重新创建实例。

    如果省略此项,则使用更新所需的中断性最低的操作。

示例

您的应用已通过名为 example-group 的 MIG 中虚拟机实例的特定已发布静态外部 IP 地址公开给用户。您已通过在 MIG 前面部署负载均衡器并借助该负载均衡器将流量路由到代管式虚拟机来重新设计服务的架构。您不再需要保留静态外部 IP 地址,并希望将虚拟机的外部 IP 地址设为临时 IP 地址。

如需将 MIG 中虚拟机的有状态外部 IP 地址设为临时 IP 地址,请为每个实例(例如 node-1)运行以下命令:

gcloud compute instance-groups managed instance-configs update example-group \
    --instance node-1 \
    --remove-stateful-external-ips nic0 \
    --update-instance

该命令将执行以下操作:

  1. node-1 的个别实例配置中移除 nic0 网络接口内外部 IP 地址的有状态配置。
  2. 立即将个别实例配置更新应用于 node-1 虚拟机实例,因为 --update-instance 标志已包含在内。虚拟机实例不会中断,并继续从同一个 IP 提供服务,该 IP 不再是有状态的。MIG 从代管式实例的 preservedStateFromConfig 中移除对静态 IP 预留的引用,并将外部 IP 地址视为临时地址。MIG 会在后续实例重新创建、更新或自动修复事件时自动分配外部 IP。
  3. 取消分配后,原始静态 IP 仍会预留。如果您不再需要该 IP,可以将其释放

REST

如需从关联的实例配置中移除有状态 IP 配置,请使用 instanceGroupManagers.patchPerInstanceConfigs 方法regionInstanceGroupManagers.patchPerInstanceConfigs 方法

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/instanceGroupManagers/INSTANCE_GROUP_NAME/patchPerInstanceConfigs

{
  "perInstanceConfigs": [
    {
      "name": "INSTANCE_NAME",
      "preservedState" : {
        "internalIPs": {
          "NI_NAME" : null
        },
        "externalIPs": {
          "NI_NAME" : null
        }
      },
      "fingerprint: "FINGERPRINT"
    },
    ...
  ]
}

替换以下内容:

  • PROJECT_ID:请求的项目 ID。
  • NAME:MIG 的名称。
  • REGION:对于区域级 MIG,这是实例组所在的区域。对于可用区级 MIG,将 regions/REGION 替换为 zones/ZONE 并指定 MIG 所在的可用区。
  • INSTANCE_NAME(必需):要移除其有状态 IP 配置的实例的名称。
  • NI_NAME(必需):网络接口名称。主要网络接口名为 nic0。 如果您有多个网络接口,可以指定多个 NI_NAMES
  • FINGERPRINT:(可选)给定配置的指纹(如果已存在)。用于乐观锁定。如果该指纹与提供的指纹不同,则操作会失败,因为这表示实例配置在上次读取后发生了更改。如需查看最新指纹,请参阅区域级可用区级 MIG 的 listPerInstanceConfigs 方法的输出。如果省略 fingerprint,操作会继续,而不会进行指纹比较。

patchPerInstanceConfigs 方法会更新指定的实例配置,但不会将配置更新应用于关联的代管式实例。当系统指示 MIG 重新创建或更新实例时,更改会应用于实例。您可以手动应用更新以将更改应用于实例。

示例

您的应用已通过名为 example-group 的 MIG 中虚拟机实例的特定已发布静态外部 IP 地址公开给用户。您已通过在 MIG 前面部署负载均衡器并借助该负载均衡器将流量路由到代管式虚拟机来重新设计服务的架构。您不再需要保留静态外部 IP 地址,并希望将虚拟机的外部 IP 地址设为临时 IP 地址。

如需将 MIG 中虚拟机的有状态外部 IP 地址设为临时 IP 地址,请为每个实例(例如 node-1)运行以下方法,并为网络接口的有状态配置提供 null 值:

POST https://compute.googleapis.com/compute/v1/projects/example-project/regions/us-east1/instanceGroupManagers/example-group/patchPerInstanceConfigs

{
  "perInstanceConfigs": [
    {
      "name": "node-1",
      "preservedState" : {
        "externalIPs": {
          "nic0" : null
        }
      }
    }
  ]
}

该方法会从 node-1 的个别实例配置中移除 nic0 网络接口内有状态 IP 地址的配置。配置更新尚未应用于 node-1 虚拟机实例。MIG 会在下次重新创建或更新实例时应用配置更新。

如需将实例配置更新应用于 node-1 虚拟机实例,请为该实例运行 regionInstanceGroupManagers.applyUpdatesToInstances 方法

POST https://compute.googleapis.com/compute/v1/projects/example-project/regions/us-east1/instanceGroupManagers/example-group/applyUpdatesToInstances

{
  "instances": ["/zones/us-east1-c/instances/node-1"]
}

MIG 会从 node-1 实例的 preservedStateFromConfig 字段中移除对静态 IP 预留的引用,并将 IP 地址视为临时 IP 地址。MIG 会在后续实例重新创建、更新或自动修复事件时自动分配外部 IP。

取消分配后,原始静态 IP 仍会预留。如果您不再需要该 IP,可以将其释放

移除有状态配置

如需从 MIG 中的所有虚拟机的有状态政策中移除配置,请参阅以下文档:

如需从 MIG 中的特定虚拟机的实例配置中移除配置,请参阅以下文档:

清理未使用的静态 IP 地址

在为实例组中的代管式实例配置有状态 IP 地址时,您可以选择永久删除实例后是手动还是自动释放关联的静态 IP 地址预留。

  • 如需在永久删除实例时自动释放静态 IP 地址预留,请将 autoDelete 参数设置为 ON_PERMANENT_INSTANCE_DELETION
  • 如需手动释放静态 IP 地址预留,请将 autoDelete 参数设置为 NEVER。如需清理未使用的静态 IP 地址预留(例如,为了避免产生不必要的费用),请参阅以下文档:

如果您已指示 MIG 永不删除关联的 IP 预留,则在相应的实例或 MIG 不再存在后,静态 IP 地址仍会预留。

反馈

我们希望了解有关有状态 MIG 的用例、挑战和反馈。您可以通过 mig-discuss@google.com 向我们的团队提供您的反馈。

后续步骤