Kubernetes部署Spring Boot+Postgres应用访问超时,如何查看日志?
从你提供的kubectl describe pod输出里,我一眼就揪出了核心问题——你的容器启动命令被改成了tail -f /dev/null,这会让容器一直“假装存活”,但根本没启动Spring Boot应用,这就是所有访问超时的根源!
核心问题定位
看这段容器配置:
Command: /bin/bash -ce tail -f /dev/null
正常情况下,Spring Boot镜像会默认启动应用主类,而这个自定义命令直接让容器挂在tail命令上,完全跳过了应用启动流程。所以哪怕Pod显示“运行中”,里面的服务其实是死的,不管用LoadBalancer还是NodePort都找不到可访问的服务。
分步解决
1. 删掉错误的容器启动命令
找到你的Deployment配置文件(或者用kubectl edit deployment spring-boot-postgres-sample在线编辑),删掉containers下的command字段。比如原来的配置可能是这样:
containers: - name: spring-boot-postgres-sample image: djtijare/a2i-web:v1 command: ["/bin/bash", "-ce", "tail -f /dev/null"]
把command这几行彻底删掉,让镜像用默认逻辑启动Spring Boot应用。
2. 重新部署并验证应用启动
修改完Deployment后,执行命令更新部署:
kubectl apply -f your-deployment.yaml
等新Pod创建完成后,查看容器日志确认应用正常启动:
kubectl logs <your-pod-name>
如果日志里出现类似Started Application in X seconds的Spring Boot启动日志,说明服务终于跑起来了。
3. 修正NodePort的端口配置
你的NodePort Service还有个小坑:
ports: - nodePort: 30500 port: 80 protocol: TCP targetPort: 80
Spring Boot默认监听8080端口,你这里把targetPort设成了80,等于把流量转发到了容器的空端口,肯定超时!把targetPort改成8080即可。
4. 重新测试访问
等应用启动、Service配置修正后,再测试:
- 对于LoadBalancer:如果集群支持自动分配ExternalIP,等待状态就绪后访问;如果手动指定了IP,确认集群网络能打通这个IP到Pod的8080端口
- 对于NodePort:访问
http://<你的节点IP>:30500,应该就能正常响应了
额外排查点(如果还是有问题)
- 检查数据库连接:确认ConfigMap里的
POSTGRES_USER、POSTGRES_PASSWORD、POSTGRES_HOST是否正确,Postgres服务是否正常运行 - 集群内连通性:在集群其他Pod里用
curl 192.168.1.28:8080测试Spring Boot Pod的IP和端口,看是否能拿到响应
内容的提问来源于stack exchange,提问作者Dhanraj

