保留静态内部 IP 地址

本页面介绍如何配置和管理资源的静态主要内部 IP 地址,包括:

  • 保留并分配静态内部 IP 地址
  • 将临时内部 IP 地址提升为静态内部 IP 地址

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

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

静态内部 IP 提供以下功能:对于在子网中配置的专用 RFC 1918 IP 范围,保留其中的内部 IP 地址,然后根据需要将所保留的内部地址分配给资源。如果保留内部 IP 地址,会将该地址从动态分配池中取出,并且阻止将其用于自动分配。保留静态内部 IP 地址需要特定的 IAM 权限,这样就只有授权用户才能保留静态内部 IP 地址。

通过保留静态内部 IP 地址这一功能,即使必须删除并重新创建资源,您都始终能够对同一资源使用相同的 IP 地址。

本文档未介绍如何保留和管理外部 IP 地址。如需了解详情,请参阅保留静态外部 IP 地址

准备工作

权限

要保留和管理静态内部 IP 地址,您需要具备 compute.networkAdmin 角色。如需详细了解角色,请参阅 Compute Engine IAM 角色

限制

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

  • 默认情况下,每个区域最多只能保留 200 个静态内部 IP 地址。

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

  • 将 IP 地址分配给资源后,无法分辨该地址是静态的还是临时的,除非将其与为该项目保留的静态内部 IP 地址列表进行比对。要查看项目可用的静态内部 IP 地址列表,请使用 addresses list 子命令。

  • 只有 VPC 网络支持保留静态内部 IP 地址。传统模式网络不支持此操作。

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

如何保留静态内部 IP 地址

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

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

保留特定地址,然后将其与特定资源关联

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

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

  2. 保留子网 IP 范围中的一个内部 IP 地址。此步骤将创建一个内部 IP 地址资源,它包含该特定内部 IP 地址。

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

为资源指定临时内部 IP 地址,然后提升该地址

在此情况下,您要将附加到资源的临时内部 IP 地址提升为静态内部 IP 地址。

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

  2. 创建子网。

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

下图列出了这两种方法。

内部 IP 保留图表

保留新的静态内部 IP 地址

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

要保留新的静态内部 IP 地址(无论是自动分配的地址还是现有子网中未使用的地址),可使用 Console、gcloud compute addresses create 命令或 Compute Engine API 中的 addresses.insert 方法。

Console

  1. 转到 GCP Console 中的“VPC 网络”页面。

    转到“VPC 网络”页面

  2. 确定要与实例关联的 VPC 网络。
  3. 转到“虚拟机实例”页面。

    转到“虚拟机实例”页面

  4. 选择您的项目。
  5. 点击创建实例并为实例指定名称。
  6. 选择您的 VPC 网络所在的区域
  7. 在该区域内选择一个地区
  8. 填写实例的其他字段。
  9. 展开管理、安全、磁盘、网络、单独租用菜单。
  10. 点击网络
  11. 点击网络接口进行修改。
  12. 网络下,选择您创建的 VPC 网络。
  13. 选择子网。
  14. 主要内部 IP 下选择保留静态 IP 地址
  15. 完成其余的网络选项。
  16. 点击完成
  17. 填写实例要求。
  18. 点击创建

gcloud

使用 gcloud 工具运行 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 地址,请使用以下命令:

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

要保留子网中的特定内部 IP 地址,请使用以下命令:

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

您可以通过传递多个地址名称来创建多个地址。但是,所有地址都将保留在同一子网中。例如:

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

在 API 中,对以下网址发出 POST 请求:

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

请求的主体必须包含应为 INTERNALaddressType、地址的 name 以及 IP 地址所属的 subnetwork。您可让系统在子网中为您自动分配 IP 地址,也可自行指定特定 IP 地址的 address

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

例如:

POST https://www.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"
}

将使用中的临时内部 IP 地址提升为静态地址

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

在保留现有 IP 地址之前,您需要具备要提升的 IP 地址的值。请向资源发出 describe 请求以获取 IP 地址。例如,如果要提升虚拟机实例当前正在使用的 IP 地址,请使用以下命令:

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

gcloud 工具返回 networkIP 值,它就是资源正在使用的内部 IP。例如:

networkIP: 10.240.0.2

接下来,提升地址。

Console

要在 Console 中将临时内部 IP 地址提升为静态 IP 地址,请执行以下操作:

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

    转到“虚拟机实例”页面

  2. 选择您的项目。
  3. 选择要更改的实例。
  4. 点击页面顶部的修改工具。
  5. 点击网络接口的修改工具。
  6. 内部 IP 类型下,选择静态
  7. 填写静态 IP 地址的信息。
  8. 点击完成以保存更改。
  9. 点击保存以更新实例。

gcloud

