Metabase Pod连接PostgreSQL超时故障求助(运行1年突发异常)
排查Metabase跨命名空间连接PostgreSQL超时故障
已知环境:
- Metabase Pod运行在
metabase命名空间 - PostgreSQL Pod运行在
db命名空间,Pod状态正常 - 配置稳定运行1年,无近期变更,突发连接超时故障
- 核心报错:
Failed to connect to database: Timed out after 5000 milliseconds
排查步骤
1. 验证跨命名空间DNS解析
跨命名空间访问依赖Kubernetes Service的DNS解析,先确认Metabase Pod能否正确解析PostgreSQL的Service地址:
# 替换<metabase-pod-name>为实际Pod名称,<postgres-service-name>为PostgreSQL的Service名称 kubectl exec -n metabase <metabase-pod-name> -- nslookup <postgres-service-name>.db.svc.cluster.local
- 如果解析失败:检查CoreDNS Pod状态(
kubectl get pods -n kube-system -l k8s-app=kube-dns),或是否有自定义DNS配置干扰。 - 如果解析成功,记录解析出的IP,下一步验证连通性。
2. 测试网络端口连通性
确认Metabase Pod能访问PostgreSQL的5432端口:
kubectl exec -n metabase <metabase-pod-name> -- telnet <postgres-service-name>.db.svc.cluster.local 5432 # 或用nc命令(如果镜像带nc) kubectl exec -n metabase <metabase-pod-name> -- nc -zv <postgres-service-name>.db.svc.cluster.local 5432
- 如果端口不通:
- 检查PostgreSQL的Service端点是否正常:
kubectl get endpoints -n db <postgres-service-name>,确认端点列表包含正常运行的PostgreSQL Pod IP。 - 检查是否存在NetworkPolicy规则阻断跨命名流量:
kubectl get networkpolicy -n db,确认允许metabase命名空间的Pod访问5432端口。 - 检查节点间网络是否正常,比如在Metabase所在节点ping PostgreSQL所在节点的IP。
- 检查PostgreSQL的Service端点是否正常:
3. 检查PostgreSQL自身连接限制
PostgreSQL可能因连接数耗尽或权限配置拒绝连接:
# 查看当前连接数(替换<username>、<db-name>为实际值) kubectl exec -n db <postgres-pod-name> -- psql -U <username> -d <db-name> -c "SELECT count(*) FROM pg_stat_activity;" # 查看pg_hba.conf配置,确认允许metabase命名空间IP段访问 kubectl exec -n db <postgres-pod-name> -- cat /var/lib/postgresql/data/pg_hba.conf
- 如果连接数接近
max_connections值,需调整PostgreSQL配置或清理闲置连接。 - 如果pg_hba.conf中没有允许
metabase命名空间的IP段,需添加类似规则:host all all <metabase-namespace-cidr> md5
4. 确认Metabase连接配置正确性
检查Metabase的数据库连接参数是否无误:
# 查看Metabase的数据库相关环境变量 kubectl exec -n metabase <metabase-pod-name> -- env | grep MB_DB
重点确认MB_DB_CONNECTION_URI格式是否正确:
postgresql://<db-user>:<db-pass>@<postgres-service-name>.db.svc.cluster.local:5432/<db-name>
注意是否存在拼写错误、密码过期或数据库名称变更(虽然配置未改,但可能有其他操作导致)。
5. 排查集群网络组件异常
如果以上步骤均正常,可能是集群网络插件(如Calico、Flannel)或CoreDNS出现临时故障:
# 重启CoreDNS Pod kubectl rollout restart deployment -n kube-system coredns # 检查网络插件Pod状态,以Calico为例 kubectl get pods -n calico-system
临时缓解方案
若需快速恢复服务,可临时调整Metabase的连接超时参数,将MB_DB_CONNECTION_TIMEOUT设置为更大的值(如10000毫秒),但需尽快找到根本原因。
内容的提问来源于stack exchange,提问作者ZAriel
相关产品推荐
相关产品推荐

