配置专用服务访问通道

专用服务访问通道是一种专用连接,将您的 VPC 网络与 Google 或第三方拥有的网络连接起来。Google 或第三方是提供服务的实体,亦称为服务提供方。通过专用连接,您的 VPC 网络中的虚拟机实例和您访问的服务可以使用内部 IP 地址进行专有的通信。虚拟机实例不需要接入互联网或具备外部 IP 地址,通过专用服务访问通道即可访问可用服务。

如需详细了解专用服务访问通道和其他专用访问选项,请参阅服务的专用访问选项

概括来讲,若要使用专用服务访问通道,您必须在 VPC 网络中分配一个 IP 地址范围(CIDR 块),然后创建连接到服务提供方的专用连接

准备工作

如需建立专用连接,请先满足以下前提条件:

  • 检查以确认您使用的服务支持专用服务访问通道。
  • 您必须有一个用于接入服务提供方网络的 VPC 网络。虚拟机实例必须使用此 VPC 网络通过专用连接接入服务。
  • 在项目中激活 Service Networking API。创建专用连接必须使用此 API。
  • 创建 Google Cloud 项目或选择现有项目。如需了解如何创建 Google Cloud 项目,请参阅创建和管理项目
  • 如果您要运行本指南中的 gcloud 命令行示例,请安装 gcloud CLI

权限

拥有 Compute Network Admin 角色 (roles/compute.networkAdmin) 的项目所有者和 IAM 成员可以创建分配的 IP 地址范围并管理专用连接。

如需详细了解角色,请参阅 VPC IAM 角色文档。

共享 VPC 场景

如果您在使用共享 VPC,请在宿主项目中创建分配的 IP 范围和专用连接。这些任务通常必须由宿主项目中的网络管理员执行。设置好宿主项目之后,服务项目中的虚拟机实例即可使用专用连接。

配额和限制

由于专用连接是采用 VPC 对等连接形式实现的,因此适用于 VPC 网络对等连接的配额和限制同样适用于专用服务访问通道。

为服务分配的 IP 地址范围

创建专用连接之前,您必须分配 IPv4 地址范围以供服务提供方的 VPC 网络使用。这能确保您的 VPC 网络与服务提供方的网络不发生 IP 地址冲突。请为每个服务提供方创建一个分配范围。

在您的 VPC 网络中分配范围时,该范围不适用于子网(主要范围和次要范围)和自定义静态路由的目标。

不支持将 IPv6 地址范围与专用服务访问通道结合使用。

IP 地址范围大小

专用服务访问通道范围(点击可放大)

服务提供方在其连接端创建子网时,系统将从已分配地址范围中选择一个尚未使用的范围,以此作为该子网的 IP 地址范围。

每个服务提供方都需要满足最低限度的 IP 地址范围大小要求。Google 规定最小需要一个 /24 块(256 个地址),但建议使用一个 /16 块(65536 个地址)。

您选择的大小取决于多种因素,例如:

  • 您使用的服务和区域的数量。
  • 您所使用的服务的要求。
    • 服务的最小 IP 地址范围大小。
    • 服务提供商是否需要为您创建的服务的每个实例提供单独的 IP 地址范围,或者能否对服务的多个实例使用相同的 IP 地址范围。

如果没有连续的 /16 块,您可以从较小的分配范围开始,在之后需要更多 IP 地址时添加新的分配范围

关于服务提供方的子网

建立专用连接并创建使用专用 IP 地址的资源时,该服务会创建一个子网,用于预配资源。该服务从已分配的范围中选择一个可用 IP 地址范围。您不能选择或修改服务提供方的子网 IP 地址范围。仅当您删除子网中的所有资源时,服务才会删除子网。

在您预配其他资源时,服务会在其先前创建的现有区域子网中执行预配。如果子网已满,该服务会在该区域中新建一个子网。

注意事项

