Spring Boot应用Kubernetes就绪探针返回503,本地及镜像运行正常
问题分析与解决方案
核心问题定位
本地及Docker镜像测试时存活/就绪探针均正常,但部署到Kubernetes后就绪探针返回503,存活探针正常。结合配置和日志来看,就绪探针包含了所有健康检查组件(management.endpoint.health.group.readiness.include=*),而Kubernetes环境中存在某个健康指示器检查失败,导致整体就绪状态为未可用。
本地/Docker环境无K8s特有的依赖(如内部配置中心、集群化数据库、消息队列等),所以所有健康组件都能通过检查;而K8s环境中这些依赖可能未就绪,或Spring Boot升级后健康检查逻辑变化导致某些组件默认加入检查但未配置正确。
排查与解决步骤
1. 查看就绪探针详细失败原因
由于配置了management.endpoint.health.group.readiness.show-details=always,可以直接在Pod内执行命令查看具体哪个组件失败:
kubectl exec <你的Pod名称> -- curl http://localhost:8090/actuator/health/readiness
返回的JSON会列出所有健康组件的状态,找到status: DOWN的组件,这就是导致503的根源。
2. 调整就绪探针的健康组配置
根据排查出的失败组件,选择以下处理方式:
- 排除非必需组件:如果该组件不是应用就绪的必要条件(比如可选的监控组件、非核心的第三方服务),可以从就绪健康组中排除它:
例如,如果是数据库组件失败,可配置为management.endpoint.health.group.readiness.include=*,-<失败组件的指示器名称>management.endpoint.health.group.readiness.include=*,-db(具体名称需根据返回的JSON确定)。 - 配置组件健康检查参数:如果该组件是必需的,调整其健康检查的超时、重试等参数,确保K8s环境中能正常通过检查。比如数据库连接的健康检查:
spring.datasource.hikari.health-check-properties.connect-timeout=5000
3. 适配Spring Boot 2.7.x的健康检查变化
从2.1.8.RELEASE升级到2.7.2,Actuator健康检查有不少默认行为变化:
- 部分组件的健康指示器从默认关闭变为默认开启(如Redis、MongoDB等),如果K8s环境中这些组件未正确配置,会导致检查失败。
- 健康组的默认逻辑调整,
include=*会包含所有自动配置的健康指示器,需确认是否有新增的指示器未适配。
4. 优化Kubernetes探针配置
如果依赖组件启动较慢,可适当延长初始延迟或调整失败阈值:
readinessProbe: failureThreshold: 5 httpGet: path: /actuator/health/readiness port: 8090 scheme: HTTP periodSeconds: 10 initialDelaySeconds: 180
内容的提问来源于stack exchange,提问作者Fay007
相关产品推荐
相关产品推荐

