通过端点访问已发布的服务

本文档介绍了如何使用 Private Service Connect 端点访问其他 VPC 网络中的服务。您可以连接到自己的服务,或其他服务提供方(包括 Google)提供的服务。

如需详细了解服务,请参阅发布托管式服务

角色

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

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

准备工作

  • 了解使用端点连接到服务的简介(包括限制)。
  • 您必须在项目中启用 Compute Engine API
  • 您必须在项目中启用 Service Directory API
  • 您必须在项目中启用 Cloud DNS API
  • 指定或创建一个常规子网,以便为端点分配 IP 地址。
    • 子网必须与您要连接的服务位于同一区域。
    • 您可以使用来自仅限 IPv4 子网或双栈子网的 IPv4 地址。
    • 如果双栈子网具有内部 IPv6 地址范围,您可以使用该子网中的 IPv6 地址。
    • IP 地址的 IP 版本会影响端点可以连接到哪些已发布的服务。如需了解详情,请参阅IP 版本转换
  • 出站防火墙规则必须允许流向端点的内部 IP 地址的流量。隐式允许出站防火墙规则允许发送到任何目标 IP 地址的出站流量。如果您在 VPC 网络中创建了任何出站流量拒绝防火墙规则,或者您创建的分层防火墙政策修改了隐式允许的出站流量行为,则对于端点的访问可能会受到影响。创建特定的出站流量允许防火墙规则或政策,以允许流量发送到服务端点的内部 IP 地址目的地。
  • 您必须具有该服务的服务连接的 URI。例如:projects/SERVICE_PROJECT/regions/REGION/serviceAttachments/SERVICE_NAME

创建端点

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

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

如果您要使端点可从多个区域访问,请启用全球访问权限

您只能更新已发布服务的端点的全球访问权限字段。如果您想更新其他字段,请删除端点,然后创建新端点。

控制台

  1. 在 Google Cloud 控制台中,转到 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 版本
    4. 如果您要创建 IPv4 地址,请选择自动分配让我选择。 如果您选择了让我选择,请输入您要使用的自定义 IP 地址

    5. 点击预留

  10. 如需使端点可从任何区域访问,请选择启用全球访问权限

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

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

  12. 点击添加端点

gcloud

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

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

    请替换以下内容:

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

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

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

    • IP_VERSION:IP 地址的 IP 版本,可以是 IPV4IPV6。默认为 IPV4。如需指定 IPV6,IP 地址必须连接到具有内部 IPv6 地址范围的双栈子网
  2. 查找预留的 IP 地址。

    gcloud compute addresses list --filter="name=ADDRESS_NAME"
    
  3. 创建转发规则,以将该端点连接到服务提供方的服务连接。 默认情况下,端点只能从其自己的区域访问。如需使端点可从任何区域访问,请使用 --allow-psc-global-access 标志。

    • 创建一个只能从其所在的区域访问的端点。

      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 ]
      
    • 创建一个可从任何区域访问的端点。

      gcloud compute forwarding-rules create ENDPOINT_NAME \
        --region=REGION \
        --network=NETWORK_NAME \
        --address=ADDRESS_NAME \
        --target-service-attachment=SERVICE_ATTACHMENT \
        --allow-psc-global-access \
        [ --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/regions/REGION/addresses
    
    {
      "name": "ADDRESS_NAME",
      "addressType": "INTERNAL",
      "subnetwork": "SUBNET_URI",
      "ipVersion": "IP_VERSION"
    }
    

    请替换以下内容:

    • PROJECT_ID:您的项目 ID。

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

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

    • IP_VERSION:IP 地址的 IP 版本,可以是 IPV4IPV6。默认为 IPV4。如需指定 IPV6,IP 地址必须连接到具有内部 IPv6 地址范围的双栈子网
  2. 创建转发规则,以将该端点连接到服务提供方的服务连接。 默认情况下,端点只能从其自己的区域访问。如需使端点可从任何区访问,请将 allowPscGlobalAccess 设置为 true

    • 创建一个只能从其所在的区域访问的端点。

      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"
            }
        ]
      }
      
    • 创建一个可从任何区域访问的端点。

      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",
        "allowPscGlobalAccess": true,
        "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 网络的 IP 地址创建端点

Service Project Admin 可以在共享 VPC 服务项目中创建使用来自所连接的共享 VPC 网络的 IP 地址的端点。Google Cloud 控制台不支持创建此类型的端点。您必须使用 Google Cloud CLI 或发送 API 请求。如需了解详情,请参阅共享 VPC

此示例展示了如何使用来自可从单个区域访问的共享 VPC 网络的 IP 地址创建端点。如需启用全球访问权限或为 Service Directory 选择命名空间,请参阅创建端点