分配 IP 地址范围之前,请考虑以下限制:

  • 选择的范围不能与现有分配的范围、子网或自定义静态路由重叠。任何两个范围都不可以重叠。
  • 选择与您的其他 IP 地址需求不冲突的范围:
    • 某些 Google 和第三方产品使用 172.17.0.0/16 在客机操作系统中进行路由。例如,默认 Docker 网桥网络会使用此范围。如果您依赖的产品使用 172.17.0.0/16,请不要在专用服务访问通道分配的范围内使用 172.17.0.0/16
    • 如果您使用的是自动模式 VPC 网络,则不能创建与 10.128.0.0/9 匹配或重叠的分配范围。Google 会为自动创建的子网(包括未来区域中的子网)使用 10.128.0.0/9 范围。
  • 选择足够大的 CIDR 块以满足您当前和未来的需求。如果您后续发现范围不够大,请尽可能扩展范围。尽管您可以为一个服务提供方进行多次分配,但 google 会通过配额来限制您可以分配的 IP 地址范围数量,而非每个范围的大小(网络掩码)。
  • 如果您向某个专用连接添加额外的分配范围,它会扩展在为服务提供方提供的任何服务创建新服务资源时可用的 IP 地址范围。您无法在专用连接中预留特定的分配范围供特定服务使用。
  • 请勿将相同的分配范围重复用于多个服务提供方。虽然可以这样做,但这可能导致 IP 地址重叠。每个服务提供方只能看到他们自己的网络,而无法确定其他服务提供方正在使用哪些 IP 地址。
  • 创建分配范围时,您只能将一个 CIDR 块分配给该分配范围。当需要扩展 IP 地址范围时,您无法向分配范围中添加其他块。但是,您可以创建其他分配范围,或使用包含新范围和现有范围的更大的块来重新创建现有分配范围。
  • 如果您自行创建分配而非让 Google 负责创建(例如通过 Cloud SQL),则可以使用相同的命名约定,让其他用户或 Google 服务知道,您已为 Google 服务分配了一个地址范围。在 Google 服务代表您分配范围时,会使用这样的命名格式:google-managed-services-[your network name]。如果已存在此分配,Google 服务将使用现有分配,而不会再创建另一个。
  • 由于专用连接作为 VPC 网络对等互连连接而实现,因此对等互连连接的行为和限制条件也适用于专用连接,例如 VPC 网络对等互连的限制
  • 如果您计划更改使用 VPC 的现有服务实例的内部 IP 地址,需考虑此操作是否可能会中断服务,例如是否需要删除并重新创建服务实例。如需了解详情,请查看关联的代管式服务的相关文档。例如,如果您使用的是 Cloud SQL,请参阅更改现有 Cloud SQL 实例的专用 IP 地址

创建 IP 分配

以下步骤描述了如何创建分配的 IP 地址范围。

控制台

  1. 在 Google Cloud 控制台中,转到 VPC 网络页面。

    进入 VPC 网络页面

  2. 选择将连接到服务提供方的 VPC 网络。

  3. 选择专用服务连接标签页。

  4. 专用服务连接标签页中,选择为服务分配的 IP 范围标签页。

  5. 点击分配的 IP 范围 (Allocated IP range)。

  6. 输入分配的范围的名称描述

  7. 指定分配的 IP 范围

    • 如需指定 IP 地址范围,请选择自定义,然后输入 CIDR 地址块,例如 192.168.0.0/16
    • 如需指定前缀长度并让 Google 选择可用地址范围,请选择自动,然后输入前缀长度,例如 16
  8. 点击分配以创建分配的范围。

gcloud

要在您的 VPC 网络中创建分配的范围,请使用 addresses create 命令

  • 如需指定地址范围和前缀长度(子网掩码),请使用 addressesprefix-length 标志。例如,若要分配 CIDR 块 192.168.0.0/16,请将地址指定为 192.168.0.0,并将前缀长度指定为 16

    gcloud compute addresses create RESERVED_RANGE_NAME \
        --global \
        --purpose=VPC_PEERING \
        --addresses=192.168.0.0 \
        --prefix-length=16 \
        --description="DESCRIPTION" \
        --network=VPC_NETWORK
    
  • 若只指定前缀长度(子网掩码),请仅使用 prefix-length 标志。如果您省略地址范围,则 Google Cloud 会自动选择您的 VPC 网络中未使用的地址范围。以下示例选择的是前缀长度为 16 位的未使用的 IP 地址范围。

    gcloud compute addresses create RESERVED_RANGE_NAME \
        --global \
        --purpose=VPC_PEERING \
        --prefix-length=16 \
        --description="DESCRIPTION" \
        --network=VPC_NETWORK
    

