预留静态内部 IP 地址

使用集合让一切井井有条 根据您的偏好保存内容并对其进行分类。

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

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

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

借助静态内部 IP 地址,您可以预留子网中所配置的 IP 范围内的内部 IP 地址,然后根据需要将这些预留的内部地址分配给资源。预留某个内部 IP 地址后,系统会将该地址从动态分配池中取出,并且不允许将其用于自动分配。保留静态内部 IP 地址需要特定的 IAM 权限,这样就只有授权用户才能保留静态内部 IP 地址。

由于可以预留静态内部 IP 地址,因此即使需要删除并重新创建资源,您也始终能够对同一资源使用相同的 IP 地址。

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

准备工作

权限

如需预留和管理静态内部 IP 地址,您需要获得 compute.networkAdmin 角色或以下一项或多项权限:

  • 针对该 IP 地址的 compute.addresses.create 权限
  • 针对该 IP 地址的 compute.addresses.createInternal 权限
  • 针对虚拟机实例的 compute.instances.update 权限
  • 该子网上的 compute.subnetworks.use 权限

限制

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

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

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

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

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

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

如何预留静态内部 IP 地址

您可以在创建相关资源之前保留静态内部 IP 地址,也可以使用临时内部 IP 地址来创建资源,然后将该临时 IP 地址提升为静态内部 IP 地址。

要使用静态内部 IP 地址,您必须为项目创建 VPC 网络。如需了解如何创建 VPC 网络,请参阅使用 VPC 网络

保留静态内部 IP 地址,然后将其与特定资源关联

在此情况下,您要单独保留静态内部 IP 地址,然后将其分配给资源。步骤概括如下:

  1. 从您的 VPC 网络创建子网

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

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

为资源指定临时内部 IPv4 或 IPv6 地址,然后升级该地址

在此场景下,您需要将仍与某资源关联的临时内部 IPv4 或 IPv6 地址升级为静态内部 IP 地址。

  1. 创建子网。对于 IPv6 地址,请创建双栈子网

  2. 使用自动分配的临时 IPv4 或 IPv6 地址或专门选择的 IPv4 地址来创建虚拟机实例或内部负载均衡器。

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

下图列出了这两种方法。

保留内部 IP 地址。

配置和管理静态内部地址

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

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

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

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

通过以下步骤,您可以配置和管理静态内部 IP 地址:

预留新的静态内部 IPv4 或 IPv6 地址

在预留新的静态内部 IP 地址之前,您必须先创建一个具有子网的 VPC 网络

如果要预留新的静态内部 IPv6 地址,则 VPC 网络必须具有 INTERNAL IPv6 访问类型的双栈子网

控制台

您可以使用 Google Cloud 控制台预留独立内部 IP 地址。

  1. 转到 VPC 网络页面。

    转到 VPC 网络页面

  2. 点击要在其中预留新静态 IP 的 VPC 网络。
  3. 点击静态内部 IP 地址,然后点击预留静态地址
  4. 输入此 IP 地址的名称
  5. 选择子网
  6. 如果要指定要预留的 IP 地址,请在静态 IP 地址,选择让我自行选择,然后填写自定义 IP 地址。否则,系统会自动为您分配子网中的 IP 地址。
  7. 如果您想在不同的前端共享此 IP,请选择用途下的共享
  8. 点击保留以完成此流程。

gcloud

  • 如需预留内部 IPv4 地址,请使用 gcloud CLI 并运行 compute addresses create 命令

    gcloud compute addresses create ADDRESS_NAME [ADDRESS_NAME..] \
        --region REGION --subnet SUBNETWORK \
        --addresses IP_ADDRESS
    

    请替换以下内容:

    • ADDRESS_NAME:要创建的一个或多个地址的所需名称。
    • REGION:此请求对应的区域。
    • SUBNETWORK:该内部 IP 地址所属的子网。
    • IP_ADDRESS:要预留的 IP 地址,它必须位于该子网的主要 IP 地址范围内。若未指定,则系统会自动从子网中分配 IP 地址。
  • 如需预留内部 IPv6 地址,请使用 gcloud CLI 并运行 compute addresses create 命令。 指定 IPV6 作为 --ip-version 的值。

    gcloud compute addresses create ADDRESS_NAME [ADDRESS_NAME..] \
        --region REGION --subnet SUBNETWORK \
        --ip-version IPV6
    

    请替换以下内容:

    • ADDRESS_NAME:要预留的一个或多个地址的所需名称。
    • REGION:此请求对应的区域。
    • SUBNETWORK:该内部 IPv6 地址所属的子网。

    与内部 IPv4 预留不同,内部 IPv6 预留不支持预留子网中的特定 IP 地址。系统会自动从子网的 /64 内部 IPv6 地址范围中分配 /96 内部 IPv6 地址。

