使用 Private Service Connect 访问代管式服务

借助 Private Service Connect,您可以使用具有您的 VPC 网络中内部 IP 地址的端点连接到服务提供方。

本文档介绍如何使用 Private Service Connect 端点连接到位于另一个 VPC 网络中的受支持服务。您可以连接到自己的服务,或其他服务提供方提供的服务。如需了解详情,请参阅发布服务

角色

以下 IAM 角色提供了执行本指南中的任务所需的权限。

任务 角色
创建 Private Service Connect 端点 同时具有以下两个角色:
Compute Network Admin (roles/compute.networkAdmin) 和
Service Directory Editor (roles/servicedirectory.editor)
自动或手动为 Private Service Connect 端点配置 DNS 条目 DNS Administrator (roles/dns.admin)

准备工作

  • 您必须在项目中启用 Compute Engine API

  • 您必须在项目中启用 Service Directory API

  • 您必须在项目中启用 Cloud DNS API

  • 出站防火墙规则必须允许传入 Private Service Connect 端点的内部 IP 地址的流量。隐式允许出站防火墙规则允许发送到任何目标 IP 地址的出站流量。

    如果您在 VPC 网络中创建了任何出站流量拒绝防火墙规则,或者您创建的分层防火墙政策修改了隐式允许的出站流量行为,则对于端点的访问可能会受到影响。创建特定的出站流量允许防火墙规则或政策,以允许流量发送到服务端点的内部 IP 地址目的地。

  • 您必须具有该服务的服务连接的 URI。例如 projects/SERVICE_PROJECT/regions/REGION/serviceAttachments/SERVICE_NAME

  • 如果您要在受 VPC Service Controls 边界(该边界限制 compute.googleapis.comservicedirectory.googleapis.comdns.googleapis.com)保护的项目中创建 Private Service Connect 端点,则需要进行额外配置。您必须先为 VPC Service Controls 创建入站和出站规则,然后才能创建端点。如需了解详情,请参阅为 VPC Service Controls 配置入站和出站规则

限制

  • 无法从对等互连的 VPC 网络访问 Private Service Connect 端点。

  • 您不能从使用 Cloud Interconnect 连接 (VLAN) 连接到 VPC 的本地环境向用于访问另一个 VPC 网络中的服务的 Private Service Connect 端点发送请求。

    如需了解如何从使用 Cloud VPN 连接的本地环境访问 Private Service Connect 端点,请参阅从本地主机使用 Private Service Connect

  • 数据包镜像无法在虚拟机和连接到已发布服务的 Private Service Connect 端点之间镜像数据包。

自动 DNS 配置

如果存在以下配置,则系统会为 Private Service Connect 端点自动创建 DNS 条目:

  • 服务提供方已为服务配置域名。

  • Private Service Connect 端点已向 Service Directory 命名空间注册。

    所有新端点都会自动向 Service Directory 注册,但旧端点可能不会注册。

如果两个配置都存在,则 Private Service Connect 端点创建时,系统会创建名为 NAMESPACE--REGIONService Directory DNS 区域。此专用区域存储位于 REGION 区域的 Service Directory 命名空间 NAMESPACE 中的服务的 DNS 条目。

使用 Service Directory 的 Private Service Connect 端点的自动 DNS 配置(点击可放大)

创建 Private Service Connect 端点后,您可以验证 Service Directory DNS 区域是否已创建。如果 Service Directory DNS 区域未创建,您可以手动创建类似的配置。如需了解详情,请参阅查看 Service Directory DNS 区域

如果您不希望创建这些 DNS 条目,请执行以下操作之一:

  • 如果您没有将 Cloud DNS 用于其他目的,请停用 Cloud DNS API 或移除 Cloud DNS 所需的权限。

  • 等待 DNS 区域创建完成,然后手动删除 DNS 区域

    如果您想要手动配置 DNS,请参阅手动配置 DNS

创建 Private Service Connect 端点

Private Service Connect 端点使用 Private Service Connect 转发规则连接到另一个 VPC 网络中的服务。为了访问其他 VPC 网络中的服务,每个转发规则都会计入 Private Service Connect 转发规则的针对每个项目的配额

使用 Private Service Connect 连接到另一个 VPC 网络中的服务时,您可以从您的 VPC 网络的子网中选择一个 IP 地址。

