Kubernetes集群内其他Pod无法连接PostgreSQL实例故障排查求助
故障原因定位
核心原因:PostgreSQL默认仅监听本地回环地址
你提供的postgresql.conf未配置listen_addresses参数,PostgreSQL服务默认该参数值为localhost,仅接受容器本地127.0.0.1的连接请求:
- 本地端口转发本质是将外部请求转发到Pod本地回环地址的5432端口,符合监听规则,因此可以正常连通
- 集群内其他Pod通过Service或Postgres Pod IP访问时,请求来源为集群内的Pod IP,不在默认监听范围内,直接被拒绝,返回Connection Refused错误
其他问题排除验证
你可以先执行以下操作确认没有其他配置问题:
- 执行
kubectl get endpoints postgres,确认Endpoint已正确绑定PostgreSQL Pod的IP和5432端口,从你的报错日志看已经可以解析到postgres服务对应的192.168.152.97,说明Service、DNS配置无异常 - 你的
pg_hba.conf配置了hostssl all all all md5,允许所有来源的SSL连接,认证规则无问题 - 集群内MySQL服务可以正常访问,说明集群网络、全局网络策略无限制
解决方案
- 修改
postgresql.conf新增监听配置
在现有配置基础上添加以下参数:
# 监听所有IPv4地址,也可配置为集群Pod CIDR段缩小访问范围 listen_addresses = '0.0.0.0' port = 5432
- 重新加载ConfigMap并重启PostgreSQL Pod
更新ConfigMap后执行以下命令重启服务生效:
kubectl create configmap postgres --from-file=postgres-config/ -o yaml --dry-run=client | kubectl apply -f - kubectl rollout restart deployment postgres
- 测试连接(适配SSL配置)
你开启了PostgreSQL强制SSL验证,集群内客户端连接时需要显式指定SSL模式,测试命令如下:
psql "host=postgres user=testuser sslmode=require"
如果不需要强制SSL验证,也可以在postgresql.conf中设置ssl = off临时测试连通性。
可选优化
你的Deployment配置中添加了hostPort: 5432,该配置会占用Pod调度节点的5432端口,若无外部系统直接通过宿主机IP访问PostgreSQL的需求,建议删除该配置,避免端口冲突导致Pod调度失败。
内容的提问来源于stack exchange,提问作者The Kaese
相关产品推荐
相关产品推荐

