配置专用 IP

本页面介绍如何将 Cloud SQL 实例配置为使用专用 IP。

如需了解专用 IP 的工作原理以及环境和管理要求,请参阅专用 IP

准备工作

在将 Cloud SQL 实例配置为使用专用 IP 之前,您必须执行以下操作:

  • 为您的项目启用 Service Networking API

    如果您在使用的是共享 VPC 网络,则还需要执行以下操作:

    • 为宿主项目启用 Service Networking API。
    • 将您的用户添加到宿主项目中。
    • 为用户授予宿主项目中的 compute.networkAdmin IAM 角色。
  • 选择要使用的 VPC 网络

  • 只需一次:在 VPC 网络中配置专用服务访问通道,以分配 IP 地址范围并创建专用服务连接。这允许 VPC 网络中的资源连接到 Cloud SQL 实例。

    • 建立专用服务访问通道需要有 compute.networkAdmin IAM 角色。

      为您的网络建立专用服务访问通道后,您无需具有 compute.networkAdmin 角色就能将实例配置为使用专用 IP。

    • 如果您要为任何 Cloud SQL 实例使用专用 IP,只需为具有或需要连接到 Cloud SQL 实例的每个 Google Cloud 项目配置一次专用服务访问通道。如需了解详情,请参阅专用服务访问通道

当满足以下所有条件时,Cloud SQL 会为您配置专用服务访问通道:

  • 您尚未在该 Google Cloud 项目中配置专用服务访问通道。
  • 这是您第一次为 Google Cloud 项目中的任何 Cloud SQL 实例启用专用 IP。
  • 在实例的Connections页面中启用专用 IP 时,您选择了default关联网络和Use an automatically allocated IP range选项。

将实例配置为使用专用 IP

您可以在创建 Cloud SQL 实例时将实例配置为使用专用 IP,或对现有实例如此配置。

为新实例配置专用 IP

如需在创建 Cloud SQL 实例时将该实例配置为使用专用 IP,请执行以下操作:

控制台

  1. 转到 Google Cloud Console 中的“Cloud SQL 实例”页面。

    转到“Cloud SQL 实例”页面

  2. 点击创建实例
  3. 在“创建”向导的配置选项下方,展开连接部分。
  4. 选中专用 IP 复选框。

    下拉列表显示了项目中的可用 VPC 网络。如果您的项目是共享 VPC 的服务项目,则还会显示宿主项目的 VPC 网络。

  5. 选择您要使用的 VPC 网络:
  6. 如果您已配置专用服务访问通道,请执行以下操作:

    1. 选择您要使用的 VPC 网络。
    2. 点击连接
    3. 下拉列表会显示您分配的 IP 地址范围。

    4. 点击创建
    5. 点击保存

    如需让 Cloud SQL 为您分配范围并创建专用连接,请执行以下操作:

    1. 选择“默认”VPC 网络。
    2. 点击分配并连接
    3. 点击保存

gcloud

如果您之前没有为 Cloud SQL 配置专用服务访问通道,请按照以下说明执行此操作。创建 Cloud SQL 实例,并使用 --network 参数指定所选 VPC 网络的名称,使用 --no-assign-ip 标志停用公共 IP。

除非 VPC 网络是共享 VPC 网络,否则 --network 参数值的格式为:https://www.googleapis.com/compute/alpha/projects/[PROJECT_ID]/global/networks/[VPC_NETWORK_NAME]

如果 VPC 网络是共享 VPC 网络,则 --network 参数值的格式为 projects/HOST_PROJECT_ID/global/networks/VPC_NETWORK_NAME,其中 HOST_PROJECT_ID 为共享 VPC 宿主项目的名称,VPC_NETWORK_NAME 为共享 VPC 网络的名称。

gcloud --project=[PROJECT_ID] beta sql instances create [INSTANCE_ID]
       --network=[VPC_NETWORK_NAME]
       --no-assign-ip

为现有实例配置专用 IP

如果将现有的 Cloud SQL 实例配置为使用专用 IP,则会导致该实例重启,进而造成停机。

如需将现有实例配置为使用专用 IP,请执行以下操作:

控制台

  1. 转到 Google Cloud Console 中的“Cloud SQL 实例”页面。
    转到“Cloud SQL 实例”页面
  2. 点击实例名称,打开其概览页面。
  3. 选择连接标签页。
  4. 选中专用 IP 复选框。

    下拉列表会显示项目中可用的网络。如果您的项目是共享 VPC 的服务项目,则还会显示宿主项目的 VPC 网络。

  5. 如果您已配置专用服务访问通道,请执行以下操作:
    1. 选择您要使用的 VPC 网络
    2. 下拉列表会显示您分配的 IP 地址范围。

    3. 点击连接
    4. 点击保存
  6. 让 Cloud SQL 为您分配 IP 地址。
    1. 选择“默认”VPC 网络。
    2. 点击分配并连接
    3. 点击保存

