配置静态内部 IP 地址


本页面介绍如何配置和管理 Compute Engine 虚拟机实例的静态内部 IPv4 或 IPv6 地址。

如果某虚拟机实例需要固定不变的内部 IP 地址,您可以通过以下任一方式为该虚拟机获取一个静态内部 IP 地址:

如需了解如何管理次要内部 IP 地址,请参阅别名 IP 地址范围

在 Compute Engine 中,每个虚拟机实例都可以有多个网络接口。每个接口可以具有一个外部 IP 地址、一个主要内部 IP 地址和一个或多个次要内部 IP 地址。如需了解 IP 地址,请参阅 IP 地址文档。

使用静态内部 IP 地址时,您可以随时对虚拟机使用相同的 IP 地址,即使必须删除并重新创建虚拟机也是如此。

如需配置静态外部 IP 地址而不是内部 IP 地址,请参阅配置静态外部 IP 地址

准备工作

  • 了解 IP 地址
  • 如果您尚未设置身份验证,请进行设置。身份验证是通过其进行身份验证以访问 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. Terraform

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

      1. Install the Google Cloud CLI.
      2. To initialize the gcloud CLI, run the following command:

        gcloud init
      3. If you're using a local shell, then create local authentication credentials for your user account:

        gcloud auth application-default login

        You don't need to do this if you're using Cloud Shell.

      如需了解详情,请参阅 Set up authentication for a local development environment

      REST

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

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

        gcloud init

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

所需的角色

如需获得配置和管理静态 IP 地址所需的权限,请让管理员向您授予项目的以下 IAM 角色:

如需详细了解如何授予角色,请参阅管理访问权限

这些预定义角色包含配置和管理静态 IP 地址所需的权限。如需查看所需的确切权限,请展开所需权限部分:

所需权限

配置和管理静态 IP 地址需要以下权限:

  • 针对虚拟机实例的 compute.instances.update 权限
  • 针对虚拟机实例的 compute.instances.updateNetworkInterface 权限
  • 针对虚拟机实例的 compute.instances.addAccessConfig 权限
  • 针对虚拟机实例的 compute.instances.deleteAccessConfig 权限
  • 网络上的 compute.networks.list
  • 针对子网的 compute.subnetworks.use 权限
  • 针对子网的 compute.subnetworks.list 权限
  • 创建虚拟机:
    • 针对项目的 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 权限

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

限制

  • 您无法取消分配或更改现有资源的内部 IPv4 地址。例如,您无法向正在运行的虚拟机实例或已停止的虚拟机实例分配新的静态内部 IP 地址。但是,您可以将资源的临时内部 IP 地址升级为静态内部 IP 地址,这样即使删除资源后,该地址仍将保留。

  • 您可以预留的静态内部 IP 地址数量不能超过项目的配额。如需了解详情,请参阅 VPC 文档中每个项目的配额

  • 一次只能有一个资源使用静态内部 IP 地址。

  • 只有 VPC 网络支持预留静态内部 IP 地址。旧版模式网络不支持此操作。

  • 删除资源不会自动释放静态内部 IP 地址。如果不再需要某个静态内部 IP 地址,必须手动释放该地址。

  • 您无法更改静态 IP 地址的名称。

  • 静态内部 IP 地址是区域级的,意味着仅限于预留它们的区域。例如,如果 Region A 中有一个预留的静态内部 IP 地址,则只能使用 Region A 中的 IP 地址。

如何配置静态内部 IP 地址

您可以预留静态内部 IP 地址,然后在创建虚拟机时指定预留地址。您也可以使用临时内部 IP 地址创建虚拟机,然后将该临时 IP 地址升级为静态内部 IP 地址。

如需使用静态内部 IP 地址,您必须为项目创建 VPC 网络。如需查看项目中的 VPC 网络,请参阅查看 VPC 网络

预留静态内部 IPv4 或 IPv6 地址,然后将其与特定虚拟机关联

在此场景中,您需要单独预留静态内部 IP 地址,然后将其分配给虚拟机。

  1. 在您的 VPC 网络中创建子网。对于 IPv6 地址,请确保它是双栈子网

  2. 预留子网的主要 IP 地址范围内的一个内部 IP 地址。此步骤会创建一个已命名的内部 IP 地址资源,其中包含该特定内部 IP 地址。预留 IP 地址可防止 Google Cloud 自动将该地址分配为临时地址。

  3. 在创建虚拟机资源时将预留的内部 IP 地址与虚拟机实例进行关联来使用该地址。

为虚拟机指定临时内部 IPv4 或 IPv6 地址,然后升级该地址

