案例分享-依赖传递引发的健康检查失败问题

news/2025/3/11 0:29:04/文章来源:https://www.cnblogs.com/chopper-poet/p/18691613

背景

网关服务已成功发布,然而新创建的Pod却始终未能成功启动。在Pod的事件(Event)中,明确显示健康检查失败。但令人困惑的是,仔细查看启动日志,却未发现任何异常情况,具体情况如下图所示。

排查

既然当前问题表现为健康检查失败,那就有必要深入排查究竟是哪些关键部分不可用,进而导致了这一结果。在开展排查工作前,我们先来全面了解下健康检查的相关概念,为后续分析打下基础。

服务部署在k8s中,k8s可以对容器执行定期的诊断,要执行诊断,kubelet 调用由容器实现的 Handler (处理程序)。有三种类型的处理程序:

  • ExecAction:在容器内执行指定命令。如果命令退出时返回码为 0 则认为诊断成功。

  • TCPSocketAction:对容器的 IP 地址上的指定端口执行 TCP 检查。如果端口打开,则诊断被认为是成功的。

  • HTTPGetAction:对容器的 IP 地址上指定端口和路径执行 HTTP Get 请求。如果响应的状态码大于等于 200 且小于 400,则诊断被认为是成功的。

每次探测都将获得以下三种结果之一:

  • Success(成功):容器通过了诊断。

  • Failure(失败):容器未通过诊断。

  • Unknown(未知):诊断失败,因此不会采取任何行动。

针对运行中的容器,kubelet 可以选择是否执行以下三种探针,以及如何针对探测结果作出反应:

  • livenessProbe:指示容器是否正在运行。如果存活态探测失败,则 kubelet 会杀死容器, 并且容器将根据其重启策略决定未来。如果容器不提供存活探针, 则默认状态为 Success。

  • readinessProbe:指示容器是否准备好为请求提供服务。如果就绪态探测失败, 端点控制器将从与 Pod 匹配的所有服务的端点列表中删除该 Pod 的 IP 地址。初始延迟之前的就绪态的状态值默认为 Failure。如果容器不提供就绪态探针,则默认状态为 Success。

  • startupProbe: 指示容器中的应用是否已经启动。如果提供了启动探针,则所有其他探针都会被 禁用,直到此探针成功为止。如果启动探测失败,kubelet 将杀死容器,而容器依其 重启策略进行重启。如果容器没有提供启动探测,则默认状态为 Success。

                                                                                             

以上探针介绍内容来源于https://kubernetes.io/zh/docs/concepts/workloads/pods/pod-lifecycle/#container-probes

从K8s的Event中,仅能获取到健康检查的HTTP状态码为503,并没有输出更详细的内容。那么,手动访问这个地址,是否能够获取到更多关键信息呢?

趁着Pod刚起来(Running)还没有被重启(Termiting)的时候快速进入shell执行curl -i http://127.0.0.1:8080/actuator/health,看能否捕捉到一些有价值信息。

尝试手动访问后,问题并未得到解决。查看gateway的日志,竟无任何输出。期间,我将spring的日志级别调至debug,满心期待能挖掘出有价值的线索,可依旧一无所获。或许是我技术水平有限,未能从这些信息中提炼出关键内容。

难道这就是springboot的设计?健康检查失败了也不明示,让我意会?我xxxxxxxxxxx,骂完还得继续解决问题啊,去看看官网的使用文档吧,看能不能行大运,最终还真在官网找到一个相关配置

management.endpoint.health.show-details: always

可以展示健康检查的详细信息,现在curl -i http://127.0.0.1:8080/actuator/health的结果明显就丰富多了

 

{"status": "DOWN","components": {"clientConfigServer": {"status": "UP","details": {"propertySources": ["bootstrapProperties-configClient", "bootstrapProperties-classpath:/repo/scm-gateway/scm-gateway-common.yml"]}},"diskSpace": {"status": "UP","details": {"total": 598725427200,"free": 199748194304,"threshold": 10485760,"path": "/usr/app/bin/.","exists": true}},"livenessState": {"status": "UP"},"ping": {"status": "UP"},"rabbit": {"status": "DOWN","details": {"error": "org.springframework.amqp.AmqpConnectException: java.net.ConnectException: Connection refused"}},"readinessState": {"status": "UP"},"redis": {"status": "UP","details": {"version": "6.0.9"}},"refreshScope": {"status": "UP"}},"groups": ["liveness", "readiness"]
}

可以看到rabbit的status是DOWN,rabbitmq挂了?

 

实在蹊跷!网关按常理根本无需RabbitMQ ,我们也从未维护过任何RabbitMQ的配置信息,怎么会突然开始针对它进行健康检查呢?肯定是有谁引入了RabbitMQ的相关依赖,却又没做好配置工作。

查看提交历史后,并没有发现直接引入RabbitMQ相关依赖的记录,不过新增了一个xxx-interface依赖。难不成是这个新引入的依赖,在传递过程中把RabbitMQ相关依赖也带进来了?

果然是xxx-interface传递依赖了spring-amqp,从而触发了RabbitHealthContributorAutoConfiguration的自动装配。

最终解决

