配置GCP Cloud MySQL Proxy网络策略后数据库连接失败排查
问题分析与解决方案
核心问题定位
你的Network Policy配置存在两处关键问题:
- 冗余端口开放:错误添加了
3306/TCP端口,这是cloudsql-proxy在Pod内部监听的端口,应用容器连接localhost:3306属于Pod内部流量,不受出站Network Policy限制,完全无需开放。 - 元数据服务规则不明确:你添加的第二个egress规则允许到
169.254.169.254/32的所有端口,但部分CNI插件(如Calico)需要明确指定端口才能生效;同时规则拆分的逻辑导致流量匹配异常,最终阻止了cloudsql-proxy访问GCP元数据服务(端口80),这就是错误日志中dial tcp 169.254.169.254:80: i/o timeout的原因。
修正后的Network Policy配置
kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: name: {{ template "name" . }} spec: podSelector: matchLabels: app: {{ template "name" . }} policyTypes: - Egress egress: # 允许DNS解析(对接集群内部DNS服务) - ports: - port: 53 protocol: UDP - port: 53 protocol: TCP # 允许访问sqladmin.googleapis.com(443)和Cloud SQL实例(3307) - ports: - port: 443 protocol: TCP - port: 3307 protocol: TCP # 允许访问GCP元数据服务(获取服务账号权限凭证) - to: - ipBlock: cidr: 169.254.169.254/32 ports: - port: 80 protocol: TCP
配置说明
- 拆分egress规则,每个规则对应一类业务流量,逻辑清晰易维护。
- 明确指定元数据服务的
80/TCP端口,确保cloudsql-proxy能正常获取权限凭证。 - 移除无用的
3306/TCP端口,缩小出站流量范围,提升安全性。
验证步骤
- 应用修正后的配置:
kubectl apply -f <your-network-policy-file>.yaml - 查看cloudsql-proxy容器日志,确认元数据服务访问错误消失:
kubectl logs <pod-name> -c cloudsql-proxy - 测试应用与数据库的连接是否恢复正常。
内容的提问来源于stack exchange,提问作者Tim Schwalbe
相关产品推荐
相关产品推荐