示例

预留从子网中自动分配的内部 IPv4 地址:

gcloud compute addresses create example-address-1 \
    --region us-central1 --subnet subnet-1

预留子网中的特定 IPv4 地址:

gcloud compute addresses create example-address-1 \
    --region us-central1 --subnet subnet-1 --addresses 10.128.0.12

预留子网中的静态内部 IPv6 地址:

gcloud compute addresses create example-address-1 \
    --region us-central1 --subnet subnet-1 --ip-version IPV6

通过传递多个 IPv4 地址名称创建多个 IPv4 地址;所有地址都预留在同一子网中:

gcloud compute addresses create example-address-1 example-address-2 \
    --region us-central1 --subnet subnet-1 \
    --addresses 10.128.0.12,10.128.0.13

API

调用 addresses.insert 方法

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

请求正文必须包含 addressType(应为 INTERNAL)、地址的 name 以及 IP 地址所属的 subnetwork。您可让系统为您自动分配 IP 地址,也可指定特定 IP 地址的 address。该 IP 地址必须属于子网的主要 IP 地址范围。

{
  "addressType": "INTERNAL",
  "name": "ADDRESS_NAME",
  "subnetwork": "regions/REGION/subnetworks/SUBNETWORK",
  "address": "IP_ADDRESS"
}

例如:

POST https://compute.googleapis.com/compute/v1/projects/example-project/regions/us-central1/addresses

{
  "name": "example-address-1",
  "addressType": "INTERNAL",
  "subnetwork": "regions/us-central1/subnetworks/my-custom-subnet",
  "address": "10.128.0.12"
}

Terraform

您可以使用 Terraform 模块创建内部 IP 地址。

在以下示例中,Terraform 参数具有您可以更改的示例值。该示例会创建两个特定的内部 IP 地址:

module "address" {
  source     = "terraform-google-modules/address/google"
  version    = "~> 3.1"
  project_id = var.project_id # Replace this with your project ID in quotes
  region     = "asia-east1"
  subnetwork = "my-subnet"
  names      = ["internal-address1", "internal-address2"]
  addresses  = ["10.0.0.3", "10.0.0.4"]
}

以下示例会创建两个动态分配的内部 IP 地址:

module "address" {
  source     = "terraform-google-modules/address/google"
  version    = "~> 3.1"
  project_id = var.project_id # Replace this with your project ID in quotes
  region     = "asia-east1"
  subnetwork = "my-subnet"
  names      = ["internal-address1", "internal-address2"]
}

为 HA VPN over Cloud Interconnect 预留静态内部 IP 地址范围

您可以预留静态内部 IP 地址范围,以与 HA VPN over Cloud Interconnect 搭配使用。

为此,在创建静态内部 IP 地址时,您必须指定 --purpose=IPSEC_INTERCONNECT 标志和 26 到 29 之间的前缀长度 (--prefix-length)。

您预留的区域级内部 IPv4 地址将应用于 Cloud Interconnect 使用的高可用性 VPN 网关。

如需了解详情,请参阅将内部 IP 地址范围分配给高可用性 VPN 网关

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

静态和临时内部 IP 地址的行为在大多数情况下看起来都相同。如需确定地址是静态地址还是临时地址,请执行以下操作:

  1. 转到 IP 地址页面。

    转到“IP 地址”

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

将使用中的临时内部 IPv4 或 IPv6 地址升级为静态地址

如果您具有当前正在使用的临时 IP 地址,则可以将这些地址提升为静态内部 IP 地址,使其与您的项目一同保留,直到您主动将其移除。

控制台

如需使用控制台将临时内部 IP 地址升级为静态 IP 地址,请执行以下操作:

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

    进入“虚拟机实例”

  2. 点击要更改的虚拟机的名称。

  3. 在详情页面上,点击修改,然后执行以下操作:

    1. 网络接口部分中,点击网络接口以进行修改。
    2. 对于主要内部 IP,选择静态
    3. 填写静态 IP 地址的信息。
    4. 要保存更改,请点击预留
  4. 如需更新实例,请点击保存

