Spring Boot无法连接Kubernetes中PostgreSQL StatefulSet问题求助
问题排查与解决方案
初始配置UnknownHostException根因
最早的无头服务配置存在标签匹配错误:
- 无头服务
ecom-db-h的selector规则为app: ecom-db - PostgreSQL StatefulSet的Pod模板标签为
app: postgresql-db
服务未匹配到任何后端Pod,K8s CoreDNS不会生成对应DNS解析记录,因此直接抛出UnknownHostException。
补充:无头服务并非不适用于数据库连接场景,如果你需要访问特定的PostgreSQL实例(如主从架构下单独连主库),可以使用<StatefulSet实例名>.<无头服务名>的DNS格式访问单实例,普通ClusterIP服务更适合统一负载均衡的访问入口。
调整为ClusterIP服务后异常根因
调整配置后存在多类问题,按优先级排序:
- 端口配置不匹配
你定义的db-svc配置中port字段为80,但JDBC URL未指定端口,PostgreSQL驱动默认会访问5432端口,导致端口不匹配无法建立连接。建议直接将服务端口与PostgreSQL默认端口对齐,减少配置复杂度:
apiVersion: v1 kind: Service metadata: name: db-svc spec: ports: - name: pgql port: 5432 targetPort: 5432 protocol: TCP selector: app: db
调整后JDBC URL无需额外加端口,保持现有配置即可。
2. DNS缓存问题
你查询到的db-svc实际ClusterIP为10.108.39.189,但nslookup返回的IP为10.107.101.52,说明服务曾被重建,CoreDNS记录已更新,但现有CrashLoopBackOff的Spring Boot Pod还残留旧DNS缓存。直接删除现有异常的Spring Boot Pod,让ReplicaSet重建新Pod即可拉取最新DNS记录。
3. 集群网络连通性问题
如果上述配置调整后仍出现连接超时,按以下步骤排查:
- 检查
default命名空间下是否配置了NetworkPolicy,禁止了Spring Boot Pod访问PostgreSQL Pod的5432端口 - 验证同节点、跨节点Pod互访是否正常,排查Calico/Flannel等CNI网络插件是否运行异常
- 若你自定义了PostgreSQL的
pg_hba.conf配置,检查是否限制了Pod网段的访问权限
快速验证方案
你可以先修改Spring Boot配置,直接用PostgreSQL Pod的IP测试连通性:
spring.datasource.url=jdbc:postgresql://10.244.1.48:5432/ecommerce?useSSL=false
如果直接连接PodIP可以正常访问,即可确认问题出在服务配置或DNS层面;如果连PodIP都无法访问,直接排查集群CNI网络插件故障。
内容的提问来源于stack exchange,提问作者joe1531
相关产品推荐
相关产品推荐

