Spring Boot应用K8s部署失败:Actuator端点返回404
问题排查方案
1. 重点分析Tomcat停止的核心日志
应用日志显示Spring启动后Tomcat停止,这是关键线索,必须定位停止的具体原因:
- 执行命令抓取Pod启动后Tomcat停止阶段的日志:
kubectl logs <异常Pod名称> --tail=200 | grep -A 20 -B 5 "Stopping service \[Tomcat\]" - 查看日志中是否存在异常栈、资源耗尽、依赖服务连接失败等信息,这通常是导致Tomcat退出的直接原因。
2. 验证节点镜像一致性与环境差异
部分节点旧版本正常、部分节点新旧版本均失效,优先排查节点层面的镜像与环境差异:
- 对比异常节点与正常节点上的应用镜像ID,确认是否拉取到了正确的新版本:
# 在节点上执行(需节点权限) docker images | grep <你的镜像名称> - 检查节点的容器运行时版本(Docker/containerd)、内核版本是否存在差异,部分运行时更新可能导致兼容性问题:
# 检查Docker版本 docker version # 检查containerd版本 containerd --version # 检查内核版本 uname -r - 查看节点的资源使用情况,确认是否因CPU/内存耗尽导致应用启动失败:
kubectl describe node <异常节点名称>
3. 确认Actuator端点配置与探针正确性
虽然已配置健康探针相关参数,仍需验证配置生效与探针路径的正确性:
- 进入异常Pod内部,直接访问Actuator端点,确认是否真的返回404:
kubectl exec <异常Pod名称> -- curl -v http://localhost:<应用端口>/actuator/health/liveness- 如果返回404,检查Pod内的配置文件是否包含完整的端点暴露配置:
# 需确保已暴露health端点(子端点liveness/readiness依赖此配置) management.endpoints.web.exposure.include=health # 或暴露所有端点用于排查 management.endpoints.web.exposure.include=*
- 如果返回404,检查Pod内的配置文件是否包含完整的端点暴露配置:
- 检查Kubernetes探针配置的路径、端口、scheme是否与应用实际匹配:
# 示例正确的探针配置 livenessProbe: httpGet: path: /actuator/health/liveness port: 8080 scheme: HTTP # 如果应用启用HTTPS,需改为HTTPS initialDelaySeconds: 30 periodSeconds: 10 readinessProbe: httpGet: path: /actuator/health/readiness port: 8080 scheme: HTTP initialDelaySeconds: 30 periodSeconds: 10
4. 排查镜像构建的底层依赖变化
使用bootBuildImage构建的镜像依赖Spring Boot Buildpacks的基础镜像,若基础镜像更新可能引入兼容性问题:
- 对比新旧镜像的基础镜像信息,确认是否存在版本变更:
docker inspect <新版本镜像ID> | grep -A 10 "Config" | grep -A 5 "Labels" - 检查构建日志,确认Buildpacks是否使用了预期的Java版本、Tomcat版本:
# 重新构建时查看日志,重点关注buildpack选择部分 ./mvnw spring-boot:build-image
5. 验证Pod配置与资源限制
- 检查Pod的资源请求与限制是否合理,避免因资源不足导致应用启动后退出:
resources: requests: cpu: "500m" memory: "1Gi" limits: cpu: "1" memory: "2Gi" - 确认ConfigMap/Secret挂载是否正常,避免因配置缺失导致Actuator功能失效:
kubectl describe pod <异常Pod名称> | grep -A 10 "Volumes" kubectl exec <异常Pod名称> -- cat /path/to/挂载的配置文件
内容的提问来源于stack exchange,提问作者Ricardo Rubik Ruiz
相关产品推荐
相关产品推荐

