GCP K8s节点可访问私有IP但Pod无法访问Cloud SQL的解决方法
GKE集群Pod无法通过私有IP访问Cloud SQL Postgres排查方案
节点可正常访问目标IP、Pod访问失败的核心原因是Pod流量的转发、路由或访问控制规则异常,按以下优先级排查:
基础连通性验证
- 进入故障Pod执行连通性测试:
nc -zv <Cloud SQL私有IP> 5432或telnet <Cloud SQL私有IP> 5432,确认报错是超时还是连接拒绝 - 在Pod所在节点执行抓包命令:
tcpdump -i any host <Cloud SQL私有IP> and port 5432 -nn,复现Pod访问操作:- 若能看到Pod发出的SYN包但无回包,故障点在回程路由或防火墙拦截
- 若完全看不到Pod发出的访问包,故障点在集群CNI、节点iptables或集群网络策略拦截
- 快速定位故障范围:启动hostNetwork模式的调试Pod执行
kubectl run -it --rm debug --image=busybox --restart=Never --hostNetwork=true --overrides='{"spec": {"nodeName": "<可正常访问Cloud SQL的节点名>"}}' -- sh,在该Pod内测试连通性,如果能正常访问,可直接排除节点侧配置问题,聚焦Pod网段相关的路由、防火墙规则排查。
GCP平台侧配置排查
该类故障80%以上为平台侧配置漏加Pod网段规则导致,优先排查
- 检查VPC路由连通性:确认GKE集群所在VPC与Cloud SQL私有IP所属VPC为同一VPC,或已建立VPC对等/私有服务访问(PSA)连接,且对等连接已开启路由转发,路由表中存在指向Pod CIDR段的有效路由。
- 检查VPC防火墙规则:
- 确认出站规则允许源为Pod CIDR段、目标为Cloud SQL私有IP的5432端口流量
- 确认入站规则允许Cloud SQL地址段与Pod CIDR段的5432端口双向流量
- 不要仅配置节点网段的放行规则,Pod跨节点访问外部地址时源IP为Pod IP而非节点IP
- 检查Cloud SQL实例配置:确认实例的私有IP访问控制未配置源IP拦截,未将Pod CIDR段加入拒绝列表;若开启了VPC流日志,可直接过滤Pod IP到Cloud SQL IP的流量记录,查看流量被丢弃的具体原因。
集群侧配置排查
- 检查集群网络策略:执行
kubectl get networkpolicy -A,查看故障Pod所在命名空间是否存在出站拦截规则,若有则添加对应规则,放行Pod到Cloud SQL私有IP 5432端口的出站流量。 - 检查节点转发规则:登录对应节点执行
iptables -L FORWARD -n -v | grep DROP,查看是否存在拦截Pod CIDR段到Cloud SQL地址的转发规则;若使用Calico等第三方CNI,同步检查CNI自身的访问控制规则是否存在拦截。 - 检查kube-proxy转发状态:若为iptables模式确认kube-proxy无异常重启、规则无篡改;若为IPVS模式执行
ipvsadm -ln查看是否存在错误规则将Cloud SQL IP的流量转发到集群内Service。 - 兜底检查节点转发参数:执行
sysctl net.ipv4.ip_forward确认返回值为1,若为0会导致跨网段Pod流量无法正常转发。
特殊场景适配
- 若使用GKE Dataplane V2:检查是否配置了基于Cilium的网络策略、FQDN过滤规则误拦截私有IP流量,可临时禁用对应策略测试连通性。
- 若通过私有服务访问(PSA)对接Cloud SQL:确认PSA侧导入的路由段包含GKE的Pod CIDR段,仅导入节点网段会导致Cloud SQL侧的回程流量无法路由到Pod。
内容的提问来源于stack exchange,提问作者Bal Krishna Jha
相关产品推荐
相关产品推荐