要提升一个或多个现有 IP 地址,请使用 compute addresses create 命令,并提供带有要提升的显式内部 IP 的 --addresses 标志:

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_1][IP_ADDRESS_1] 相对应,而 [ADDRESS_NAME_2][IP_ADDRESS_2] 相对应。
  • [IP_ADDRESS],[[IP_ADDRESS_2],...] 是要提升的 IP 地址,例如 10.128.1.9
  • [REGION] 是要保留该地址的区域。
  • [SUBNETWORK] 是该请求的子网。

例如:

gcloud compute addresses create example-address-1 example-address-2 \
    --addresses 10.128.4.90,10.128.0.232 \
    --region us-central1 \
    --subnet subnet-1

API

在 API 中,对以下网址发出 POST 请求:

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

请求的主体必须包含应为 INTERNALaddressType、地址的 name、要提升的 address,以及 IP 地址所属的 subnetwork

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

例如:

POST https://www.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"
}

创建包含静态内部 IP 地址的虚拟机实例

创建新的虚拟机时,可以分配所保留的静态内部 IP 地址。

Console

  1. 在 GCP Console 中,转到“虚拟机实例”页面。

    转到“虚拟机实例”页面

  2. 点击创建实例
  3. 创建新实例页面上,为实例填写所需的属性。
  4. 展开管理、安全、磁盘、网络、单独租用部分。
  5. 点击网络
  6. 点击网络,然后选择您的子网。
  7. 点击网络接口下的修改工具。
  8. 主要内部 IP 下选择保留静态内部 IP 地址。
  9. 填写保留静态内部 IP 地址所需的信息。
  10. 点击创建以创建实例。

gcloud

  1. 首先,保留一个静态内部 IP 地址。以下示例将在 us-central1 区域中保留地址 my-vm-ip-address。由于命令省略了 --addresses 标志,因此 Compute Engine 会保留一个随机 IP 地址:

    gcloud compute addresses create my-vm-ip-address \
        --region us-central1 --subnet my-subnet
    
  2. 接下来,在创建实例时使用该地址。例如:

    gcloud compute instances create my-instance \
        --image-family [IMAGE_FAMILY] \
        --image-project [IMAGE_PROJECT] \
        --private-network-ip my-vm-ip-address \
        --subnet my-subnet
    

创建包含静态内部 IP 地址的内部负载平衡器

要创建使用静态内部 IP 地址的内部负载平衡器,请按照设置内部负载平衡说明进行操作,但在配置负载平衡器时,请改为提供保留的 IP 地址。

  1. 首先,保留新的静态内部 IP 地址。例如,以下示例将在 us-central1 区域中保留地址 my-ilb-ip-address。由于命令省略了 --addresses 标志,因此 Compute Engine 会保留一个随机 IP 地址:

    gcloud compute addresses create my-ilb-ip-address \
        --region us-central1 --subnet my-subnet
    
  2. 接下来,在创建转发规则时包含 --address 标志。例如:

    gcloud compute forwarding-rules create my-int-lb-forwarding-rule \
        --address my-ilb-ip-address \
        --load-balancing-scheme internal \
        --backend-service my-int-lb \
        --ports 80 \
        --region us-central1 \
        --subnet my-subnet
    

为次要网络接口使用静态内部 IP 地址

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

要为次要网络接口分配静态内部 IP 地址,请执行以下操作:

  1. 首先,保留一个静态内部 IP 地址。例如,以下示例将在 us-central1 区域中保留地址 my-second-ip-address。由于命令省略了 --addresses 标志,因此 Compute Engine 会保留一个随机 IP 地址:

    gcloud compute addresses create my-second-ip-address \
        --region us-central1 --subnet subnet-b
    
  2. 创建虚拟机实例时,将该地址用作次要接口的 IP 地址。例如:

    gcloud compute instances create my-instance \
        --image-family [IMAGE_FAMILY] \
        --image-project [IMAGE_PROJECT] \
        --network-interface subnet=subnet-a,no-address \
        --network-interface \
          subnet=subnet-b,private-network-ip=my-second-ip-address,no-address
    

通过共享 VPC 使用静态内部 IP

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

删除静态内部 IP 地址

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

Console

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

    转到“虚拟机实例”页面

  2. 选择您的项目。
  3. 从项目列表中选择虚拟机实例。
  4. 选择页面顶部的修改工具。
  5. 点击网络接口的修改工具。
  6. 内部 IP 类型静态更改为临时
  7. 选择释放以释放静态 IP 地址。
  8. 点击完成以保存更改。

    您的实例将继续使用静态 IP 地址,直到该实例被删除或重新启动。发生这种情况后,该 IP 地址将归还到子网的默认可用内部 IP 地址池中。

gcloud

使用 gcloud 工具运行 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

在 API 中,对以下网址发出 DELETE 请求:

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

例如,要删除 us-west1 区域中的地址,请发出以下请求:

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

后续步骤

此页内容是否有用?请给出您的反馈和评价:

发送以下问题的反馈:

此网页
Compute Engine 文档