在此场景中,您需要升级仍与虚拟机关联的临时内部 IPv4 或 IPv6 地址:

  1. 在您的 VPC 网络中创建子网。对于 IPv6 地址,请确保它是双栈子网

  2. 使用自动分配的临时 IPv4 或 IPv6 地址或特定的 IPv4 地址来创建虚拟机实例。

  3. 将临时内部 IP 地址升级为静态地址。

图 1 中概述了这两种方法。

内部 IP 地址预留状态。
图 1. 内部 IP 地址预留状态(点击可放大)。

查看可用的静态内部 IP 地址

如需查看所有现有静态内部 IP 地址,请完成以下步骤。

控制台

  1. 在 Google Cloud 控制台中,进入 IP 地址页面。

    进入“IP 地址”

  2. 点击内部 IP 地址

gcloud

使用 gcloud compute addresses list 命令

gcloud compute addresses list

API

使用 addresses.list 方法

GET https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/addresses

请替换以下内容:

  • PROJECT_ID:此请求的项目 ID
  • REGION:此请求的区域名称

如需列出所有区域中的所有地址,请使用 addresses.aggregatedList 方法

GET https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/aggregated/addresses

配置静态内部 IP 地址

虚拟机接口会从其连接到的子网获得 IP 地址。每个虚拟机接口都有一个主要内部 IPv4 地址,该地址从子网的主要 IPv4 范围中分配。如果虚拟机连接到具有内部 IPv6 范围的双栈子网,您可以为每个网络接口分配内部 IPv6 地址。

内部 IPv4 地址可通过以下方式分配:

  • Compute Engine 会自动从主要 IPv4 子网范围分配一个 IPv4 地址。
  • 您可以在创建虚拟机实例时分配特定的内部 IPv4 地址,也可以为项目预留静态内部 IPv4 地址并将该地址分配给虚拟机网络接口。

内部 IPv6 地址可通过以下方式分配:

  • Compute Engine 会自动从 IPv6 子网范围中分配一个 /96 范围。
  • 您可以从子网的内部 IPv6 范围中预留静态内部 IPv6 地址范围,并将其分配给虚拟机网络接口。

通过以下步骤,您可以为虚拟机配置静态内部 IP 地址:

创建具有预留的内部 IPv4 或 IPv6 地址的虚拟机实例

预留静态内部 IP 地址后,您可以在创建虚拟机实例时将预留地址分配给该实例。

创建连接到具有内部 IPv6 范围的双栈子网的虚拟机时,您无需指定任何预留的静态内部 IPv6 地址。Compute Engine 会自动为该虚拟机分配一个来自该子网的 IPv6 范围的临时内部 IPv6 地址。

控制台

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

    打开“创建实例”

  2. 展开高级选项部分。

  3. 展开网络部分。

  4. 如需分配内部 IPv4 地址,请执行以下操作:

    1. 选择网络和子网。
    2. 主要内部 IPv4 地址列表中选择预留的内部 IPv4 地址。

    或者,选择预留静态内部 IP 地址并预留新的静态内部 IPv4 地址。

  5. 如需分配内部 IPv6 地址,请执行以下操作:

    1. 选择包含 IPv6 子网的网络。
    2. 子网列表中选择双栈子网。该子网必须具有 INTERNAL IPv6 访问权限类型。
    3. 对于 IP 栈类型,请选择 IPv4 和 IPv6(双栈)
    4. 主要内部 IPv6 地址列表中选择预留的内部 IPv6 地址。

    或者,选择预留静态内部 IPv6 地址并预留新的静态内部 IPv6 地址。

  6. 如需完成默认网络接口的修改,请点击完成

  7. 继续虚拟机创建过程。

  8. 点击创建

gcloud

  • 如需创建具有预留内部 IPv4 地址的实例,请在创建实例时,使用 --private-network-ip 标志指定预留内部 IPv4 地址:

    gcloud compute instances create VM_NAME
        --private-network-ip IP_ADDRESS
    

    请替换以下内容:

    • VM_NAME:您要创建的虚拟机的名称。
    • IP_ADDRESS:您要分配的 IP 地址。

    如果您使用的是自定义子网模式网络,则还必须使用 --subnet SUBNET 参数指定子网。

  • 如需创建具有预留内部 IPv6 地址的实例,请在创建实例时,使用 --internal-ipv6-address 标志指定预留内部 IPv6 地址:

    gcloud compute instances create VM_NAME
        --subnet SUBNETWORK
        --stack-type IPV4_IPV6
        --internal-ipv6-address INTERNAL_IPV6_ADDRESS
        --zone ZONE
    

    请替换以下内容:

    • VM_NAME:您要创建的虚拟机的名称。
    • SUBNETWORK:内部 IPv6 地址的子网。
    • INTERNAL_IPV6_ADDRESS/96 IPv6 地址、IP 地址名称或地址资源的 URI。必须先预留 IP 地址,然后才能使用它。
    • ZONE:虚拟机的可用区。