请替换以下内容:

  • RESERVED_RANGE_NAME:已分配范围的名称,例如 my-allocated-range

  • DESCRIPTION:对该范围的描述,例如 allocated for my-service

  • VPC_NETWORK:您的 VPC 网络的名称,例如 my-vpc-network

以下示例展示了如何创建与 Google 的专用连接,以便 my-network VPC 网络中的虚拟机实例可以使用专用服务访问通道来访问支持专用连接的 Google 服务。

gcloud compute addresses create google-managed-services-my-network \
    --global \
    --purpose=VPC_PEERING \
    --prefix-length=16 \
    --description="peering range for Google" \
    --network=my-network

Terraform

要在您的 VPC 网络中创建分配的范围,请使用 google_compute_global_address 资源

resource "google_compute_global_address" "private_ip_address" {
  name          = "private-ip-address"
  purpose       = "VPC_PEERING"
  address_type  = "INTERNAL"
  prefix_length = 16
  network       = google_compute_network.peering_network.id
}

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

如果您看到有关项目的 compute.globalAddresses.list 权限的错误,请参阅服务账号权限

列出分配的 IP 地址范围

如需列出分配的 IP 地址范围,请使用 addresses list 命令

gcloud compute addresses list --global --filter="purpose=VPC_PEERING"

创建专用连接

创建分配范围后,您可以创建到服务提供方的专用连接。专用连接在您的 VPC 网络和服务提供方的网络之间建立 VPC 网络对等互连连接。

专用连接在您的 VPC 网络与服务提供方之间提供一对一关联。如果某个服务提供方提供多种服务,您只需一个专用连接就能获得提供方的所有服务。

如果某个服务提供方提供多种服务,并且您希望控制将哪些分配范围用于不同的服务资源,则可以使用多个 VPC 网络,每个网络都有自己的专用连接。此配置允许您在创建新的代管式服务资源时选择特定网络,以确保关联的分配范围用于新资源。

如果您连接到多个服务提供方,请为每个服务提供方使用唯一的分配。此做法有助于您管理各个服务提供方的网络设置,例如路由和防火墙规则。

控制台

  1. 在 Google Cloud 控制台中,转到 VPC 网络页面。

    进入 VPC 网络页面

  2. 选择将连接到服务提供方的 VPC 网络。

  3. 选择专用服务连接标签页。

  4. 专用服务连接标签页中,选择为服务分配的 IP 范围标签页。

  5. 点击创建连接以在您的网络与服务提供方之间创建专用连接。

  6. 对于指定的分配范围,请选择一个或多个未被其他服务提供方占用的现有分配范围。

  7. 点击连接以创建连接。

gcloud

  1. 使用 vpc-peerings connect 命令

    gcloud services vpc-peerings connect \
        --service=servicenetworking.googleapis.com \
        --ranges=RESERVED_RANGE_NAME \
        --network=VPC_NETWORK
    

    请替换以下内容:

    • RESERVED_RANGE_NAME:一个或多个已分配范围的名称。

    • VPC_NETWORK:您的 VPC 网络的名称。

    该命令启动一个可长时间运行的操作,并返回操作名称。

  2. 如需检查操作是否成功,请使用 vpc-peerings operations describe 命令

    gcloud services vpc-peerings operations describe \
        --name=OPERATION_NAME
    

    OPERATION_NAME 替换为从上一步返回的操作名称。

创建专用连接时,您可以指定多个分配范围。举例来说,如果一个范围已用尽,则您可以分配额外的分配范围。该服务会按您指定的顺序使用所提供的所有范围中的 IP 地址。

Terraform

如需创建专用连接,请使用 google_service_networking_connection 资源

resource "google_service_networking_connection" "default" {
  network                 = google_compute_network.peering_network.id
  service                 = "servicenetworking.googleapis.com"
  reserved_peering_ranges = [google_compute_global_address.private_ip_address.name]
}

列出专用连接

创建专用连接后,您可以列出它以检查是否存在。 该列表还显示与每个连接相关的分配的范围列表。例如,如果您不记得将哪个分配的范围分配给了某个连接,则可以查看该列表以找到答案。