该 IP 地址必须与服务提供方的服务连接位于同一区域。 该 IP 地址会计入内部 IP 地址的项目配额

创建 Private Service Connect 端点时,系统会使用您选择的命名空间或默认命名空间 goog-psc-default,自动向 Service Directory 注册该端点。

控制台

  1. 在 Google Cloud Console 中,转到 Private Service Connect

    转到 Private Service Connect

  2. 点击已连接的端点标签页。

  3. 点击连接端点

  4. 对于目标,选择已发布的服务

  5. 对于目标服务,输入要连接到的服务连接 URI。

    服务连接 URI 的格式为:projects/SERVICE_PROJECT/regions/REGION/serviceAttachments/SERVICE_NAME

  6. 对于端点名称,输入要用于端点的名称。

  7. 为端点选择网络

  8. 为端点选择子网

  9. 为端点选择 IP 地址。如果您需要新的 IP 地址,可以创建一个:

    1. 点击 IP 地址下拉菜单,然后选择创建 IP 地址
    2. 为 IP 地址输入名称和可选的描述
    3. 对于静态 IP 地址,选择自动分配让我选择

      如果您选择了让我选择,请输入您要使用的自定义 IP 地址

    4. 点击预留

  10. 从下拉列表中选择命名空间,或者创建新的命名空间。

    系统会根据所选子网填充区域

  11. 点击添加端点

gcloud

  1. 预留要分配给该端点的内部 IP 地址。

    gcloud compute addresses create ADDRESS_NAME \
        --region=REGION \
        --subnet=SUBNET
    

    请替换以下内容:

    • ADDRESS_NAME:分配给预留 IP 地址的名称。

    • REGION:端点 IP 地址所在的区域。此区域必须与服务提供方的服务连接所在区域相同。

    • SUBNET:端点 IP 地址的子网名称。

  2. 查找预留的 IP 地址。

    gcloud compute addresses list --filter="name=ADDRESS_NAME"
    
  3. 创建转发规则,以将该端点连接到服务提供方的服务连接。

    gcloud compute forwarding-rules create ENDPOINT_NAME \
        --region=REGION \
        --network=NETWORK_NAME \
        --address=ADDRESS_NAME \
        --target-service-attachment=SERVICE_ATTACHMENT \
        [ --service-directory-registration=projects/PROJECT_ID/locations/REGION/namespaces/NAMESPACE ]
    

    请替换以下内容:

    • ENDPOINT_NAME:分配给端点的名称。

    • REGION:端点所在区域。此区域必须与服务提供方的服务连接所在区域相同。

    • NETWORK_NAME:端点的 VPC 网络的名称。

    • ADDRESS_NAME:预留地址的名称。

    • SERVICE_ATTACHMENT:服务提供方的服务连接的 URI。例如:projects/SERVICE_PROJECT/regions/REGION/serviceAttachments/SERVICE_NAME

    • PROJECT_ID:您的项目 ID。

    • NAMESPACE:您要使用的 Service Directory 命名空间。如果您指定的命名空间不存在,则系统会创建这个命名空间。

      如果省略 --service-directory-registration 标志,则会使用默认命名空间 goog-psc-default

API

  1. 预留要分配给该端点的内部 IP 地址。

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/region/REGION/addresses
    
    {
      "name": ADDRESS_NAME,
      "addressType": "INTERNAL",
      "subnetwork": SUBNET_URI
    }
    

    请替换以下内容:

    • PROJECT_ID:您的项目 ID。

    • ADDRESS_NAME:分配给预留 IP 地址的名称。

    • SUBNET_URI:IP 地址的子网。使用 subnetworks.list 方法gcloud compute networks subnets list --uri 查找网络的网址。

  2. 创建转发规则以将端点连接到 Google API 和服务。

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/forwardingRules
    {
      "name": ENDPOINT_NAME,
      "IPAddress": ADDRESS_URI,
      "target": SERVICE_ATTACHMENT,
      "network": NETWORK_URI,
      "serviceDirectoryRegistrations": [
          {
              "namespace": NAMESPACE,
          }
      ],
    }
    

    请替换以下内容:

    • PROJECT_ID:您的项目 ID。

    • REGION:端点所在区域。

    • ENDPOINT_NAME:分配给端点的名称。

    • ADDRESS_URI:关联网络上的预留地址的 URI。使用 addresses.list 方法gcloud compute addresses list --uri 查找预留地址的网址。

    • SERVICE_ATTACHMENT:服务提供方的服务连接的 URI。例如:projects/SERVICE_PROJECT/regions/REGION/serviceAttachments/SERVICE_NAME

    • NETWORK_URI:端点的 VPC 网络。使用 network.list 方法gcloud compute networks list --uri 查找您的网络的 URI。

    • NAMESPACE:端点的命名空间。如果您指定的命名空间不存在,则系统会创建这个命名空间。如果您省略 namespace 字段,系统会分配默认命名空间 goog-psc-default