gcloud

  1. 如需预留内部 IP 地址以分配给端点,请执行以下操作之一:
  2. 在服务项目中创建端点:

    gcloud compute forwarding-rules create ENDPOINT_NAME \
        --region=REGION \
        --network=projects/HOST_PROJECT/global/networks/HOST_NETWORK \
        --address=projects/ADDRESS_PROJECT/regions/REGION/addresses/ADDRESS_NAME \
        --target-service-attachment=SERVICE_ATTACHMENT
    

    替换以下内容:

    • ENDPOINT_NAME:分配给端点的名称。
    • REGION:端点所在区域。此区域必须与服务提供方的服务连接所在区域相同。
    • HOST_PROJECT:共享 VPC 网络项目的项目 ID。
    • HOST_NETWORK:包含端点 IP 地址的共享 VPC 网络的名称。
    • ADDRESS_PROJECT:您在其中预留了 IP 地址的项目的 ID。这可以是服务项目或宿主项目。
    • ADDRESS_NAME:预留的 IP 地址的名称。
    • SERVICE_ATTACHMENT:服务提供方的服务连接的 URI。例如:projects/SERVICE_PROJECT/regions/REGION/serviceAttachments/SERVICE_NAME

API

  1. 如需预留内部 IP 地址以分配给端点,请执行以下操作之一:

  2. 在服务项目中创建端点:

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT/regions/REGION/forwardingRules
    {
       "name": "ENDPOINT_NAME",
       "IPAddress": "projects/ADDRESS_PROJECT/regions/REGION/addresses/ADDRESS_NAME",
       "target": "SERVICE_ATTACHMENT",
       "network": "projects/HOST_PROJECT/global/networks/HOST_NETWORK"
    }
    

    替换以下内容:

    • PROJECT:服务项目 ID。
    • REGION:端点所在区域。此区域必须与服务提供方的服务连接所在区域相同。
    • ENDPOINT_NAME:分配给端点的名称。
    • ADDRESS_PROJECT:您在其中预留了 IP 地址的项目的 ID。这可以是服务项目或宿主项目。
    • ADDRESS_NAME:预留的 IP 地址的名称。
    • SERVICE_ATTACHMENT:服务提供方的服务连接的 URI。例如:projects/SERVICE_PROJECT/regions/REGION/serviceAttachments/SERVICE_NAME
    • HOST_PROJECT:共享 VPC 网络项目的项目 ID。
    • HOST_NETWORK:包含端点 IP 地址的共享 VPC 网络的名称。

列出端点

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

控制台

  1. 在 Google Cloud 控制台中,转到 Private Service Connect 页面。

    转到 Private Service Connect

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

    页面上将会显示端点。

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 调用会返回所有转发规则,而不仅仅是用于访问服务的端点。

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

替换以下内容:

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

查看端点详情

您可以查看端点的所有配置详细信息,包括端点的连接状态

控制台

  1. 在 Google Cloud 控制台中,转到 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:端点的名称。

为端点添加标签

您可以管理端点的标签。如需了解详细说明,请参阅为资源添加标签

删除端点

您可以删除端点。

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

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

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

控制台

  1. 在 Google Cloud 控制台中,转到 Private Service Connect 页面。

    转到 Private Service Connect

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

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

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:端点的名称。

从混合网络访问端点

通过 Cloud Interconnect 的 VLAN 连接或 Cloud VPN 隧道与 Google Cloud 相连接的网络中的客户端可以访问 Private Service Connect 端点。

  • VLAN 连接或 Cloud VPN 隧道必须在与端点相同的 VPC 网络(或共享 VPC 网络)中终结。对等互连的 VPC 网络中的客户端无法访问端点。

  • 如果配置了全球访问权限,来自 VLAN 连接或 Cloud VPN 隧道的客户端流量可以到达另一个区域的端点。

  • 对于 VLAN 连接,Dataplane v1 和 Dataplane v2 均受支持。如需详细了解 Dataplane 版本,请参阅 Dataplane v2

如果您要使用端点的 DNS 名称访问端点,则必须在其他网络中配置系统,以便它们可以对您的专用 DNS 区域进行查询。

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

  • 在您的其他网络连接到的 VPC 网络中创建入站服务器政策

  • 在您的 VLAN 连接或 Cloud VPN 隧道所在的区域以及您的其他网络连接到的 VPC 网络中,确定入站转发器入口点

  • 在其他网络中配置系统和 DNS 域名服务器,将端点的 DNS 名称转发到与连接到 VPC 网络的 VLAN 连接或 Cloud VPN 隧道位于同一区域的入站转发器入口点。

查看 Service Directory DNS 区域

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

控制台

  1. 在 Google Cloud 控制台中,进入 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
    

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

配置 DNS 的其他方法

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

配置 Service Directory DNS 区域

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

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

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

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

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

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

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

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

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

向 Service Directory 注册端点

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

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

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

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

  2. 为端点 SERVICE_NAME 创建 Service Directory 服务

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

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

向 Service Directory 注册端点后,请按照配置 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 域名指定其服务名称。

  • 添加记录

问题排查

创建专用 DNS 区域失败

当您创建端点时,系统会创建一个 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 区域,此区域由与端点关联的 Service Directory 命名空间提供支持。

配置全球访问权限后,端点创建失败

并非所有 Private Service Connect 发布的服务都支持具有全球访问权限的端点。如果您创建的端点具有全球访问权限,但已发布的服务不支持该端点,您会看到以下错误消息:

Private Service Connect global access is not supported for the given forwarding rule, since its producer service does not support consumer global access.

创建不包含全球访问权限选项的端点。

端点创建成功,但未建立连接

如果您为已发布的服务成功创建端点,但连接未建立,请检查端点的连接状态。连接状态可能表示您可以解决该问题的步骤。