如何从Google Kubernetes Engine(GKE)访问Cloud SQL?
GKE Autopilot访问Cloud SQL(PostgreSQL)故障解决方案
核心问题说明
你配置的LoadBalancer外部IP是GKE服务的入站流量IP,GKE Pod主动对外发起连接的源IP并非该地址,因此添加该IP到Cloud SQL白名单无法生效。以下按优先级给出可落地的解决方案:
方案1:Cloud SQL Auth Proxy(官方推荐,安全性最高,无需配置白名单)
这是GCP官方推荐的GKE访问Cloud SQL的方案,全程走加密内网,无需暴露数据库到公网。
- 给GKE工作负载使用的ServiceAccount绑定
roles/cloudsql.client权限,命令参考:gcloud projects add-iam-policy-binding 你的项目ID --member="serviceAccount:你的工作负载服务账号邮箱" --role="roles/cloudsql.client" - 在Deployment配置中新增Cloud SQL Auth Proxy作为Sidecar容器,镜像使用
gcr.io/cloudsql-docker/gce-proxy:1.33.2,启动参数配置为:/cloud_sql_proxy -instances=你的项目ID:实例所在区域:实例名=tcp:0.0.0.0:5432 - 修改应用内的数据库连接地址为
127.0.0.1:5432,数据库账号、密码、库名等其他配置保持不变即可。
方案2:VPC私有IP访问(适合同VPC内资源互访场景)
- 给Cloud SQL实例开启私有IP,选择和GKE Autopilot集群相同的VPC网络
- 在Cloud SQL的授权网络配置中,添加GKE集群的Pod网段、节点网段为允许访问的来源
- 应用内的数据库连接地址直接填写Cloud SQL的私有IP即可,无需走公网链路。
方案3:公网访问修正配置(不推荐,安全性低)
如果必须使用公网连接Cloud SQL,按以下步骤配置:
- 给GKE集群所在的VPC配置Cloud NAT,绑定固定的公网IP段
- 将Cloud NAT绑定的固定IP段添加到Cloud SQL的公网白名单中
- 应用内的数据库连接地址填写Cloud SQL的公网IP即可。
通用排查项
- 确认Cloud SQL实例的对应访问方式(公网/私有IP)已开启
- 可进入GKE的Pod中执行
nc 数据库连接地址 5432测试网络连通性,区分是网络问题还是应用配置问题 - 核对应用内的数据库连接串的账号、密码、端口、库名参数是否和Cloud SQL配置一致
内容的提问来源于stack exchange,提问作者Hyeonkyu Han
相关产品推荐
相关产品推荐

