本页面介绍如何将 Cloud SQL 实例配置为使用专用 IP。
如需了解专用 IP 的工作原理以及环境和管理要求,请参阅专用 IP。
准备工作
API 和 IAM 要求
- 您必须为 Google Cloud 项目启用 Service Networking API。
- 为了管理专用服务访问通道连接,用户必须拥有以下 Identity and Access Management (IAM) 权限。如果您没有所需的权限,则可能会出现权限不足错误。
compute.networks.list
compute.addresses.create
compute.addresses.list
servicenetworking.services.addPeering
如果您使用的是共享 VPC 网络,则还需要将用户添加到宿主项目,并在宿主项目上将相同权限分配给用户。
如果您使用的是共享 VPC 网络,还需要为宿主项目启用此 API。
专用服务访问通道
在项目中创建新的 Virtual Private Cloud (VPC) 网络时,您需要配置专用服务访问通道以分配 IP 地址范围并创建专用服务连接。这使 VPC 网络中的资源能够连接到 Cloud SQL 实例。Google Cloud 控制台提供了一个向导,可帮助您设置此配置。
将实例配置为使用专用 IP
您可以在创建 Cloud SQL 实例时将实例配置为使用专用 IP,或对现有实例如此配置。
为新实例配置专用 IP
如需在创建 Cloud SQL 实例时将该实例配置为使用专用 IP,请执行以下操作:
控制台
-
在 Google Cloud 控制台中,转到 Cloud SQL 实例页面。
- 点击创建实例。
- 展开显示配置选项。
- 展开连接。
- 选择专用 IP。
下拉列表显示了项目中的可用 VPC 网络。如果项目是共享 VPC 的服务项目,则还会显示宿主项目中的 VPC 网络。
- 选择您要使用的 VPC 网络。
- 点击设置连接。
- 在分配 IP 范围部分中,选择以下选项之一:
- 从下拉列表中选择一个或多个现有的 IP 地址范围,或者创建一个新的 IP 地址范围。下拉列表包含先前分配的范围(若有),或者您可以选择分配新 IP 范围,然后输入新范围和名称。
- 在网络中使用自动分配的 IP 地址范围。
- 点击继续。
- 点击创建连接。
- 验证您是否看到以下消息:
Private service connection for network VPC_NETWORK_NAME has been successfully created
。 - (可选)您可以为实例指定分配的 IP 地址范围以用于连接。
- 展开显示分配的 IP 范围选项。
- 从下拉菜单中选择一个 IP 地址范围。
- 完成实例配置。
- 点击创建实例。
如果您看到一条消息,提示您需要设置专用服务连接,请执行以下操作:
gcloud
在使用专用 IP 地址创建实例之前,请确保您的项目已针对专用服务访问通道进行了配置。
在使用任何请求数据之前,请先进行以下替换:
INSTANCE_ID
:实例 IDPROJECT_ID
:项目 IDNETWORK_PROJECT_ID
:VPC 网络的项目 IDVPC_NETWORK_NAME
:VPC 网络的名称RANGE_NAME
:可选。如果指定此标志,则系统会设置为其分配 IP 地址范围的范围名称。范围名称必须符合RFC-1035
并且包含 1-63 个字符。REGION_NAME
:区域名称
--network
参数。如需停用公共 IP 地址,请使用 --no-assign-ip
标志。
gcloud beta sql instances create INSTANCE_ID \ --project=PROJECT_ID \ --network=projects/NETWORK_PROJECT_ID/global/networks/VPC_NETWORK_NAME \ --no-assign-ip \ --allocated-ip-range-name=RANGE_NAME
Terraform
如需为新实例配置专用 IP,请使用以下 Terraform 资源:
google_compute_network
google_compute_global_address
google_service_networking_connection
google_sql_database_instance
应用更改
如需在 Google Cloud 项目中应用 Terraform 配置,请完成以下部分中的步骤。
准备 Cloud Shell
- 启动 Cloud Shell。
-
设置要在其中应用 Terraform 配置的默认 Google Cloud 项目。
您只需为每个项目运行一次以下命令,即可在任何目录中运行它。
export GOOGLE_CLOUD_PROJECT=PROJECT_ID
如果您在 Terraform 配置文件中设置显式值,则环境变量会被替换。
准备目录
每个 Terraform 配置文件都必须有自己的目录(也称为“根模块”)。
-
在 Cloud Shell 中,创建一个目录,并在该目录中创建一个新文件。文件名必须具有
.tf
扩展名,例如main.tf
。在本教程中,该文件称为main.tf
。mkdir DIRECTORY && cd DIRECTORY && touch main.tf
-
如果您按照教程进行操作,可以在每个部分或步骤中复制示例代码。
将示例代码复制到新创建的
main.tf
中。(可选)从 GitHub 中复制代码。如果端到端解决方案包含 Terraform 代码段,则建议这样做。
- 查看和修改要应用到您的环境的示例参数。
- 保存更改。
-
初始化 Terraform。您只需为每个目录执行一次此操作。
terraform init
(可选)如需使用最新的 Google 提供程序版本,请添加
-upgrade
选项:terraform init -upgrade
应用更改
-
查看配置并验证 Terraform 将创建或更新的资源是否符合您的预期:
terraform plan
根据需要更正配置。
-
通过运行以下命令并在提示符处输入
yes
来应用 Terraform 配置:terraform apply
等待 Terraform 显示“应用完成!”消息。
- 打开您的 Google Cloud 项目以查看结果。在 Google Cloud 控制台的界面中找到资源,以确保 Terraform 已创建或更新它们。
删除更改
如需删除更改,请执行以下操作:
- 如需停用删除防护,请在 Terraform 配置文件中将
deletion_protection
参数设置为false
。deletion_protection = "false"
- 运行以下命令并在提示符处输入
yes
,以应用更新后的 Terraform 配置:terraform apply
-
运行以下命令并在提示符处输入
yes
,以移除之前使用 Terraform 配置应用的资源:terraform destroy
REST v1
创建使用专用 IP 地址的新实例:
在使用任何请求数据之前,请先进行以下替换:
- PROJECT_ID:项目 ID
- INSTANCE_ID:实例 ID
- VPC_NETWORK_NAME:指定要用于此实例的 Virtual Private Cloud (VPC) 网络的名称。该网络必须已配置专用服务访问通道。
- RANGE_NAME:可选。如果指定此标志,则系统会设置为其分配 IP 地址范围的范围名称。范围名称必须符合
RFC-1035
并且包含 1-63 个字符。 - AUTHORIZED_NETWORKS:对于公共 IP 连接,请指定可连接到实例的已获授权网络的连接。
对于 ipv4Enabled
参数,如果您为实例使用公共 IP 地址,请将值设置为 true
;如果实例具有专用 IP 地址,请将值设置为 false
。
HTTP 方法和网址:
POST https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/instances
请求 JSON 正文:
{ "name": "INSTANCE_ID", "region": "region", "databaseVersion": "database-version", "settings": { "tier": "machine-type", "ipConfiguration": { "ipv4Enabled": false, "privateNetwork": "projects/PROJECT_ID/global/networks/VPC_NETWORK_NAME", "allocatedIpRange": "RANGE_NAME" "authorizedNetworks": [AUTHORIZED_NETWORKS], } } }
如需发送您的请求,请展开以下选项之一:
您应该收到类似以下内容的 JSON 响应:
REST v1beta4
创建使用专用 IP 地址的新实例:
在使用任何请求数据之前,请先进行以下替换:
- PROJECT_ID:项目 ID
- INSTANCE_ID:实例 ID
- VPC_NETWORK_NAME:指定要用于此实例的 Virtual Private Cloud (VPC) 网络的名称。该网络必须已配置专用服务访问通道。
- RANGE_NAME:可选。如果指定此标志,则系统会设置为其分配 IP 地址范围的范围名称。范围名称必须符合
RFC-1035
并且包含 1-63 个字符。 - AUTHORIZED_NETWORKS:对于公共 IP 连接,请指定可连接到实例的已获授权网络的连接。
对于 ipv4Enabled
参数,如果您为实例使用公共 IP 地址,请将值设置为 true
;如果实例具有专用 IP 地址,请将值设置为 false
。
HTTP 方法和网址:
POST https://sqladmin.googleapis.com/v1beta4/projects/PROJECT_ID/instances
请求 JSON 正文:
{ "name": "INSTANCE_ID", "region": "region", "databaseVersion": "database-version", "settings": { "tier": "machine-type", "ipConfiguration": { "ipv4Enabled": false, "privateNetwork": "projects/PROJECT_ID/global/networks/VPC_NETWORK_NAME", "allocatedIpRange": "RANGE_NAME" "authorizedNetworks": [AUTHORIZED_NETWORKS], } } }
如需发送您的请求,请展开以下选项之一:
您应该收到类似以下内容的 JSON 响应:
为现有实例配置专用 IP
如果将现有的 Cloud SQL 实例配置为使用专用 IP,则会导致该实例重启,进而造成停机。
要将现有实例配置为使用专用 IP,请执行以下操作:
控制台
-
在 Google Cloud 控制台中,转到 Cloud SQL 实例页面。
- 如需打开实例的概览页面,请点击实例名称。
- 从 Cloud SQL 导航菜单中选择连接。
- 在网络标签页上,选中专用 IP 复选框。
下拉列表会显示项目中可用的网络。
- 选择您要使用的 VPC 网络:
- 点击设置连接。
- 在分配 IP 范围部分,选择以下选项之一:
- 从下拉列表中选择一个或多个现有的 IP 地址范围,或者创建一个新的 IP 地址范围。下拉列表包含先前分配的范围(若有),或者您可以选择分配新 IP 范围,然后输入新范围和名称。
- 在网络中使用自动分配的 IP 地址范围。
- 点击继续。
- 点击创建连接。
- 确认您看到已成功为网络
VPC_NETWORK_NAME
创建专用服务连接状态。 - 点击保存。
如果您看到必须提供专用服务连接:
gcloud
确保已为您的项目配置专用服务访问通道。
通过使用 --network
参数指定所选 VPC 网络的名称来更新 Cloud SQL 实例。
gcloud beta sql instances patch INSTANCE_ID \ --project=PROJECT_ID \ --network=projects/NETWORK_PROJECT_ID/global/networks/VPC_NETWORK_NAME \ --no-assign-ip
REST v1
创建使用专用 IP 地址的新实例:
在使用任何请求数据之前,请先进行以下替换:
- PROJECT_ID:项目 ID
- INSTANCE_ID:实例 ID
- VPC_NETWORK_NAME:指定要用于此实例的 Virtual Private Cloud (VPC) 网络的名称。该网络必须已配置专用服务访问通道。
- RANGE_NAME:可选。如果指定此标志,则系统会设置为其分配 IP 地址范围的范围名称。范围名称必须符合
RFC-1035
并且包含 1-63 个字符。 - AUTHORIZED_NETWORKS:对于公共 IP 连接,请指定可连接到实例的已获授权网络的连接。
对于 ipv4Enabled
参数,如果您为实例使用公共 IP 地址,请将值设置为 true
;如果实例具有专用 IP 地址,请将值设置为 false
。
HTTP 方法和网址:
PATCH https://sqladmin.googleapis.com/sql/v1/projects/PROJECT_ID/instances/INSTANCE_ID
请求 JSON 正文:
{ "settings": { "ipConfiguration": { "ipv4Enabled": false, "privateNetwork": "projects/PROJECT_ID/global/networks/VPC_NETWORK_NAME", "allocatedIpRange": "RANGE_NAME" "authorizedNetworks": [AUTHORIZED_NETWORKS], } } }
如需发送您的请求,请展开以下选项之一:
您应该收到类似以下内容的 JSON 响应:
REST v1beta4
创建使用专用 IP 地址的新实例:
在使用任何请求数据之前,请先进行以下替换:
- PROJECT_ID:项目 ID
- INSTANCE_ID:实例 ID
- VPC_NETWORK_NAME:指定要用于此实例的 Virtual Private Cloud (VPC) 网络的名称。该网络必须已配置专用服务访问通道。
- RANGE_NAME:可选。如果指定此标志,则系统会设置为其分配 IP 地址范围的范围名称。范围名称必须符合
RFC-1035
并且包含 1-63 个字符。 - AUTHORIZED_NETWORKS:对于公共 IP 连接,请指定可连接到实例的已获授权网络的连接。
对于 ipv4Enabled
参数,如果您为实例使用公共 IP 地址,请将值设置为 true
;如果实例具有专用 IP 地址,请将值设置为 false
。
HTTP 方法和网址:
PATCH https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/instances/INSTANCE_ID
请求 JSON 正文:
{ "settings": { "ipConfiguration": { "ipv4Enabled": false, "privateNetwork": "projects/PROJECT_ID/global/networks/VPC_NETWORK_NAME", "allocatedIpRange": "RANGE_NAME" "authorizedNetworks": [AUTHORIZED_NETWORKS], } } }
如需发送您的请求,请展开以下选项之一:
您应该收到类似以下内容的 JSON 响应:
使用实例的专用 IP 连接到实例
您可以使用专用服务访问通道从同一 VPC 子网(此处定义为内部来源)中的 Compute Engine 或 Google Kubernetes Engine 实例或从该网络外部(外部来源)连接到 Cloud SQL 实例。
从内部来源连接
如需从 Cloud SQL 实例所在的 Google Cloud 项目中的来源(例如 Compute Engine 资源上运行的 Cloud SQL Auth 代理)进行连接,该资源必须位于已为 Cloud SQL 实例建立专用服务访问通道的同一 VPC 网络中。
如需从无服务器来源(例如 App Engine 标准环境、Cloud Run 或 Cloud Run functions 进行连接,您的应用或函数将通过无服务器 VPC 访问通道直接连接到您的实例,而无需使用 Cloud SQL Auth 代理。
从外部来源连接
如果外部网络(例如本地网络或 VPC 网络)连接到 Cloud SQL 实例所连接的 VPC 网络,您可以使用 Cloud VPN 或 Cloud Interconnect 从外部网络中的客户端连接到该实例。
如需允许从外部网络进行连接,请执行以下操作:
- 确保您的 VPC 网络已使用 Cloud VPN 隧道或者用于专用互连或合作伙伴互连的 VLAN 连接来连接到外部网络。
- 确保管理 Cloud VPN 隧道和 Cloud Interconnect 连接 (VLAN) 的 Cloud Router 路由器上的边界网关协议 (BGP) 会话已收到来自本地网络的特定前缀(目的地)。
默认路由(目的地 0.0.0.0/0)无法导入到 Cloud SQL VPC 网络中,因为该网络有自己的本地默认路由。即使 Cloud SQL 对等互连配置为从 VPC 网络导入自定义路由,也会始终使用目的地的本地路由。
- 识别由专用服务连接生成的对等互连连接。根据服务的不同,专用服务连接可能会创建以下一个或多个对等互连连接,但不一定会全部创建:
cloudsql-mysql-googleapis-com
cloudsql-postgres-googleapis-com
servicenetworking-googleapis-com
- 更新所有对等互连连接以启用导出自定义路由功能。
- 识别专用服务连接使用的分配范围。
- 在管理 Cloud VPN 隧道或 Cloud Interconnect 连接 (VLAN) 的 BGP 会话的 Cloud Router 路由器上,针对分配的范围配置 Cloud Router 路由器自定义通告模式。
从云端 Shell 连接
Cloud Shell 不支持连接到仅具有专用 IP 地址的 Cloud SQL 实例。
从非 RFC 1918 IP 地址连接
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 IP 地址进行连接,您必须设置每个实例的 IP 授权,以允许来自非 RFC 1918 IP 地址范围的流量。
例如,按照以下方式使用 gcloud
命令:
gcloud sql instances patch INSTANCE_NAME \ --authorized-networks=192.88.99.0/24,11.0.0.0/24
默认情况下,Cloud SQL 不会从 VPC 网络获知非 RFC 1918 子网路由。您需要将网络对等互连更新到 Cloud SQL,以导出所有非 RFC 1918 路由。
gcloud compute networks peerings update PEERING_CONNECTION \ --network=VPC_NETWORK_NAME \ --export-subnet-routes-with-public-ip \ --project=PROJECT_ID
PEERING_CONNECTION
是 VPC 网络与服务提供方网络之间的专用服务连接生成的对等互连连接的名称。VPC_NETWORK_NAME
为 VPC 网络的名称。PROJECT_ID
是 VPC 网络的项目的 ID。 如果您使用的是共享 VPC,请使用宿主项目 ID。
请替换以下内容:
为了缓解 IP 地址耗尽问题,您可以使用以不公开方式使用的公共 IP 地址。
从以非公开方式使用的公共 IP 地址连接
如果您要在以非公开方式使用的公共 IP 地址范围中配置实例,请在您的网络与 Cloud SQL 网络之间的网络对等互连上启用 export-subnet-routes-with-public-ip
。
gcloud compute networks peerings update PEERING_CONNECTION \ --network=VPC_NETWORK_NAME \ --export-subnet-routes-with-public-ip \ --project=PROJECT_ID
PEERING_CONNECTION
是 VPC 网络与服务提供方网络之间的专用服务连接生成的对等互连连接的名称。如需知道对等互连连接的名称,请进入 VPC 网络对等互连页面。VPC_NETWORK_NAME
为 VPC 网络的名称。PROJECT_ID
是 VPC 网络的项目的 ID。如果您使用的是共享 VPC,请使用宿主项目 ID。
请替换以下内容:
连接到配置了以非公开方式使用的公共 IP 地址的实例
如果在以非公开方式使用的公共 IP 地址范围中配置了实例并且您希望连接到该实例,请在您的网络与 Cloud SQL 网络之间的网络对等互连上启用 import-subnet-routes-with-public-ip
。
gcloud compute networks peerings update PEERING_CONNECTION \ --network=VPC_NETWORK_NAME \ --import-subnet-routes-with-public-ip \ --project=PROJECT_ID
PEERING_CONNECTION
是 VPC 网络与服务提供方网络之间的专用服务连接生成的对等互连连接的名称。如需知道对等互连连接的名称,请进入 VPC 网络对等互连页面。VPC_NETWORK_NAME
为 VPC 网络的名称。PROJECT_ID
是 VPC 网络的项目的 ID。如果您使用的是共享 VPC,请使用宿主项目 ID。
请替换以下内容:
使用写入端点进行连接
除了专用 IP 地址之外,您还可以在 SQL 连接字符串中使用写入端点。写入端点是一个域名服务 (DNS) 名称,它会解析为主实例的 IP 地址。通过使用写入端点,您可以避免在发生区域级服务中断时不得不更改应用连接。
如果副本发生故障转移或切换,写入端点可以帮助管理实例的专用 IP 地址。发生这种情况时,请使用写入端点连接到充当主实例的实例。
Cloud SQL 如何创建写入端点
如果您为 Google Cloud 项目启用 Cloud DNS API,然后创建 Cloud SQL 企业 Plus 版主实例、提升实例的副本或将实例从 Cloud SQL 企业版升级,Cloud SQL 会自动生成写入端点并将其分配给实例。
如需详细了解如何获取实例的写入端点,请参阅查看实例信息。
为实例分配写入端点
如果您未为 Google Cloud 项目启用 Cloud DNS API,然后创建、提升或升级实例,Cloud SQL 不会自动为实例分配写入端点。
如需让 Cloud SQL 生成写入端点并将其分配给实例,请完成以下步骤:
- 启用 Cloud DNS API。
控制台
-
在 Google Cloud 控制台中,转到 API 页面。
- 点击 Cloud DNS API。
- 启用该 API。
gcloud
点击以下按钮打开 Cloud Shell,以通过命令行直接在浏览器中访问 Google Cloud 资源。
如需启用 API,请运行以下
gcloud services enable
命令:gcloud services enable dns.googleapis.com
-
创建已启用高级灾难恢复的副本。因此,Cloud SQL 会生成写入端点并将其分配给实例。
- 如需检索写入端点,请使用
gcloud sql instances describe
命令:gcloud sql instances describe INSTANCE_NAME | grep psaWriteEndpoint
将 INSTANCE_NAME 替换为您的 Cloud SQL 实例的名称。
问题排查
请参阅问题排查以了解已知的连接问题,并参阅调试连接问题以获取自助诊断方面的帮助。
后续步骤
- 详细了解专用 IP。
- 详细了解专用服务访问通道。
- 了解如何使用 VPC Service Controls 添加服务边界。
- 详细了解如何配置专用服务访问通道。
- 详细了解如何为 Cloud SQL 配置专用服务访问通道。
- 详细了解 Cloud VPN。
- 详细了解 VPC 网络。
- 详细了解 VPC 网络对等互连。
- 详细了解共享 VPC。