控制台

  1. 在 Google Cloud 控制台中,转到 VPC 网络页面。

    进入 VPC 网络页面

  2. 选择包含连接的 VPC 网络。

  3. 选择专用服务连接标签页。

  4. 专用服务连接标签页中,选择连到服务的专用连接 (Private connections to services) 标签页,并查看该网络的所有专用连接。

gcloud

使用 vpc-peerings list 命令

gcloud services vpc-peerings list \
    --network=VPC_NETWORK

VPC_NETWORK 替换为您的 VPC 网络名称。

修改专用连接

对于现有专用连接,您可以在不中断流量的情况下添加或移除所分配的 IP 地址范围。例如,在执行扩缩时,如果现有分配范围即将用尽,则可以添加一个分配的范围。

您不能使用 Google Cloud 控制台移除分配的 IP 范围。如果您要移除分配的范围,请使用 gcloud 说明来修改连接。从专用连接中移除范围时,以下规则适用:

  • 分配的范围不再与专用连接相关联,但不会被删除。

  • 现有服务提供方资源可能会继续使用已移除的范围。

  • 专用服务访问通道不会使用已移除的范围来分配新子网。

控制台

  1. 在 Google Cloud 控制台中,转到 VPC 网络页面。

    进入 VPC 网络页面

  2. 选择包含连接的 VPC 网络。

  3. 选择专用服务连接标签页。

  4. 专用服务连接标签页中,选择连到服务的专用连接 (Private connections to services) 标签页,并查看该网络的所有专用连接。

  5. 点击列表中的连接名称。

  6. 指定的分配范围下拉菜单中,选择要分配的范围。

  7. 点击确定

gcloud

如需在现有专用连接上添加分配的 IP 地址范围或者从现有专用连接中移除分配的 IP 地址范围,请使用 vpc-peerings update 命令

gcloud services vpc-peerings update \
    --service=servicenetworking.googleapis.com \
    --ranges=RESERVED_RANGE_NAME \
    --network=VPC_NETWORK \
    [--force]

请替换以下内容:

  • RESERVED_RANGE_NAME:要分配给专用连接的一个或多个已分配范围的名称列表。

    RESERVED_RANGE_NAME 会替换之前的分配范围列表。如果您省略先前与专用连接关联的范围,则该范围会从连接中移除。您必须使用 --force 选项移除范围。

  • VPC_NETWORK:您的 VPC 网络的名称。

删除分配的 IP 地址范围

在删除分配的 IP 地址范围之前,请检查该范围是否正在由专用连接使用。

如果分配的 IP 地址范围处于使用中,请先修改专用连接以移除该范围。然后,删除分配的 IP 地址范围。

如果您删除正在使用的已分配 IP 地址,并且不修改专用连接,则:

  • 现有连接仍保持活跃状态,但没有任何机制可以防止您的 VPC 网络使用与服务提供方网络存在重叠的 IP 地址。

  • 如果您删除与专用连接关联的唯一分配的 IP 地址范围,则服务无法创建新的子网,因为没有可从中选择的已分配 IP 地址范围。

  • 如果您稍后创建与已删除范围匹配或重叠的已分配 IP 地址范围,则将该范围添加到专用连接会失败。

为避免这些问题,请务必在删除使用中的已分配 IP 地址范围时修改您的专用连接。

控制台

  1. 在 Google Cloud 控制台中,转到 VPC 网络页面。

    进入 VPC 网络页面

  2. 选择包含要删除的分配范围的 VPC 网络。

  3. 选择专用服务连接标签页。

  4. 专用服务连接标签页中,选择为服务分配的 IP 范围标签页。

  5. 选择要删除的分配范围。

  6. 点击释放,将已分配的 IP 地址范围释放回可用内部 IP 地址池中。

    如果已分配的 IP 地址范围仍然分配给现有连接,则您必须首先输入额外的确认信息,之后才能释放分配范围。

  7. 再次点击释放以确认删除。

gcloud

通过指定分配范围名称来删除分配范围。

gcloud compute addresses delete NAME \
    --global

NAME 替换为您要删除的分配范围的名称。

删除一个专用连接

在删除专用连接之前,您必须先删除通过该连接访问的所有服务实例。例如,如果要删除用于访问 Cloud SQL 的专用连接,您必须先删除使用该连接的 Cloud SQL 实例。删除服务实例后,服务提供方的资源会被删除,但可能不会立即删除。一些服务提供方会将删除延迟到等待期结束。在等待期,您无法删除专用连接。您必须等到服务提供方的资源删除之后才能删除连接。

