树莓派Kubernetes集群下Spring Boot应用无法通过Secret访问PostgreSQL
你用wget访问PostgreSQL服务返回网络不可达属于正常现象,PostgreSQL监听的5432端口是TCP协议的数据库服务,并非HTTP服务,wget是HTTP客户端,无法与数据库端口建立HTTP连接,该报错无需关注。
排查修复步骤
1. 修正PostgreSQL访问控制配置
本地端口转发可访问不代表集群内Pod网段有权限访问,PostgreSQL默认的pg_hba.conf可能仅放开了本地/端口转发的IP段访问,未授权集群Pod CIDR段访问:
- 进入PostgreSQL Pod:
kubectl exec -it <postgres-pod-id> -n home -- bash - 查看
/var/lib/postgresql/data/pg_hba.conf文件,确认是否存在允许集群Pod/Service网段(通常默认是10.42.0.0/16、10.43.0.0/16,可根据你的集群实际配置调整)的认证规则,没有则添加如下内容:host all all 10.42.0.0/16 md5 host all all 10.43.0.0/16 md5 - 重启PostgreSQL Pod使配置生效。
2. 排查命名空间网络策略限制
检查home命名空间下是否配置了NetworkPolicy规则限制Pod之间的访问:
- 执行查询命令:
kubectl get networkpolicy -n home - 如果存在返回的NetworkPolicy资源,确认是否有禁止meal-planner Pod访问postgres服务5432端口的规则,可临时删除规则测试连通性:
kubectl delete networkpolicy <policy-name> -n home
3. 验证meal-planner容器网络连通性
你使用的arm32v7 OpenJDK基础镜像可能存在缺失网络工具、DNS解析异常的问题,可临时修改启动命令进入容器手动排查:
- 修改meal-planner的Deployment配置,添加临时休眠命令覆盖原有启动逻辑:
containers: - name: meal-planner image: 08021986/meal-planner:v1 command: ["sleep", "3600"] # 保留原有env、ports等配置不变 - 重新部署后进入容器:
kubectl exec -it <meal-planner-pod-id> -n home -- bash - 测试DNS解析:
nslookup postgres.home.svc.cluster.local,正常会返回PostgreSQL Service的ClusterIP - 安装网络工具测试端口连通性:
如果psql可以正常连接,说明网络和凭证均无问题,问题出在Spring Boot应用配置加载逻辑。apt update && apt install netcat postgresql-client -y # 测试端口连通性 nc -zv postgres 5432 # 直接用psql客户端测试数据库连接,验证凭证有效性 psql -h postgres -U <你的数据库用户名> -d home
4. 修正Spring Boot数据源配置
为避免application.yaml配置加载异常,可通过环境变量直接注入JDBC URL覆盖默认配置,同时使用完整的Service域名避免DNS解析异常:
env: - name: SPRING_DATASOURCE_URL value: "jdbc:postgresql://postgres.home.svc.cluster.local:5432/home" - name: DB_USER valueFrom: secretKeyRef: name: dev-db-secret key: username - name: DB_PASSWORD valueFrom: secretKeyRef: name: dev-db-secret key: password
内容的提问来源于stack exchange,提问作者Urr4
相关产品推荐
相关产品推荐

