Nacos在k8s的业务pod已经正常下线,但在nacos中(虽然这个bug出现是偶发性的机率,但在生产环境出现的时候是致命性)的业务实例不会自动剔除已经失效的个数,版本是1.4.3?
根据提供的知识,Nacos中业务实例不会自动剔除已失效个数的现象可能是由以下几个因素导致:
非持久化服务的心跳机制:非持久化服务依赖客户端发送的心跳来维持数据,即使在控制台删除服务或实例,客户端可能会检测到服务被删除并重新发起数据发布,导致服务实例再次出现。
服务提供者未彻底关闭或有额外心跳:服务提供者进程可能存在残留,仍在发送心跳维持连接,或者有其他进程在注册此服务,使得Nacos未能正确摘除已下线的服务实例。
Kubernetes环境中的“幽灵Pod”:在Kubernetes环境下,虽然Pod已查询不到,但其进程可能仍在Node中运行,持续发送心跳,造成Nacos无法正确识别并剔除已失效的服务实例。
解决方案:
针对上述问题原因,可按以下步骤进行排查和解决:
步骤一:确认服务类型及心跳状态
登录Nacos控制台,检查出现问题的业务服务是否为非持久化服务(ephemeral=true)。如果是非持久化服务,考虑调整为持久化服务以避免客户端自动重新发布数据。
对于非持久化服务,确保注册该服务的客户端在下线时调用deregisterService接口,同时移除对应心跳任务。
步骤二:检查服务提供者进程
确认相关业务Pod是否已完全关闭,检查Kubernetes集群中是否有残留的“幽灵Pod”。若存在,需清理这些残留进程。
排查是否有其他进程或应用在代理注册该服务,若有,应在这些代理注册程序中移除或注销已下线的服务实例。
步骤三:升级Nacos客户端版本
考虑到当前使用的是Nacos 1.4.3版本,可能存在发现速度较慢或客户端缓存更新不及时的问题。建议升级至Nacos 2.x版本,以利用更高效的发现机制和更快的数据推送速度(约1秒左右)。
步骤四:检查应用框架及配置
检查所使用的微服务框架(如Spring Cloud、Dubbo等)及其组件(如Feign、Loadbalance、Robin等)的版本,确保它们与Nacos客户端版本兼容,并无已知的缓存更新问题。
在应用配置中检查是否有启用类似推空保护的设置,如Java客户端的namingPushEmptyProtection,根据实际情况决定是否关闭。
步骤五:观察日志及网络状况
分析Nacos客户端和服务端的日志,查找可能导致服务实例剔除失败的相关异常或错误信息。
检查网络环境,确保Nacos客户端与服务器之间的通信无阻,客户端能够及时接收服务列表更新。
综上所述,通过确认服务类型、检查服务提供者状态、升级Nacos客户端、审查应用框架配置以及观察日志和网络状况,可以逐步排查并解决Nacos在Kubernetes环境中无法自动剔除已失效业务实例的问题。 ,此回答整理自钉群“Nacos社区群4”
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。