例如,如果删除 Cloud SQL 实例,您会收到成功响应,但服务会等待四天,然后再删除服务提供方资源。等待期意味着,如果您改变注意,不想删除服务,可以请求恢复资源。如果您尝试在等待期删除连接,则删除将失败并显示消息,表示服务提供方仍在使用资源。

控制台

  1. 在 Google Cloud 控制台中,转到 VPC 网络页面。

    进入 VPC 网络页面

  2. 选择包含要删除的连接的 VPC 网络。

  3. 选择专用服务连接标签页。

  4. 专用服务连接标签页中,选择与服务专用连接 (Private connection to services) 标签页。

  5. 选择要删除的专用连接。

  6. 点击删除执行删除。

  7. 再次点击删除以确认删除。

gcloud

如需删除专用连接的 VPC 网络对等互连连接,请使用 vpc-peerings delete 命令

gcloud services vpc-peerings delete \
    --service=servicenetworking.googleapis.com \
    --network=VPC_NETWORK

VPC_NETWORK 替换为您的 VPC 网络名称。

与服务提供方共享专用 DNS 区域

Cloud DNS 专用可用区是您的 VPC 网络的专用可用区。如果您希望服务提供方网络解析您的专用可用区中的名称,则可以配置两个网络之间的 DNS 对等互连。

配置 DNS 对等互连时,您需要提供 VPC 网络和 DNS 后缀。如果服务提供方需要使用该 DNS 后缀解析地址,则服务提供商会将这些查询转发到您的 VPC 网络进行解析。

除 Cloud SQL 之外,这些受支持的服务支持 DNS 对等互连。

如果要启用 DNS 对等互连,则必须在项目中启用 Cloud DNS API

与服务提供方建立对等互连 DNS

gcloud

如需在 VPC 网络和服务提供商网络之间设置 DNS 对等互连,请使用 peered-dns-domains create 命令

gcloud services peered-dns-domains create PEERING_NAME \
    --network=VPC_NETWORK \
    --dns-suffix=DNS_SUFFIX

请替换以下内容:

  • PEERING_NAME:此 DNS 对等互连配置的名称。

  • VPC_NETWORK:使用专用服务访问通道连接到服务提供方的 VPC 网络的名称。

  • DNS_SUFFIX:您要与服务提供方建立对等互连的 DNS 后缀。您必须提供完整的 DNS 域名(包括句点)。例如,example.com. 是有效的 DNS 后缀。

Terraform

如需在 VPC 网络和服务提供商网络之间设置 DNS 对等互连,请使用 google_service_networking_peered_dns_domain 资源


## Uncomment this block after adding a valid DNS suffix

# resource "google_service_networking_peered_dns_domain" "default" {
#   name       = "example-com"
#   network    = google_compute_network.peering_network.name
#   dns_suffix = "example.com."
#   service    = "servicenetworking.googleapis.com"
# }

列出 DNS 对等互连配置

gcloud

使用 peered-dns-domains list 命令

gcloud services peered-dns-domains list \
    --network=VPC_NETWORK

VPC_NETWORK 替换为您的 VPC 网络名称。

删除 DNS 对等互连配置

gcloud

使用 peered-dns-domains delete 命令

gcloud services peered-dns-domains delete PEERING_NAME \
    --network=VPC_NETWORK

请替换以下内容:

  • PEERING_NAME:DNS 对等互连配置的名称。

  • VPC_NETWORK:您的 VPC 网络的名称。

问题排查

我的分配范围用了多少?

创建到服务提供方的专用连接时,您会分配 IP 地址范围供其使用。如果您使用来自服务提供方的多个服务,则每个服务将保留该分配范围中的很多 IP 地址。您可以检查哪些服务正在使用哪些 IP 地址,这样您就可以知道哪些服务正在使用大的 IP 地址块,并避免 IP 地址耗尽。

要查看哪些服务正使用特定 IP 地址范围:

  1. 列出您的专用连接
  2. 找到将您与相关服务提供方关联的对等互连连接的名称。
  3. 针对您的 VPC 网络列出路由
  4. 查找下一跃点与对等互连连接名称匹配的路由。路由的目标范围指示了每个服务正在使用的 IP 地址。

