从集群的 VPC 外部连接到该集群

本页介绍了从 AlloyDB for PostgreSQL 集群配置的 Virtual Private Cloud (VPC) 外部连接到该集群的不同方式。本文假定您已创建 AlloyDB 集群

关于外部连接

AlloyDB 集群包含Google Cloud VPC 中的多个节点。创建集群时,您还可以在其中一个 VPC 与包含新集群的 Google 管理的 VPC 之间配置专用服务访问通道。借助此对等互连连接,您可以使用专用 IP 地址访问集群 VPC 上的资源,就像这些资源是您自己的 VPC 的一部分一样。

在某些情况下,您的应用必须从此关联的 VPC 外部连接到集群:

  • 您的应用在 Google Cloud 生态系统中的其他位置运行,而不是在您通过专用服务访问通道连接到集群的 VPC 外部运行。

  • 您的应用在 Google 网络外部的 VPC 上运行。

  • 您的应用在位于公共互联网其他位置的机器上“本地”运行。

在所有这些情况下,您都必须设置其他服务,才能启用这种与 AlloyDB 集群的外部连接。

外部连接解决方案摘要

根据您的需求,我们建议您使用以下两种常规解决方案建立外部连接:

  • 对于项目开发或原型设计,或者对于费用相对较低的生产环境,请在 VPC 中设置中间虚拟机 (VM)(也称为堡垒)。您可以使用多种方法将此中间虚拟机用作外部应用环境与 AlloyDB 集群之间的安全连接。

  • 对于需要高可用性的生产环境,请考虑通过 Cloud VPN 或 Cloud Interconnect 在 VPC 与应用之间建立永久连接

接下来的几个部分将详细介绍这些外部连接解决方案。

通过中间虚拟机连接

如需使用开源工具和最少的其他资源从 AlloyDB 集群的 VPC 外部建立连接,请在该 VPC 中设置的中间虚拟机上运行代理服务。您可以为此目的设置新的虚拟机,也可以使用 AlloyDB 集群 VPC 中已在运行的虚拟机。

作为自行管理的解决方案,使用中间虚拟机通常比使用 Network Connectivity 产品的费用更低且设置时间更短。中间虚拟机也存在一些缺点:连接的可用性、安全性和数据吞吐量都依赖于中间虚拟机,您必须将该虚拟机作为项目的一部分进行维护。

通过 IAP 连接

借助 Identity-Aware Proxy (IAP),您可以安全地连接到集群,而无需公开中间虚拟机的公共 IP 地址。您可以结合使用防火墙规则和 Identity and Access Management (IAM) 来限制通过此路由的访问。因此,IAP 非常适合用于非生产用途,例如开发和原型设计。

如需设置对集群的 IAP 访问权限,请按以下步骤操作:

  1. 在外部客户端上安装 Google Cloud CLI

  2. 准备您的项目进行 IAP TCP 转发

    定义新的防火墙规则时,请允许流向端口 22 (SSH) 的入站 TCP 流量。如果您使用的是启用了预填充的 default-allow-ssh 规则项目默认网络,则无需定义其他规则。

  3. 使用 SSH 通过 IAP 在外部客户端和中间虚拟机之间设置端口转发:

    gcloud compute ssh my-vm \
           --tunnel-through-iap \
           --zone=ZONE_ID \
           --ssh-flag="-L PORT_NUMBER:ALLOYDB_IP_ADDRESS:5432"

    替换以下内容:

    • ZONE_ID:集群所在可用区的 ID,例如 us-central1-a
    • ALLOYDB_IP_ADDRESS:您要连接到的 AlloyDB 实例的 IP 地址。
    • PORT_NUMBER:虚拟机的端口号。
  4. 在外部客户端上使用 psql 测试连接,使其连接到您在上一步中指定的本地端口。例如,如需以 postgres 用户角色连接到端口 5432,请使用以下命令:

    psql -h localhost -p 5432 -U USERNAME

    替换以下内容:

    • USERNAME:您要连接到实例的 PostgreSQL 用户,例如默认用户 postgres

通过 SOCKS 代理连接

在中间虚拟机上运行 SOCKS 服务可提供灵活可伸缩的 AlloyDB 集群连接,并由 AlloyDB Auth 代理提供端到端加密。通过适当的配置,您可以使其适用于生产工作负载。

此解决方案包括以下步骤:

  1. 在中间虚拟机上,安装、配置并运行 SOCKS 服务器。一个示例是 Dante,它是一种常用的开源解决方案。

    将服务器配置为绑定到虚拟机的 ens4 网络接口以用于外部和内部连接。指定您要用于内部连接的任意端口。

  2. 配置 VPC 的防火墙,以允许从相应 IP 地址或范围流向 SOCKS 服务器配置的端口的 TCP 流量。

  3. 在外部客户端上安装 AlloyDB Auth 代理

  4. 在外部客户端上运行 AlloyDB Auth 代理,并将 ALL_PROXY 环境变量设置为中间虚拟机的 IP 地址,并指定 SOCKS 服务器使用的端口。

    以下示例将 AlloyDB Auth 代理配置为通过在 198.51.100.1 的端口 1080 上运行的 SOCKS 服务器连接到 my-main-instance 上的数据库:

    ALL_PROXY=socks5://198.51.100.1:1080 ./alloydb-auth-proxy \
    /projects/PROJECT_ID/locations/REGION_ID/clusters/CLUSTER_ID/instances/INSTANCE_ID

    如果您要从对等互连 VPC 进行连接,可以使用中间虚拟机的内部 IP 地址;否则,请使用其外部 IP 地址。

  5. 在外部客户端上使用 psql 测试连接,使其连接到 AlloyDB Auth Proxy 监听的端口。例如,如需以 postgres 用户角色连接到端口 5432,请使用以下命令:

    psql -h IP_ADDRESS -p PORT_NUMBER -U USERNAME

通过 PostgreSQL 池程序连接

如果您需要在中间虚拟机而非外部客户端上安装并运行 AlloyDB Auth 代理,则可以通过将该代理与协议感知代理(也称为池程序)配对来启用与虚拟机的安全连接。常用的 PostgreSQL 开源池程序包括 Pgpool-IIPgBouncer

在此解决方案中,您需要同时在中间虚拟机上运行 AlloyDB Auth 代理和池程序。然后,您的客户端或应用可以通过 SSL 安全地直接连接到池程序,而无需运行任何其他服务。池程序会负责通过 Auth 代理将 PostgreSQL 查询传递给 AlloyDB 集群。

由于 AlloyDB 集群中的每个实例都有一个单独的内部 IP 地址,因此每个代理服务只能与一个特定实例(主实例、备用实例或读取池)通信。因此,您需要为集群中的每个实例运行一个使用适当配置的 SSL 证书的单独池程序服务。

通过 Cloud VPN 或 Cloud Interconnect 进行连接

对于需要高可用性 (HA) 的生产工作,我们建议使用 Google Cloud 网络连接产品:Cloud VPNCloud Interconnect,具体取决于外部服务的需求和网络拓扑。然后,您可以配置 Cloud Router 路由器来通告适当的路由。

虽然使用网络连接产品比设置中间虚拟机的过程更复杂,但这种方法可将正常运行时间和可用性方面的负担从您转移到 Google。特别是,高可用性 VPN 提供 99.99% 的服务等级协议 (SLA),非常适合生产环境。

借助网络连接解决方案,您无需在应用中维护单独的安全虚拟机,从而避免了这种方法固有的单点故障风险。

如需开始详细了解这些解决方案,请参阅选择 Network Connectivity 产品

后续步骤