gcloud

在升级现有内部临时 IPv6 地址之前,您需要知道该 IP 地址的值。

使用 gcloud CLI 向资源发出 describe 请求以获取 IP 地址值。

gcloud compute instances describe INSTANCE_NAME --zone ZONE | grep "networkIP"

gcloud CLI 会返回 networkIP 值,这就是资源正在使用的内部 IP 地址。

接下来,升级地址:

  • 如需升级一个或多个现有 IPv4 地址,请使用 compute addresses create 命令,并在 --addresses 标志中提供要升级的具体内部 IP 地址:

    gcloud compute addresses create ADDRESS_NAME_1 [ADDRESS_NAME_2..] \
        --addresses IP_ADDRESS_1,[IP_ADDRESS_2,..] \
        --region REGION \
        --subnet SUBNETWORK
    

    请替换以下内容:

    • ADDRESS_NAME:所需的地址名称。

      按照声明 IP 地址的顺序声明名称。在这种情况下,ADDRESS_NAME_1IP_ADDRESS_1 相对应,ADDRESS_NAME_2IP_ADDRESS_2 相对应。

    • IP_ADDRESS_1,[IP_ADDRESS_2,...]:要升级的 IP 地址,例如 10.128.1.9

    • REGION:要预留该地址的区域。

    • SUBNETWORK:此请求对应的子网。

  • 如需升级一个或多个现有 IPv6 地址,请使用 compute addresses create 命令,并在 --addresses 标志中提供明确的内部 IPv6 地址以及 --prefix-length=96 标志:

    gcloud compute addresses create ADDRESS_NAME_1 [ADDRESS_NAME_2..] \
        --addresses IP_ADDRESS_1,[IP_ADDRESS_2,..] \
        --prefix-length=96 \
        --region REGION \
        --subnet SUBNETWORK
    

    请替换以下内容:

    • ADDRESS_NAME:所需的地址名称。

      按照声明 IPv6 地址的顺序声明名称。在这种情况下,ADDRESS_NAME_1IP_ADDRESS_1 相对应,ADDRESS_NAME_2IP_ADDRESS_2 相对应。

    • IP_ADDRESS_1,[IP_ADDRESS_2,...]:要升级的 IP 地址。

    • REGION:要预留该地址的区域。

    • SUBNETWORK:此请求对应的子网。

    即使内部 IPv6 地址升级为静态内部 IPv6 地址,该地址仍然会附加到该实例。如果您需要将这个新升级的静态内部 IPv6 地址分配给另一个资源,请先从现有实例中取消分配该静态内部 IPv6 地址

API

调用 addresses.insert 方法

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

请求正文必须包含 addressType(应为 INTERNAL)、地址的 name、要升级的 address 以及 IP 地址所属的 subnetwork

{
  "addressType": "INTERNAL",
  "address": "IP_ADDRESS",
  "name": "ADDRESS_NAME",
  "subnetwork": "regions/REGION/subnetworks/SUBNETWORK"
}

例如:

POST https://compute.googleapis.com/compute/v1/projects/example-project/regions/us-central1/addresses

{
  "name": "example-address-1",
  "addressType": "INTERNAL",
  "address": "10.128.0.2",
  "subnetwork": "regions/us-central1/subnetworks/my-custom-subnet"
}

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

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

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

控制台

  1. 转到创建实例页面。

    转到“创建实例”

  2. 展开网络、磁盘、安全、管理、单独租用部分。

  3. 展开网络,然后执行以下操作:

    1. 网络接口部分中,展开网络接口以进行修改。
    2. (可选)在网络子网下,选择您要使用的网络和子网。
    3. 主要内部 IP 地址列表中,选择一个内部 IP 地址。
    4. 如需完成网络接口的修改,请点击完成
  4. 继续虚拟机创建过程。

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 alpha compute instances create VM_NAME
        --subnet SUBNETWORK
        --stack-type IPV4_IPV6
        --internal-ipv6-address INTERNAL_IPV6_ADDRESS
        --zone ZONE
    

    请替换以下内容:

    • VM_NAME:您要创建的虚拟机的名称。
    • SUBNETWORK:内部 IPv6 地址的子网。
    • ZONE:虚拟机的可用区。
    • INTERNAL_IPV6_ADDRESS/96 IPv6 地址、IP 地址名称或地址资源的 URI。

API