IP 地址范围用尽

对于给定的专用连接,如果耗尽的 IP 地址空间用尽,Google Cloud 将返回以下错误:Failed to create subnetwork. Couldn't find free blocks in allocated IP ranges.

您可以扩展现有分配范围或添加新的分配关系。扩展后的分配范围必须是包含现有范围的相邻 IP 地址范围。我们推荐扩展分配范围,因为每个分配的大小并无限制,但您可以创建的分配数量却有限制。

要扩展现有分配范围,请执行以下操作:

  1. 列出您的专用连接并记录您需要扩展的分配范围的名称。
  2. 删除现有的分配范围。
  3. 使用与已删除范围相同的名称创建新的分配范围。指定包含已删除 IP 地址范围的 IP 地址范围。这样,使用旧分配范围的现有对等互连连接资源便可继续使用相同的 IP 地址,而不会与 VPC 网络中的资源发生冲突。例如,如果先前分配的范围是 192.168.0.0/20,创建新分配范围时应设为 192.168.0.0/16

如需为现有专用连接添加分配范围,请执行以下操作:

  1. 创建新的分配范围。此范围不必与现有的分配范围相邻。
  2. 将该分配范围添加到现有专用连接。

本地主机无法与服务提供方的网络进行通信

服务提供方的网络可能不具备能将流量定向到您的本地网络的正确路由。默认情况下,服务提供方的网络仅会通过您的 VPC 网络获知子网路由。因此,来自子网 IP 范围以外的任何请求都会被服务提供方丢弃。

在您的 VPC 网络中,更新对等互连连接,以将自定义路由导出到服务提供方的网络。导出路由时,您的 VPC 网络中符合条件的静态和动态路由(例如到您的本地网络的路由)会发送至服务提供方的网络。服务提供方的网络会自动导入这些数据,然后通过 VPC 网络将流量发回至您的本地网络。

服务账号权限

如果您在创建 IP 分配时看到有关项目的 compute.globalAddresses.list 权限的错误,或是在创建、列出或修改专用连接时遇到诸如 Error 400: Precondition check failed 等错误,则可能是因为您的 Service Networking API 服务账号的 Identity and Access Management (IAM) 角色有问题。启用 Service Networking API 后,系统会自动创建此服务账号。系统可能需要一些时间才能完成该账号的预配并将其显示在 IAM 页面上。

控制台

为确保该服务账号拥有正确的 IAM 角色,请执行以下操作:

  1. 在 Google Cloud 控制台中,前往 IAM 页面。

    转到 IAM

  2. 选中包括 Google 提供的角色授权复选框。

  3. 名称列中,找到 Service Networking Service Agent 主账号,然后点击相应行中的 修改主账号

  4. 角色字段中,确保存在 Service Networking Service Agent 角色 (roles/servicenetworking.serviceAgent)。

  5. 如果 Service Networking Service Agent 角色不存在,请点击 添加角色 添加其他角色

  6. 点击选择角色

  7. 过滤条件文本框中,输入 Service Networking Service Agent

  8. 从列表中选择 Service Networking Service Agent,然后点击保存

gcloud

如需创建 Service Networking API 服务账号,请使用 add-iam-policy-binding 命令

gcloud projects add-iam-policy-binding HOST_PROJECT_NAME \
    --member=serviceAccount:service-HOST_PROJECT_NUMBER@service-networking.iam.gserviceaccount.com \
    --role=roles/servicenetworking.serviceAgent

请替换以下内容:

  • HOST_PROJECT_NAME:宿主项目的名称。
  • HOST_PROJECT_NUMBER:宿主项目的编号。

更新 IP 分配后,对等互连子网路由仍然存在

更新专用服务连接的分配的 IP 地址范围后,旧的对等互连子网路由可能仍会出现在 VPC 网络的路由表中。由于 IP 地址范围仍在使用中,因此路由仍然存在。

如需解决此问题,请执行以下操作:

当不再使用 IP 地址范围后,对等互连子网路由会自动移除。在删除资源之后,服务提供方可能需要一段时间才能完全删除资源。例如,如果 Cloud SQL 实例正在使用旧 IP 地址范围,则服务提供方最多可能需要四天才能完全删除您的实例。删除完成后,对等互连子网路由会被移除。