1.重新审视网关依赖xxx-interface的合理性,本次的解决方案是直接去除xxx-interface的依赖;

2.使用maven的依赖排除能力去除spring-amqp:

3.禁用rabbitmq的健康检查

management:health:rabbit:enabled: false

推荐阅读

https://docs.spring.io/spring-boot/docs/3.2.12/reference/htmlsingle/#application-properties.actuator.management.endpoint.health.show-details

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/875915.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微信小程序逆向 ... 未完待续

解包 打开这个文件夹下图中,wxid_21arhynucfka22表示了不同微信号的id。打开的小程序缓存会被放入Applet文件夹中,比如图中wx31a9c726536cdacc 就是我之前打开过的 微信小程序下载的缓存。同时,在wechat目录下也存在所有账号公用的小程序缓存,公用的Applet文件夹,我们可以…

SourceMap的简单理解

什么是 SourceMap? Source Map 是一种映射文件,它可以将压缩、混淆后的代码还原回其原始的源代码。 (这种映射关系,可以准确地将编译后的代码映射回源代码。[自己理解就行]) 从而方便开发人员进行调试、错误日志收集和性能优化等工作。 它是一个以 .map 为后缀的文件。 为什么…

LamentXU 2024-2025年终总结

LamentXU 2024-2025年终总结下雪了。对于一个南方人来说,北方的雪声和爆竹味意味着年。键盘声在今天格外柔和,我终于还是开始写这篇文字了。最初我创建这个博客的原因就是想记录一下自己学习成长的足迹。而这一年的经历确实很丰富,我打算学着各个大佬的样子写个总结。整理一…

Linux 中grep命令 -F 选项使关键字按照原始字符串进行搜索

001、[root@localhost test]# ls a.txt [root@localhost test]# cat a.txt ## 测试数据 j003_mappingrate.txt KRA6 97.79% wild_mappingrate.txt KR.6 98.53% j004_mappingrate.txt KRG6 97.58% [root@localhost test]# grep "KR.6&quo…

你知道AI无法通过阅读一本好书获得灵感,对吧?

你知道AI无法通过阅读一本好书获得灵感,对吧? 人类写故事的方式和AI生成文本的方式是天差地别,完全无法相提并论。男孩与怪物的水彩画插图,授权自Deposit Photos有人曾这样问我:如果他们读了托尔金的所有书,然后写了一本关于精灵和霍比特人的书,这算盗窃吗?我笑了。 不…

语音处理 开源项目 EchoSharp

开源项目 EchoSharp(https://github.com/sandrohanea/echosharp),专为近乎实时的音频处理而设计,可为各种音频分析范围无缝编排不同的 AI 模型。EchoSharp 的架构注重灵活性和性能,通过集成语音转文本和语音活动检测组件,实现近乎实时的转录和翻译。这个开源项目目前虽然…

【重磅解密】APJifengc 语录【/重磅解密】

重磅解密APJifengc 语录我:如何评价您带领两只动物获得第一名? APJ:我是 furry。11.16我模拟 6 号,我太牛了,哦哦哦哦哦哦哦哦哦。(我不是兽。)但是我是。11.15博客园团队已经没人回了。他已经死了。11.14这不平凡博吗。(你是 furry 吗?)是是是。太是了。(补充:这种…

Sdcb Chats 技术博客:数据库 ID 选型的曲折之路 - 从 Guid 到自增 ID,再到 Guid

在软件开发中,数据库主键的选择,Guid 还是自增整数 ID,一直是一个备受开发者关注和讨论的经典话题。作为开源 ChatGPT 前端项目 Sdcb Chats 的开发者,我们在这个问题上也经历了一系列探索和演进,颇具代表性。Sdcb Chats 项目致力于打造一个强大、易用、可高度定制的 ChatG…

越界智能监测摄像机

越界智能监测摄像机将不断演进。未来,我们可以预见更多创新功能的加入,比如更强大的数据处理能力、更高效的图像识别算法以及与其他安防系统(如报警系统、无人巡逻车)的深度整合。这不仅能提升整体安保水平,还能实现信息共享,提高反应速度。加强公众对这一新兴技术的认知…

攀高行为识别摄像机

攀高行为检测识别摄像机具有显著优势。首先,其高度自动化特性大幅降低了人工监控成本,提高了工作效率;其次,通过数据记录和分析,可以为后续的安全评估和改进提供有力支持。随着科技的发展,未来的攀高行为检测识别摄像机将变得更加智能化。例如,更强大的图像处理能力、更…

火情监测摄像机

火情监测摄像机广泛应用于工业园区、高层建筑、森林防火等领域。在工业园区,由于设备密集且易燃物品众多,安装监测摄像机可以实现24小时不间断监控。一旦发现异常情况,系统会迅速通知相关人员进行处理。在高层建筑中,这种设备能够帮助消防队员快速定位起火点,为灭火行动争…

第一届启航杯网络安全大赛部分wp

第一届启航杯 WEB Easy include <?php error_reporting(0); //flag in flag.php $file=$_GET[fil e]; if(isset($file)) {if(!preg_match("/flag/i",$file)){include($file);}else{echo("no no no ~ ");} } else {highlight_file(__FILE__); }?> …