gcloud

如果您之前没有为 Cloud SQL 配置专用服务访问通道,请按照以下说明执行此操作。更新 Cloud SQL 实例,并使用 --network 参数指定所选 VPC 网络的名称。

VPC_NETWORK_NAME 是所选 VPC 网络的名称,例如:my-vpc-network。--network 参数值的格式为:https://www.googleapis.com/compute/alpha/projects/[PROJECT_ID]/global/networks/[VPC_NETWORK_NAME]

gcloud --project=[PROJECT_ID] beta sql instances patch [INSTANCE_ID]
       --network=[VPC_NETWORK_NAME]
       --no-assign-ip

使用实例的专用 IP 连接到实例

您可以使用专用服务访问通道从同一 VPC 子网(此处定义为内部来源)中的 Compute Engine 或 Google Kubernetes Engine 实例或从该网络外部(外部来源)连接到 Cloud SQL 实例。

从内部来源连接

如需从您的 Cloud SQL 实例(例如 Compute Engine 资源上运行的 Cloud SQL 代理)所在的 Google Cloud 项目中的来源进行连接,该资源必须与 Cloud SQL 实例位于同一 VPC 网络中。

从外部来源连接

如果本地网络连接到 Cloud SQL 实例所连接的 VPC 网络,则您可以从本地网络中的客户端进行连接。如要允许来自本地网络的连接,请执行以下操作:

  1. 确保通过为专用互连合作伙伴互连使用 Cloud VPN 隧道或互连连接 (VLAN),将您的 VPC 网络连接到本地网络。
  2. 识别由专用服务连接生成的对等互连。请注意,您需要为使用的每种数据库引擎(MySQL、PostgreSQL、SQL Server)创建对等互连。
  3. 更新对等互连连接以交换自定义路由。
  4. 识别专用服务连接使用的分配范围
  5. 在管理 Cloud VPN 隧道或 Cloud Interconnect 连接 (VLAN) 的 BGP 会话的 Cloud Router 上,针对分配的范围创建 Cloud Router 自定义路由通告

从非 RFC 1918 地址连接

RFC 1918 指定分配给内部(即组织内)使用的 IP 地址,这些地址将不会在互联网上路由。具体包括:

  • 10.0.0.0/8
  • 172.16.0.0/12
  • 192.168.0.0/16

使用专用 IP 地址连接到 Cloud SQL 实例时会自动获得授权来使用 RFC 1918 地址范围。因此,所有专用客户端都可以在不经过代理的情况下访问数据库。

非 RFC 1918 地址范围(不在 RFC 1918 地址空间内的地址)必须配置为已获授权的网络

如需从非 RFC 1918 地址进行连接,您必须设置每个实例的 IP 授权,以允许来自非 RFC 1918 地址范围的流量。

例如,按照以下方式使用 gcloud 命令:

gcloud sql instances patch INSTANCE_NAME --authorized-networks 172.16.12.0/28,172.16.1.0/24,172.16.10.0/24,172.16.2.0/24,172.16.11.0/24,192.88.99.0/24,11.0.0.0/24

默认情况下,Cloud SQL 不会从 VPC 中获知非 RFC 1918 子网路由。您需要将网络对等互连更新到 Cloud SQL,以导出所有非 RFC 1918 路由。

gcloud compute networks peerings update cloudsql-mysql-googleapis-com --network=NETWORK --export-subnet-routes-with-public-ip --project=PROJECT
  • cloudsql-mysql-googleapis-com 是您的 VPC 网络页面中的 Private Service Connection 名称。

    选择您的网络,然后查找 Private Service Connection 部分。

  • NETWORK 为 VPC 网络的名称。

问题排查

点击表中的链接可查看详细信息:

针对此问题… 可能的原因… 请尝试以下操作…
Aborted connection 读取数据包时出错或连接已取消。 请参阅可以尝试的操作
Unauthorized to connect 错误。 可能存在多个根本原因 请参阅可以尝试的操作
网络关联失败。 未在项目中启用 Service Networking API 在项目中启用 Service Networking API
Remaining connection slots are reserved 已达到连接数上限。 增加 max_connections 标志
Set Service Networking service account as servicenetworking.serviceAgent role on consumer project 服务帐号的网络权限缺失或不正确。 停用 Service Networking API 并重新启用
error x509: certificate is not valid for any names, but wanted to match project-name:db-name 已知问题:Cloud SQL Proxy Dialer 目前与 Go 1.15 不兼容。 在问题获得修复之前,请参阅 GitHub 上的这一讨论,其中包括了解决方法。