REST

如需创建具有静态内部 IP 地址的虚拟机实例,请使用 instances.insert 方法

  • 对于内部 IPv4 地址,请在 networkInterfaces[].networkIP 属性中明确提供您要为虚拟机分配的内部 IPv4 地址。

    例如:

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances
    
    {
    "name": "VM_NAME",
    "machineType": "zones/us-central1-f/machineTypes/e2-micro",
    "networkInterfaces": [{
      "accessConfigs": [{
        "type": "ONE_TO_ONE_NAT",
        "name": "External NAT",
      }],
      "network": "global/networks/default",
      "networkIP": "IPV4_ADDRESS"
    }],
    "disks": [{
      "autoDelete": "true",
      "boot": "true",
      "type": "PERSISTENT",
      "initializeParams": {
          "sourceImage": "projects/debian-cloud/global/images/v20150818"
      }
    }]
    }

    请替换以下内容:

    • PROJECT_ID:项目的 ID,您将在该项目中创建虚拟机。
    • ZONE:要在其中创建虚拟机的可用区。
    • VM_NAME:虚拟机的名称。
    • IPV4_ADDRESS:要分配给虚拟机的内部 IPv4 地址。
  • 对于内部 IPv6 地址,请明确指定以下属性的值:

    • networkInterfaces[].stackType
    • networkInterfaces[].ipv6Address
    • networkInterfaces[].internalIpv6PrefixLength
    • networkInterfaces[].ipv6AccessType

    例如:

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances
    {
    "name": "VM_NAME",
    "machineType": "zones/us-central1-f/machineTypes/e2-micro",
    "networkInterfaces": [{
      "accessConfigs": [{
        "type": "ONE_TO_ONE_NAT",
        "name": "External NAT",
      }],
      "network": "global/networks/default",
      "stackType": "IPV4_IPV6"
      "ipv6Address": ""IPV6_ADDRESS"",
      "internalIpv6PrefixLength": 96
      "ipv6AccessType": INTERNAL,
    }],
    "disks": [{
      "autoDelete": "true",
      "boot": "true",
      "type": "PERSISTENT",
      "initializeParams": {
          "sourceImage": "projects/debian-cloud/global/images/v20150818"
      }
    }]
    }

    请替换以下内容:

    • PROJECT_ID:项目的 ID,您将在该项目中创建虚拟机。
    • ZONE:要在其中创建虚拟机的可用区。
    • VM_NAME:虚拟机的名称。
    • IPV6_ADDRESS:要分配给虚拟机的内部 IPv6 地址。

如果您删除了具有指定 IP 地址的实例,该地址会被返回未分配的地址池中。如果您需要在实例生命周期结束后保留内部 IP 地址,可以预留静态内部 IP 地址

对次要网络接口使用静态内部 IPv4 或 IPv6 地址

创建具有多个网络接口的虚拟机实例时,可以为主要和次要网络接口使用保留的静态内部 IPv4 或 IPv6 地址。

如需为次要网络接口使用静态内部 IPv4 或 IPv6 地址,请参阅创建具有多个网络接口的虚拟机实例

为现有实例更改或分配内部 IPv6 地址

您可以为现有虚拟机实例更改或分配内部 IPv6 地址。

如果实例已分配有内部 IPv6 地址,则必须先取消分配该地址。然后,使用实例的网络接口为实例分配新地址。

如需为现有虚拟机实例更改或分配静态内部 IPv6 地址,请完成以下步骤。

控制台

  1. 预留静态内部 IPv4 地址
  2. 在 Google Cloud 控制台中,前往虚拟机实例页面。

    进入“虚拟机实例”

  3. 点击要更改内部 IPv6 地址的实例的名称。
  4. 实例详情页面上,完成以下步骤:

    1. 点击修改
    2. 展开网络接口
    3. 主要内部 IPv6 地址列表中,选择自动分配 (/96) 或预留的静态内部 IPv6 地址。
    4. 点击完成
  5. 点击保存

gcloud

使用 compute instances network-interfaces update 命令

gcloud compute instances network-interfaces update VM_NAME \
    --network-interface NIC \
    --ipv6-network-tier PREMIUM \
    --stack-type IPV4_IPV6 \
    --internal-ipv6-address INTERNAL_IPV6_ADDRESS \
    --zone ZONE

