预留静态内部 IP 地址

本页面介绍了如何在 Virtual Private Cloud (VPC) 网络中预留和管理静态内部 IPv4 或 IPv6 地址。

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

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

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

准备工作

  • 了解 IP 地址
  • 如果您尚未设置身份验证,请进行设置。 身份验证是通过其进行身份验证以访问 Google Cloud 服务和 API 的过程。如需从本地开发环境运行代码或示例,您可以按如下方式进行身份验证。

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

    控制台

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

    gcloud

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

    gcloud init

    Terraform

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

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

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

      gcloud auth application-default login

    如需了解详情,请参阅 Google Cloud 身份验证文档中的为本地开发环境设置身份验证

    REST

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

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

      gcloud init

所需的角色

如需获得预留和管理静态 IP 地址所需的权限,请让您的管理员为您授予项目的 Compute Network Admin (roles/compute.networkAdmin) IAM 角色。如需详细了解如何授予角色,请参阅管理访问权限

此预定义角色可提供预留和管理静态 IP 地址所需的权限。如需查看所需的确切权限,请展开所需权限部分:

所需权限

预留和管理静态 IP 地址需要以下权限:

  • 针对该 IP 地址的 compute.addresses.create 权限
  • 针对该 IP 地址的 compute.addresses.createInternal 权限
  • 针对网络的 compute.networks.list 权限
  • 针对子网的 compute.subnetworks.use 权限
  • 针对子网的 compute.subnetworks.list 权限

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

限制

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

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

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

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

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

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

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

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

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

如果要预留新的静态内部 IPv6 地址,VPC 网络必须启用 ULA 内部 IPv6 范围。此外,它还必须有具有 INTERNAL IPv6 访问权限类型的双栈子网

如需预留独立的内部 IP 地址,请完成以下步骤。

控制台

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

    转到“IP 地址”

  2. 点击预留内部静态 IP 地址
  3. 名称字段中,输入 IP 地址名称。
  4. IP 版本列表中,选择所需的 IP 版本:
    • 如需预留静态内部 IPv4 地址,请选择 IPv4
    • 如需预留静态内部 IPv6 地址,请选择 IPv6
  5. 网络子网列表中,分别选择 VPC 网络和子网。
  6. 指定您要预留 IP 地址的方式:
    • 对于 IPv4 地址,如需指定要预留的静态内部 IPv4 地址,在静态 IP 地址字段中,选择让我选择,然后输入自定义 IP 地址。否则,系统会自动为您分配子网中的静态内部 IPv4 地址。
    • 对于 IPv6 地址,系统会自动从子网的内部 IPv6 地址范围中分配一个静态内部 IPv6 地址。
  7. 可选:如果您要在不同前端中共享静态内部 IPv4 地址,请在用途列表中选择共享。默认选择非共享

  8. 点击预留

gcloud

  • 如需预留内部 IPv4 地址,请使用 compute addresses create 命令

    gcloud compute addresses create ADDRESS_NAMES \
        --region REGION --subnet SUBNETWORK \
        --addresses IP_ADDRESS
    

    请替换以下内容:

    • ADDRESS_NAMES:您要创建的一个或多个 [--purpose=SHARED_LOADBALANCER_VIP] 地址的名称。对于多个地址,请将所有地址指定为列表(以空格分隔),例如 example-address-1 example-address-2 example-address-3
    • REGION:此请求对应的区域。
    • SUBNETWORK:该内部 IP 地址所属的子网。
    • IP_ADDRESS:要预留的 IP 地址,它必须位于该子网的主要 IP 地址范围内。若未指定,则系统会自动从子网中分配 IP 地址。
  • 如需预留内部 IPv6 地址,请使用 compute addresses create 命令。指定 IPV6 作为 --ip-version 的值:

    gcloud compute addresses create ADDRESS_NAMES \
        --region REGION --subnet SUBNETWORK \
        --ip-version IPV6
    

    请替换以下内容:

    • ADDRESS_NAMES:您要预留的一个或多个地址的名称。对于多个地址,请将所有地址指定为列表(以空格分隔),例如 example-address-1 example-address-2 example-address-3
    • 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
    

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"]
}