如需创建使用静态内部 IP 地址的虚拟机实例,请调用 instances.insert 方法并明确提供包含您要为该虚拟机分配的内部 IP 地址的 networkInterfaces[].networkIP 属性。

例如:

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": "IP_ADDRESS"
  }],
  "disks": [{
     "autoDelete": "true",
     "boot": "true",
     "type": "PERSISTENT",
     "initializeParams": {
        "sourceImage": "projects/debian-cloud/global/images/v20150818"
     }
   }]
 }

请替换以下内容:

  • PROJECT_ID:要在其中创建虚拟机的项目的 ID
  • ZONE:要在其中创建虚拟机的可用区
  • VM_NAME:虚拟机的名称
  • IP_ADDRESS:要分配给虚拟机的 IP 地址

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

创建具有静态内部 IPv4 地址的内部负载均衡器

如需创建使用静态内部 IP 地址的内部负载均衡器,请按照以下部分中的说明进行操作:

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

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

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

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

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

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

  1. 预留静态内部 IPv4 地址
  2. 使用 compute instances network-interfaces update 命令添加新的内部 IPv6 地址。

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

    请替换以下内容:

    • VM_NAME:您要创建的虚拟机的名称。
    • NIC:要更新的网络接口的名称。
    • IPV6_ADDRESS:要分配给接口的 IPv6 地址。
    • ZONE:虚拟机的可用区。

取消分配静态内部 IPv6 地址

您可以取消分配静态内部 IPv6 地址,只需更新实例的网络接口或删除分配了该地址的实例即可。

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

如需从实例中取消分配静态内部 IPv6 地址,请执行以下操作:

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

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

    请替换以下内容:

    • VM_NAME:您要更新其网络接口的虚拟机的名称。
    • NIC:要更新的网络接口的名称。
    • ZONE:虚拟机的可用区。
  2. 检查静态内部 IPv6 地址目前是否可以使用,以及是否标记为 RESERVED 而非 IN_USE

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

通过共享 VPC 使用静态内部 IPv4 或 IPv6 地址

可在共享的 VPC 网络的共享子网中创建预留的静态内部 IP 地址。即使 IP 地址的值来自共享 VPC 网络的所选共享子网中的可用 IP 地址范围,IP 地址对象本身也需与使用该对象的资源在同一服务项目中创建。要详细了解此用例,请参阅以下页面:

列出静态内部 IPv4 或 IPv6 地址

在 Google Cloud 控制台中,您可以查看所选 VPC 的静态内部 IP 地址。如需查看所有现有静态 IP 地址(包括外部 IP 地址和内部 IP 地址),请运行 addresses list 或向 API 发出 GET 请求。

控制台

  1. 转到 VPC 网络页面。

    转到 VPC 网络页面

  2. 点击您要查看的 VPC 网络。
  3. 点击管理内部 IP 地址以查看此 VPC 中所有保留的静态内部 IP 地址。

gcloud

使用 compute addresses list 命令列出所有静态 IP 地址,包括外部 IP 地址和内部 IP 地址。

gcloud compute addresses list

API

调用 addresses.list 方法

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

请替换以下内容:

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

如需列出所有地区的所有地址,请调用 aggregatedList 方法

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

删除静态内部 IPv4 或 IPv6 地址

如果您不再需要某个静态内部 IP 地址,可将其删除。无论其他资源当前是否正在使用某个地址,您都可以删除该地址。如果地址正在由某一资源使用,则该地址仍将挂接到该资源,直到该资源被删除;删除后,地址会返回到其他项目的可用地址池中。

控制台

  1. 转到 VPC 网络页面。

    转到 VPC 网络页面

  2. 找到包含要发布的 IP 的 VPC 网络,然后点击其名称。
  3. 点击来自内部 IP 地址
  4. 选择要发布的 IP 地址。
  5. 点击发布,然后在弹出的消息上点击发布以确认此操作。

gcloud

使用 gcloud CLI 运行 compute addresses delete 命令

gcloud compute addresses delete ADDRESS_NAME \
    --region REGION

请替换以下内容:

  • ADDRESS_NAME:要删除的地址的名称。
  • REGION:地址所属的区域。

例如:

gcloud compute addresses delete example-address-to-delete \
    --region us-west1

API

调用 addresses.delete 方法

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

例如,要删除 us-west1 区域中的地址,请运行以下命令:

DELETE https://compute.googleapis.com/compute/v1/projects/myproject/regions/us-west1/addresses/example-address-to-delete

后续步骤