连接被取消

您看到错误消息 Got an error reading communication packetsAborted connection xxx to db: DB_NAME

可能的问题

  • 网络不稳定。
  • 没有对 TCP keep-alive 命令的响应(客户端或服务器无响应,可能超载)。
  • 超出了数据库引擎的连接生命周期,服务器终止了该连接。

可以尝试的操作

应用必须能够容忍网络故障并遵循最佳做法,例如连接池和重试。大多数连接池程序会尽可能捕获这些错误。否则,应用必须正常重试或失败。

对于连接重试,我们建议使用以下方法:

  1. 指数退避算法。以指数方式增加每次重试之间的时间间隔。
  2. 另外,增加随机退避时间。
结合使用这些方法有助于减少限制。


没有连接权限

您看到错误消息 Unauthorized to connect

可能的问题

由于在多个级层进行授权,因此可能存在多个原因。

  • 在数据库级层,数据库用户必须存在且其密码必须一致。
  • 在项目级,用户可能缺少正确的 IAM 权限。
  • 在 Cloud SQL 级层,根本原因可能取决于您连接到实例的方式。如果您要通过公共 IP 直接连接到实例,则连接的来源 IP 必须在实例已获授权的网络中。

    默认允许专用 IP 连接,除非您从非 RFC 1918 地址进行连接。非 RFC 1918 客户端地址必须配置为已获授权的网络

    默认情况下,Cloud SQL 不会从 VPC 中获知非 RFC 1918 子网路由。您需要将网络对等互连更新到 Cloud SQL,以导出所有非 RFC 1918 路由。例如:

    gcloud compute networks peerings update cloudsql-mysql-googleapis-com --network=NETWORK --export-subnet-routes-with-public-ip --project=PROJECT
    

    如果您要通过 Cloud SQL 代理进行连接,请确保正确设置了 IAM 权限

  • 在网络级层,如果 Cloud SQL 实例使用公共 IP 地址,则连接的来源 IP 地址必须在已获授权的网络中。

可以尝试的操作

  • 检查用户名和密码。
  • 检查用户的 IAM 角色和权限。
  • 如果使用公共 IP,请确保来源在已获授权的网络中。

网络关联失败

您看到错误消息 Error: Network association failed due to the following error:在使用方项目中将 Service Networking 服务帐号设置为 servicenetworking.serviceAgent 角色。

可能的问题

未在项目中启用 Service Networking API

可以尝试的操作

在您的项目中启用 Service Networking API。如果您在尝试为 Cloud SQL 实例分配专用 IP 地址时看到此错误并且您使用共享 VPC,则还需要为宿主项目启用 Service Networking API


剩余连接槽已预留

您看到错误消息 FATAL: remaining connection slots are reserved for non-replication superuser connections

可能的问题

已达到连接数上限。

可以尝试的操作

修改 max_connections 标志的值。如果将 max_connections 增加到超过特定值,则可能会导致失去服务等级协议 (SLA) 支持


在使用方项目中将 Service Networking 服务帐号设置为 servicenetworking.serviceAgent 角色

您看到错误消息 set Service Networking service account as servicenetworking.serviceAgent role on consumer project.

可能的问题

用户或服务帐号权限不正确。自动设置脚本(例如 Terraform 配置脚本)中可能会发生这种情况。

可以尝试的操作

如需修复服务权限,请停用 Service Networking API,等待五分钟,然后重新启用。

您还可以尝试使用这些 gcloud 命令为项目分配角色

gcloud beta services identity create --service=servicenetworking.googleapis.com --project=project-id
gcloud projects add-iam-policy-binding project-id --member="service-account-prefix@service-networking.iam.gserviceaccount.com" --role="roles/servicenetworking.serviceAgent"

错误 x509:证书对任何名称均无效

您看到错误消息 error x509: certificate is not valid for any names, but wanted to match project-name:db-name

可能的问题…

已知问题:Cloud SQL Proxy Dialer 目前与 Go 1.15 不兼容。

可以尝试的操作

在错误获得修复之前,请参阅 GitHub 上的这一讨论,其中包括了解决方法。


后续步骤