为 VPC Service Controls 配置入站和出站规则

如果您要在受 VPC Service Controls 边界(该边界限制 compute.googleapis.comservicedirectory.googleapis.comdns.googleapis.com)保护的项目中创建 Private Service Connect 端点,则需要进行额外配置。创建 Private Service Connect 端点之前,请要求服务提供方提供以下信息:

  • PRODUCER_PROJECT_NUMBER:服务连接所在项目的编号。

  • PRODUCER_SERVICE_ACCOUNT(可选):如果要配置按帐号限制访问权限的入站规则,则为已创建服务连接的服务帐号的名称。

使用此信息创建入站和出站规则,以允许在 Private Service Connect 端点与服务连接之间建立连接。

如需了解如何配置入站和出站规则,请参阅配置入站和出站政策

  1. 配置出站规则,允许从使用方项目到提供方项目 PRODUCER_PROJECT_NUMBER 的出站流量。

    - egressFrom:
        identityType: ANY_IDENTITY
      egressTo:
        operations:
        - serviceName: 'compute.googleapis.com'
          methodSelectors:
          - method: 'ServiceAttachmentsService.Insert'
          - method: 'ServiceAttachmentsService.Patch'
          - method: 'RegionForwardingRulesService.Insert'
        - serviceName: 'servicedirectory.googleapis.com'
          methodSelectors:
          - method: '*'
        - serviceName: 'dns.googleapis.com'
          methodSelectors:
          - method: '*'
        resources:
        - 'projects/PRODUCER_PROJECT_NUMBER'
    
  2. 创建以下入站规则之一。

    • 此示例入站规则允许服务提供方更新由 PRODUCER_SERVICE_ACCOUNT 创建的服务连接,以将您的项目添加到接受列表。

      - ingressFrom:
          sources:
          - accessLevel: '*' # All Sources
          identities: serviceAccount: PRODUCER_SERVICE_ACCOUNT
        ingressTo:
          operations:
          - serviceName: 'compute.googleapis.com'
            methodSelectors:
            - method: 'ServiceAttachmentsService.Patch'
          - serviceName: 'servicedirectory.googleapis.com'
            methodSelectors:
            - method: '*'
          - serviceName: 'dns.googleapis.com'
            methodSelectors:
            - method: '*'
          resources:
          - '*'
      
    • 此示例入站规则允许服务提供方更新由任何帐号创建的服务连接,以将您的项目添加到接受列表。

      - ingressFrom:
          sources:
          - accessLevel: '*' # All Sources
          identityType: ANY_IDENTITY
        ingressTo:
          operations:
          - serviceName: 'compute.googleapis.com'
            methodSelectors:
            - method: 'ServiceAttachmentsService.Patch'
          - serviceName: 'servicedirectory.googleapis.com'
            methodSelectors:
            - method: '*'
          - serviceName: 'dns.googleapis.com'
            methodSelectors:
            - method: '*'
          resources:
          - '*'
      

配置入站和出站规则后,您可以创建一个 Private Service Connect 端点以连接至项目 PRODUCER_PROJECT_NUMBER 中的服务连接。

查看 Service Directory DNS 区域

如果满足自动 DNS 配置的前提条件,系统将创建名称为 NAMESPACE--REGION 格式的 DNS 区域。

控制台

  1. 在 Cloud Console 中,转到 Cloud DNS 可用区页面。

    前往“Cloud DNS 区域”

  2. 查找名为 NAMESPACE--REGION 的专用区域。

gcloud

  • 运行以下命令以列出所有专用 DNS 区域:

    gcloud dns managed-zones list \
        --filter="visibility=private"
    
  • 运行以下命令以获取名为 NAMESPACE--REGION 的区域的详细信息。

    gcloud dns managed-zones describe NAMESPACE--REGION
    

