简介
Private Service Connect 是什么
Private Service Connect 是 Google Cloud(原名 GCP)Virtual Private Cloud(VPC)的一项功能。
该功能主要用于以下两个场景:
- 使用私有 IP 访问 Google Cloud 的 API。
- 将用户自己的服务向其他 Google Cloud 项目公开。
前者主要是为了实现原本需要通过公共 IP 经由互联网访问的 Google Cloud 各种 API,现在可以通过私有 IP 进行连接。更多详细信息可以参考相关文章。
- Private Service Connect 功能解说
后者是在本文中介绍的内容,即如何在 Google Cloud 上托管的服务(如 Web API 或其他服务)面向其他 Google Cloud 用户或公司内部的不同 Google Cloud 项目进行公开。
AWS 平台中有一个类似的功能,名为 AWS PrivateLink。您可以将其视为 Google Cloud 平台中的相应功能。
通过 Private Service Connect 进行服务发布
如果你想在 Compute Engine 虚拟机等平台上,将服务面向其他 Google Cloud 项目或不同的 VPC 网络进行发布,可以考虑以下几种方法:
- 将服务端点对互联网公开(可利用外部 HTTP(S)负载均衡器等工具)。
- 使用 VPC 对等连接进行连接。
- 利用 Cloud VPN 在不同 VPC 之间建立连接。
- 通过 Private Service Connect 进行发布。
选项 1 是像普通 Web 服务一样向互联网公开服务的方法。然而,如果该服务只针对特定少数客户,则出于安全原因,此方法可能会被避免使用。
选项 2 和 3 涉及的是直接在 VPC 之间建立连接并通过私有 IP 进行通信。这种方法不会让不特定的大量客户直接访问你的服务,但前提是所有的 VPC 之间的 IP 地址段必须不重复。在跨越多个公司或政府部门的网络中,IP 地址段重叠的情况也较为常见。
因此,选项 4 即 Private Service Connect 成为了一个值得考虑的选择。
通过 Private Service Connect 进行服务发布,无需考虑 IP 地址段是否存在重叠的问题,就可以将服务面向其他 VPC 进行发布,并实现在私有网络中的连接。这种方法被称为 Private Service Connect 托管式服务。
- 参考:Private Service Connect 托管式服务
Private Service Connect 的架构
构成
Private Service Connect 的托管服务发布,将通过以下架构实现:
左侧是使用服务的一方(也称为服务使用方),右侧是提供服务的一方(也称为服务提供方)。
通信流程
通信将按照以下步骤实现:
前提条件:右侧的服务器通过 HTTP(tcp/80)端口提供服务,左侧的客户端将进行访问。
- 客户端访问
10.100.0.101:80
(这是 Private Service Connect 端点)。 - 通信通过 Google Cloud 内部网络到达服务提供方环境的 Service Attachment,并在此过程中进行了 SNAT(源网络地址转换),然后到达内部负载均衡器。
- 内部负载均衡器对流量进行分发,最终将通信传递给后端服务器(响应数据则沿着相反的路径返回给客户端)。
详细构成
服务提供方
服务提供方通过组合使用“服务附件”、“内部负载均衡器”和“后端服务器”来提供服务。
服务附件 是一种用于发布服务的资源,每个服务创建一个服务附件。服务附件与“转发规则”绑定,后者可以视为负载均衡器的“前端”。这里的“转发规则”类似于前端接口的概念。
此外,创建服务附件需要专用子网。在创建子网时,必须明确选择“Private Service Connect 专用”。子网的大小可以根据实际需求进行设置,最小可以设置为 /29
。但是需要注意,如果同时连接的客户端数量过多,可能会导致 IP 地址不足的问题(详情请参阅参考文献)。
内部负载均衡器 可以支持以下类型:
- 内部路径穿透网络负载均衡器
- 内部应用负载均衡器
- 内部协议转换
- 区域内部代理网络负载均衡器
作为后端服务器,可以使用内部负载均衡器支持的各种后端服务。例如,可以使用 Compute Engine 虚拟机(实例组)或通过 VPN/专线连接的本地服务器等。
服务使用方
当服务提供方创建服务附件时(projects/${PROJECT_ID}/regions/${REGION}/serviceAttachments/${SERVICE_NAME}
),将会生成一个服务名称。服务使用方需要通过指定这个名称来创建连接至该服务的端点(Private Service Connect 端点)。
创建端点后,会分配一个私有 IP 地址。客户端可以使用此私有 IP 地址访问服务。
此外,服务提供方可以在创建服务附件时,设置仅接受明确批准的项目中的端点。未经批准的端点不会被转发数据包。
- 更详细的说明是:Private Service Connect 端点实际上是一个“将服务附件作为目标的转发规则”,可以通过
gcloud compute forwarding-rules list
命令进行列表展示。转发规则也可以作为负载均衡器的前端资源使用。
连接源 IP 地址
有时,您可能会关心从流量的连接源 IP 地址在后端服务器上看起来是什么样子。通过 Private Service Connect 路由的流量源 IP 地址取决于所使用的负载均衡器类型。
- 如果内部负载均衡器为代理模式,那么在后端服务器看来,连接源 IP 地址将是代理专用子网的 CIDR 范围。
- 如果内部负载均衡器为直通模式,则后端服务器看到的连接源 IP 地址将是服务专用子网的 CIDR 范围。
无论哪种情况,客户端原始的 IP 地址都无法直接获得。如果想要获取原始 IP 地址,可以启用服务附件中的“代理协议”。启用时需注意以下事项:
- 支持的负载均衡器类型仅限于“内部 TCP/UDP 负载均衡器(仅支持 TCP 通信)”和“内部协议转发”。
- 需要在服务器端正确配置以处理代理协议头,否则请求无法正常处理。
即使启用了代理协议,也无法通过 VPC 防火墙等机制来引用这些信息进行基于连接源 IP 的访问 控制。更多详情请参考以下文档:
- 参考资料:查看使用方连接信息
DNS 名称
还可以为端点设置 DNS 名称。
您可以使用服务目录功能在服务提供方定义 DNS 名称(DNS 配置),或者在服务使用方通过 Cloud DNS 手动定义 DNS 名称(手动配置)。
构建步骤
服务提供方的步骤
大致上,需要执行以下操作:
- 构建后端服务器。
- 构建内部负载均衡器(并创建适当的 VPC 防火墙规则)。
- 创建专用子网用于 Private Service Connect 服务。
- (如果是透传型负载均衡器)创建允许从专用子网进行通信的 VPC 防火墙规则。
- 创建服务附件。
- 添加审批项目。
详情请参考以下文档:
- 参考:使用 Private Service Connect 发布服务
服务使用方操作步骤
客户端原则上只需要“创建端点”即可。
如果还需要进行 DNS 设置等其他操作,则会有额外的步骤,请参考以下文档以获取详细信息。
- 参考:使用 Private Service Connect 访问托管服务
Private Service Connect 后端
可以使用一种称为 Private Service Connect 后端的方法(以前称为“使用消费者 HTTP(S) 控制的 Private Service Connect 端点”)。
在这种情况下,服务使用方可以将外部 HTTP(S) 负载均衡器作为终端节点来使用。通过将其作为“私有服务连接 NEG”(网络端点组)的后端服务来实现。
这种方法的优点包括:“可以灵活地将服务映射到任意 URL”、“可以使用 Cloud Logging 记录所有请求”、“可以使用任意 SSL/TLS 证书”、“可以逐步将服务迁移到由私有服务连接托管的服务”。
更多详细信息,请参阅以下文档:
- 参考:Private Service Connect 后端简介
- 参考:初次使用私有服务连接 #4 第七层 PSC 篇
Private Service Connect 接口
Private Service Connect 接口与 Private Service Connect 端点的作用相反,它是从服务提供方向服务使用方建立通信路径的功能。
在服务使用方的子网中创建一个名为网络附件(network attachment)的组件。该组件会分配一个内部 IP 地址,用于中转来自服务提供方的通信。
服务提供方的计算引擎虚拟机(Compute Engine VM)至少需要配备两个网卡(NIC),其中一个作为 Private Service Connect 接口,用于与服务使用方(即客户方)进行通信。一台虚拟机最多可以创建七个 Private Service Connect 接口。
关于此功能的详细信息,请参考以下官方指南。
- 参考:Private Service Connect 接口简介