API

使用 addresses.insert 方法

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

对于 IPv4 和 IPv6 地址,请求正文都必须包含 addressType 字段(应为 INTERNAL)、地址的 name,以及 IP 地址所属的 subnetwork。请求正文可以选择包含内部 IP 地址的 purpose

此外,对于内部 IPv4 地址,您可让系统为您自动分配 IP 地址,也可使用 address 指定内部 IPv4 地址。该 IPv4 地址必须属于子网的主要 IP 地址范围。

{
  "addressType": "INTERNAL",
  "name": "IPV4_ADDRESS_NAME",
  "subnetwork": "regions/REGION/subnetworks/SUBNETWORK",
  "address": "IPV4_ADDRESS"
  "purpose": "GCE_ENDPOINT"
}

例如:

POST https://compute.googleapis.com/compute/v1/projects/example-project/regions/us-central1/addresses
{
  "addressType": "INTERNAL",
  "name": "example-ipv4-address-1",
  "subnetwork": "regions/us-central1/subnetworks/my-custom-subnet",
  "address": "10.128.0.12"
  "purpose": "GCE_ENDPOINT"
}

对于内部 IPv6 地址,您还需要将 ipVersion 指定为 IPV6。系统会自动从子网的内部 IPv6 地址范围中分配一个静态内部 IPv6 地址。

{
  "addressType": "INTERNAL",
  "name": "IPV6_ADDRESS_NAME",
  "ipVersion": "IPV6",
  "subnetwork": "regions/REGION/subnetworks/SUBNETWORK",
  "purpose": "GCE_ENDPOINT"
}

例如:

POST https://compute.googleapis.com/compute/v1/projects/example-project/regions/us-central1/addresses
{
  "addressType": "INTERNAL",
  "name": "example-ipv6-address-1",
  "ipVersion": "IPV6"
  "subnetwork": "regions/us-central1/subnetworks/my-custom-subnet",
  "purpose": "GCE_ENDPOINT"
}

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

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

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

    进入“IP 地址”

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

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

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

如需将临时内部 IP 地址提升为静态内部 IP 地址,请完成以下步骤。

控制台

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

    转到“IP 地址”

  2. 点击内部 IP 地址
  3. 可选:在过滤条件字段中,搜索要提升的临时 IP 地址。
  4. 在要提升的 IP 地址的更多操作菜单 () 中,选择提升为静态 IP 地址
  5. 输入新静态 IP 地址的名称,然后点击预留