如果该区域不存在,请查看 Private Service Connect 端点的详细信息,并检查端点配置是否包含命名空间值。

列出端点

您可以列出所有已配置的 Private Service Connect 端点。

控制台

  1. 在 Google Cloud Console 中,转到“Private Service Connect”页面。

    转到 Private Service Connect

  2. 点击已连接的端点标签页。

    系统会显示 Private Service Connect 端点。

gcloud

gcloud compute forwarding-rules list  \
    --filter 'target~serviceAttachments'

输出内容类似如下:

NAME  REGION  IP_ADDRESS  IP_PROTOCOL  TARGET
RULE          IP          TCP          REGION/serviceAttachments/SERVICE_NAME

API

此 API 调用会返回所有转发规则,而不仅仅是用于访问服务的 Private Service Connect 端点。

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

请替换以下内容:

  • PROJECT_ID:包含该端点的项目。
  • REGION:端点所在区域。

查看端点详情

您可以查看 Private Service Connect 端点的所有配置详细信息。

端点的状态可为以下之一:

  • 待处理:端点配置为连接到需要批准的服务,但此项目尚未获得批准。

  • 已接受:端点位于已获批准连接到此服务的项目中。

  • 已拒绝:端点所在的项目禁止连接到此服务。

  • 已关闭:端点连接到已删除的服务连接。

控制台

  1. 在 Google Cloud Console 中,转到“Private Service Connect”页面。

    转到 Private Service Connect

  2. 点击已连接的端点标签页。

  3. 点击要查看的端点。

gcloud

gcloud compute forwarding-rules describe \
    ENDPOINT_NAME --region=REGION

请替换以下内容:

  • ENDPOINT_NAME:端点的名称。
  • REGION:端点所在区域。

API

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

请替换以下内容:

  • PROJECT_ID:包含该端点的项目。
  • REGION:端点所在区域。
  • ENDPOINT_NAME:端点的名称。

为端点添加标签

您可以管理 Private Service Connect 端点的标签。如需了解详情,请参阅为资源添加标签

删除端点

您可以删除 Private Service Connect 端点。

但是,删除端点时,不会删除以下 Service Directory 配置:

  • Service Directory 命名空间
  • Service Directory DNS 区域

Service Directory 命名空间和 Service Directory DNS 区域可被其他服务使用。在删除 Service Directory 命名空间删除 Service Directory DNS 区域之前,请确保命名空间为空。

控制台

  1. 在 Google Cloud Console 中,转到 Private Service Connect

    转到 Private Service Connect

  2. 点击已连接的端点标签页。

  3. 选择要删除的 Private Service Connect 端点,然后点击删除

gcloud

    gcloud compute forwarding-rules delete \
        ENDPOINT_NAME --region=REGION

请替换以下内容:

  • ENDPOINT_NAME:端点的名称。
  • REGION:端点所在区域。

API

DELETE https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/forwardingRules/ENDPOINT_NAME

请替换以下内容:

  • PROJECT_ID:包含该端点的项目。
  • REGION:端点所在区域。
  • ENDPOINT_NAME:端点的名称。

配置 DNS 的其他方法

如果未满足自动 DNS 配置的前提条件,您可以通过其他方式创建 DNS 条目:

配置 Service Directory DNS 区域

如果 Private Service Connect 端点已向 Service Directory 中注册,但其连接的已发布服务未配置域名,则不会进行 DNS 更改。

如果要复制自动 DNS 配置,您可以手动配置由 Service Directory 命名空间支持的 Service Directory DNS 区域。创建区域后,系统会自动为 Private Service Connect 端点创建 DNS 条目。

使用以下配置创建 Service Directory DNS 区域

  • 区域名称:指定 NAMESPACE--REGION,其中 NAMESPACE 是 Private Service Connect 端点注册的命名空间,REGION 是创建端点的区域。

  • DNS 名称:服务提供方用于其已发布的服务的 DNS 网域。如需了解此信息,请与服务提供方联系。

    DNS 名称的格式为 REGION.p.DOMAIN。例如,如果服务提供方的公共网域是 example.com,而其已发布的服务位于 us-west1,则我们会建议他们使用 us-west1.p.example.com 域名指定其服务名称。包括结尾句点,例如 us-west1.p.example.com.

  • Service Directory 命名空间:您为此端点配置的命名空间。

