存活探针失败但端点可跨Pod访问的技术求助
Troubleshooting Liveness Probe Connection Refusal for Spring Boot Actuator
看起来你遇到了个挺头疼的问题——明明容器内部能正常访问/actuator/health拿到200响应,但Kubernetes的存活探针就是报连接拒绝。结合你提供的配置和测试信息,我整理了几个高概率的排查方向和解决办法:
1. 检查Spring Boot的监听地址
这是最常见的原因之一:很多Spring Boot应用默认只监听127.0.0.1(本地回环地址)。这种情况下,你在容器内部用curl访问容器IP或者localhost能通,但Kubernetes的存活探针是由节点上的kubelet发起请求,而如果应用只绑定了127.0.0.1,外部请求(包括kubelet的探针)根本无法连接到应用端口。
解决办法:
修改Spring Boot的启动配置,让它监听所有网卡地址:
- 在启动命令中添加参数:
--server.address=0.0.0.0 - 或者在
application.properties/application.yaml中配置:server.address=0.0.0.0 - 也可以检查是否设置了
management.server.address(如果Actuator用了单独端口),确保这个值也是0.0.0.0
验证方式:
进入Pod执行以下命令,查看8080端口的监听地址:
netstat -tulpn | grep 8080
如果输出中的地址是127.0.0.1:8080,那就是这个问题导致的。
2. 排查Actuator端点的访问限制
虽然你在容器内可以正常访问/actuator/health,但还是要确认Actuator的配置有没有隐含的访问限制:
- 检查是否配置了
management.endpoints.web.exposure.include=health(确保健康端点被暴露) - 检查是否设置了IP白名单或者安全拦截规则,阻止了kubelet的IP访问端点
- 如果使用了Spring Security,确认有没有为
/actuator/health配置允许匿名访问的规则
3. 调整探针配置的细节
你当前的存活探针配置看起来没问题,但可以尝试几个小调整:
- 在
livenessProbe.httpGet中添加host: localhost,强制探针从容器内部的localhost发起请求:livenessProbe: httpGet: path: /actuator/health port: 8080 host: localhost failureThreshold: 5 periodSeconds: 10 initialDelaySeconds: 30 timeoutSeconds: 25 - 优化
startupProbe的参数,给应用足够的启动缓冲时间(比如允许30次重试,每次间隔10秒,总共300秒):
注意:startupProbe成功后,存活探针才会接管健康检查,所以要确保startupProbe的参数足够覆盖应用的最长启动时间。startupProbe: httpGet: path: /actuator/health port: 8080 failureThreshold: 30 periodSeconds: 10
4. 检查容器网络栈的异常
虽然Nginx的探针正常工作,但还是可以排查下Spring Boot容器的网络配置:
- 查看Pod的网络状态:
kubectl describe pod <your-pod-name>,确认容器的端口映射、IP地址是否正常 - 在节点上尝试直接访问容器的IP和8080端口:
curl http://<container-ip>:8080/actuator/health,看看节点层面能不能访问 - 检查节点上的iptables规则,确认没有阻止kubelet访问容器端口的规则
总结
从你的测试结果来看,Spring Boot监听地址限制是最可能的原因,建议优先排查这个方向。如果调整监听地址后问题解决,那就是这个原因导致的;如果还不行,再依次排查其他方向。
内容的提问来源于stack exchange,提问作者Shihan Anuruddha
相关产品推荐
相关产品推荐