gcloud

  1. 在提升现有的临时内部 IPv6 地址之前,您需要知道该 IP 地址的值。使用 Google Cloud CLI 向资源发出 describe 请求以获取 IP 地址值。

    • 对于具有 IPv4 地址的虚拟机,请使用以下命令:

      gcloud compute instances describe INSTANCE_NAME --zone ZONE | grep "networkIP"
      
    • 对于具有 IPv6 地址的虚拟机,请使用以下命令:

      gcloud compute instances describe INSTANCE_NAME --zone ZONE | grep "ipv6Address"
      
    • 对于区域级转发规则,请使用以下命令:

      gcloud compute forwarding-rules describe FORWARDING_RULE_NAME --region REGION | grep "IPAddress"
      

      对于全球转发规则,请改用 --global 标志。

  2. 提升地址:

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

      gcloud compute addresses create IPV4_ADDRESS_NAMES \
        --addresses IPV4_ADDRESSES \
        --region REGION \
        --prefix-length PREFIX_LENGTH \
        --subnet SUBNETWORK
      

      请替换以下内容:

      • IPV4_ADDRESS_NAMES:IPv4 地址的名称。对于多个地址,将所有地址名称指定为列表,并以空格分隔,例如 example-address-name-1 example-address-name-2 example-address-name-3。按照声明 IP 地址的顺序声明名称。 例如,假设您将地址名称指定为 example-address-name-1 example-address-name-2 example-address-name-3,并将 IPv4 地址指定为 192.0.2.0 192.0.2.1 192.0.2.2。在这种情况下,Compute Engine 会通过以下方式映射名称和地址:

        • example-address-name-1192.0.2.0
        • example-address-name-2192.0.2.1
        • example-address-name-3192.0.2.2
      • IPV4_ADDRESSES:要提升的 IPv4 地址。对于多个地址,请将所有地址指定为列表(以空格分隔),例如 192.0.2.0 192.0.2.1 192.0.2.2

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

      • PREFIX_LENGTH:可选。IPv4 地址范围的前缀长度。该值必须是 7 到 31 之间的整数。仅在您指定地址范围时添加此字段。如果指定的 IPv4 地址是单个 IP 地址,则排除该字段。

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

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

      gcloud compute addresses create IPV6_ADDRESS_NAMES \
       --addresses IPV6_ADDRESSES \
       --region REGION \
       --prefix-length PREFIX_LENGTH \
       --subnet SUBNETWORK
      

      替换以下内容:

      • IPV6_ADDRESS_NAMES:地址的名称。按照声明 IPv6 地址的顺序声明名称。在这种情况下,IPV6_ADDRESS_NAME_1IPV6_ADDRESS_1 相对应,IPV6_ADDRESS_NAME_2IPV6_ADDRESS_2 相对应。
      • IPV6_ADDRESS_1,[IPV6_ADDRESS_2,...]:要提升的 IPv6 地址(CIDR 格式)。
      • PREFIX_LENGTH_1,[PREFIX_LENGTH_2,...]:IPv6 地址的前缀长度。
      • REGION:要预留该地址的区域。
      • SUBNETWORK:此请求对应的子网。

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

API

使用 addresses.insert 方法

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

对于 IPv4 和 IPv6 地址,请求正文都必须包含 addressType(应为 INTERNAL)、地址的 name、要提升的 address,以及 IP 地址所属的 subnetwork。此外,对于 IPv6 地址,请求正文必须包含 prefixLength,并且值为 96

  • 用于提升内部 IPv4 地址的请求正文:

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

    例如:

    POST https://compute.googleapis.com/compute/v1/projects/example-project/regions/us-central1/addresses
    {
    "name": "example-IPv4-address-1",
    "addressType": "INTERNAL",
    "address": "10.128.0.2",
    "subnetwork": "regions/us-central1/subnetworks/my-custom-subnet"
    }
    
  • 用于提升内部 IPv6 地址的请求正文:

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

    例如:

    POST https://compute.googleapis.com/compute/v1/projects/example-project/regions/us-central1/addresses
    {
    "name": "example-IPv6-address-1",
    "addressType": "INTERNAL",
    "address": "fd20:0:0::",
    "subnetwork": "regions/us-central1/subnetworks/my-custom-subnet"
    "prefixLength": 96
    }
    

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

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

列出静态内部 IPv4 或 IPv6 地址

如需查看所有现有静态内部 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

释放静态内部 IPv4 或 IPv6 地址

如果您不再需要某个静态内部 IP 地址,可以通过删除 IP 地址资源来释放该 IP 地址。

如果您使用 Google Cloud 控制台,则只有在静态 IP 地址未被其他资源使用时,才能释放该地址。

如果您使用 gcloud CLI 或 API,则无论 IP 地址是否正被其他资源使用,都可以释放该 IP 地址。

  • 如果 IP 地址未被资源使用,则会返回到可用内部 IP 地址池中。

  • 如果 IP 地址正在被资源使用,则在资源被删除前,该 IP 地址会一直与该资源关联。

如需释放静态内部 IPv4 或 IPv6 地址,请完成以下步骤。

控制台

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

    转到“IP 地址”

  2. 点击内部 IP 地址
  3. 选择要释放的静态内部 IP 地址。
  4. 点击释放静态地址,然后点击对话框中的释放以确认此操作。

    如果您没有看到此选项,请点击顶部菜单栏中的更多操作菜单 (),然后从列表中选择释放静态地址

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

使用 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

后续步骤