查看 Private Service Connect 端点详细信息以查找 Service Directory 命名空间和区域。

使用此配置时,如果您使用 us-west1.p.example.com DNS 名称配置了 Service Directory DNS 区域,并创建了一个名为 analytics 的 Private Service Connect 端点,则系统会自动为 analytics.us-west1.p.example.com 创建一条 DNS 记录。

向 Service Directory 注册 Private Service Connect 端点

新的 Private Service Connect 端点会自动向 Service Directory 注册。但是,如果 Private Service Connect 端点是在启用 Service Directory 自动注册之前创建的,则可能缺少此配置。

您可以删除 Private Service Connect 端点,然后创建新端点,该端点会自动向 Service Directory 注册。

或者,您可以按照以下步骤向 Service Directory 命名空间注册现有 Private Service Connect 端点。

  1. 为 Private Service Connect 端点 NAMESPACE 创建一个 Service Directory 命名空间

  2. 为 Private Service Connect 端点 SERVICE_NAME 创建一个 Service Directory 服务

    对于该服务,请使用与 Private Service Connect 端点 ENDPOINT_NAME 所用转发规则相同的名称。

  3. 使用名称 default 创建一个 Service Directory 端点,并使用 Private Service Connect 端点的 IP 地址和端口 (443)。

向 Service Directory 注册 Private Service Connect 端点后,请按照配置 Service Directory DNS 区域中的说明操作。

手动配置 DNS

如果您已阻止自动 DNS 配置,或者未在您的配置中启用该配置,则可以使用 Cloud DNS 手动创建 DNS 记录

如需了解详情,请参阅以下页面:

  • 访问权限控制DNS Administrator 角色 (roles/dns.admin) 提供创建 DNS 区域和记录所需的权限。

  • 创建专用区域

    • 配置专用区域时,您需要提供 DNS 名称。使用服务提供方用于其已发布服务的 DNS 网域。如需了解此信息,请与服务提供方联系。

      其格式可能如下:REGION.p.DOMAIN。例如,如果服务提供方的公共网域是 example.com,而其已发布的服务位于 us-west1,则我们会建议他们使用 us-west1.p.example.com 域名指定其服务名称。

  • 添加记录

日志记录

您可以在包含访问服务(在使用 Private Service Connect 端点的另一个 VPC 网络中访问)的虚拟机的子网上启用 VPC 流日志。日志显示虚拟机与 Private Service Connect 端点之间的流。

从本地主机使用 Private Service Connect

如果您的本地网络连接到 VPC 网络,您可以使用 Private Service Connect 端点的内部 IP 地址从本地主机访问 Private Service Connect 发布的服务。

  • 您的本地网络必须使用 Private Service Connect 端点所在的同一区域中的 Cloud VPN 隧道连接到 VPC 网络。

  • Private Service Connect 端点位于连接到本地网络的 VPC 网络中。

  • 如果您想使用 DNS 名称访问 Private Service Connect 端点,则必须配置本地系统,以便它们可以对您的专用 DNS 区域进行查询。

    如果您已使用 Cloud DNS 实现专用 DNS 区域,请完成以下步骤:

问题排查

创建专用 DNS 区域失败

创建 Private Service Connect 端点时,系统会创建一个 Service Directory DNS 区域。区域创建可能会由于以下原因而失败:

  • 您尚未在项目中启用 Cloud DNS API。

  • 您没有创建 Service Directory DNS 区域所需的权限。

  • 此 VPC 网络中已存在具有相同区域名称的 DNS 区域。

  • 此 VPC 网络中已存在相同域名的 DNS 区域。

如需手动创建 Service Directory DNS 区域,请执行以下操作:

  1. 验证是否已在您的项目中启用 Cloud DNS API。

  2. 验证您是否拥有创建 Service Directory DNS 区域所需的权限:

    • dns.managedZones.create
    • dns.networks.bindPrivateDNSZone
    • servicedirectory.namespaces.associatePrivateZone
  3. 如果存在冲突的区域,但不再需要该区域,请删除 DNS 区域

  4. 创建 Service Directory DNS 区域,此区域由与 Private Service Connect 端点关联的 Service Directory 命名空间提供支持。