请替换以下内容:

  • VM_NAME:您要创建的虚拟机的名称。
  • NIC:要更新的网络接口的名称。
  • INTERNAL_IPV6_ADDRESS:要分配给接口的 /96 内部 IPv6 地址、IP 地址名称或地址资源的 URI。
  • ZONE:虚拟机的可用区。

REST

使用 instances.update 方法。 使用您要分配的内部 IPv6 地址更新 networkInterfaces[].ipv6Address 属性。

例如:

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME
  {
    ...
    "networkInterfaces": [{
      "accessConfigs": [{
        "type": "ONE_TO_ONE_NAT",
        "name": "External NAT",
      }],
      "stackType": "IPV4_IPV6"
      "ipv6Address": "IPV6_ADDRESS",
      "internalIpv6PrefixLength": 96
      "subnetwork": "regions/REGION/subnetworks/SUBNETWORK",
    }],
    "disks": [{
      "autoDelete": "true",
      "boot": "true",
      "type": "PERSISTENT",
      "initializeParams": {
          "sourceImage": "projects/debian-cloud/global/images/v20150818"
      }
    }]
  }
 

请替换以下内容:

  • PROJECT_ID:虚拟机所属项目的 ID。
  • ZONE:要在其中创建虚拟机的可用区。
  • VM_NAME:虚拟机的名称。
  • IPV6_ADDRESS:要分配给虚拟机的内部 IPv6 地址。

    如果您指定内部 IPv6 地址资源的 URI 或 IPv6 地址范围作为 IPV6_ADDRESS 的值,则必须将 internalIpv6PrefixLength 的值留空。

管理静态内部 IP 地址

通过以下步骤,您可以管理虚拟机的静态内部 IP 地址:

确定内部 IPv4 或 IPv6 地址是临时地址还是静态地址

静态和临时内部 IP 地址的行为在大多数情况下看起来都相同。但是,对于静态内部 IP 地址,即使您删除并重新创建资源,也可以对同一资源使用相同的 IP 地址。通常,如果您停止或删除资源,临时 IP 地址会被释放。

如需确定地址是静态地址还是临时地址,请执行以下操作:

  1. 在 Google Cloud 控制台中,进入 IP 地址页面。

    进入“IP 地址”

  2. 在列表中找到地址,并查看类型列以获取 IP 地址类型。

取消分配静态内部 IPv6 地址

如需从虚拟机实例取消分配静态内部 IPv6 地址,您可以更新该实例的网络接口或删除分配了该地址的实例

当您取消分配内部 IPv6 地址时,系统会将其从资源中移除,但保留为项目预留的地址。您稍后可以将地址重新分配给其他资源。

如需从虚拟机实例取消分配静态内部 IPv6 地址,请完成以下步骤。

控制台

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

    进入“虚拟机实例”

  2. 点击要取消分配内部 IPv6 地址的实例的名称。
  3. 实例详情页面上,完成以下步骤:

    1. 点击修改
    2. 展开网络接口
    3. IP 栈类型字段中,选择 IPv4(单栈)
    4. 点击完成
  4. 点击保存

gcloud

使用 compute instances network-interfaces update 命令,并将 --stack-type 标志设置为 IPV4_ONLY

gcloud compute instances network-interfaces update VM_NAME \
    --network-interface NIC \
    --stack-type IPV4_ONLY \
    --zone ZONE

请替换以下内容:

  • VM_NAME:您要更新其网络接口的虚拟机的名称。
  • NIC:要更新的网络接口的名称。
  • ZONE:虚拟机的可用区。

检查静态内部 IPv6 地址目前是否可以使用,以及是否标记为 RESERVED 而非 IN_USE

gcloud compute addresses list \
    --filter="region=REGION AND name=NAME"

REST

更新内部 IPv6 地址关联的网络接口的实例栈类型。

  1. instances.updateNetworkInterface 方法发出 PATCH 请求。
  2. 在请求正文中,将 stackType 字段的值更新为 IPV4_ONLY

    例如:

    PATCH https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME/updateNetworkInterface
    {
      "networkInterfaces": [{
        ...
        "stackType" : "IPV4_ONLY"
        ...
        }]
    }
    

    请替换以下内容:

    • PROJECT_ID:虚拟机所属项目的 ID。
    • ZONE:要在其中创建虚拟机的可用区。
    • VM_NAME:虚拟机的名称。

释放静态内部 IP 地址

如果您不再需要某个静态外部 IPv4 或 IPv6 地址,可以通过删除 IP 地址资源来释放该 IP 地址。删除虚拟机的操作不会自动释放静态外部 IP 地址。如果您不再需要某些静态外部 IP 地址,必须手动释放这些地址。

如需释放静态内部 IP 地址,请参阅 VPC 文档中的释放静态内部 IPv4 或 IPv6 地址

后续步骤