Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

k8s上注册持久化实例特殊情况 #12027

Closed
hasaiki123 opened this issue Apr 25, 2024 · 4 comments
Closed

k8s上注册持久化实例特殊情况 #12027

hasaiki123 opened this issue Apr 25, 2024 · 4 comments

Comments

@hasaiki123
Copy link

Describe the bug
在k8s部署nacos注册中心,服务实例以持久化类型注册。
情景1:服务A和服务B分别有一个实例A1和B1,实例A1和B1的IP地址分别为IP1和IP2,当服务A和服务B升级后,若k8s没有使用固定IP的策略,那么服务B的新实例B1‘有可能分配到A1的IP1,则会导致服务A有“两个健康实例”,其中一个服务实例的IP是现在B1’的IP,显然是有问题的。
情景2:基于上述情景,可以在preStop中手动清理掉服务实例,但是会引发另外一种特殊情况,比如Node故障,导致preStop没有执行,即没有清理掉无效的服务实例,同样会造成和情景1一样的情况,请问是否有比较好的办法处理这样的情况?

@KomachiSion
Copy link
Collaborator

  1. 没有问题,既然注册是持久化的服务, 那么在你主动注销之前,肯定是存在在, 至于IP被复用的问题,与nacos无关。
  2. 为何不使用非持久化服务?非持久化服务会在链接断开或超时之后自动移除掉,本身设计出来就是为了类似k8s这样的场景的。

@hasaiki123
Copy link
Author

是的,使用临时实例是一个比较好的选择。但是在k8s环境下,我们如果使用nacos,其实是替代了k8s原生service的服务发现能力,同时service会在pod readiness检查不通过时将ip从endpoint剔除,因此当使用nacos时,我们想利用nacos的http健康检查,检查pod的readiness,当检查不通过时,将实例健康状态之于false,从而匹配了service的能力。显然,只有注册持久化实例才能做到nacos服务端的http健康检查。

@hasaiki123
Copy link
Author

之前我们一直认为使用持久化实例,并配置相关的健康检查是非常不错的选择。

但是最近我们在使用k8s+consul的过程中发现了,ip复用的情况导致服务实例状态显示不正确,而consul的http健康检查也是与nacos持久化实例http健康检查类似,所以有了此issue提问。

导致我们之前使用k8s+nacos持久化实例+preStop的方案有些动摇,而且我们注意到持久化实例如果降为0则一定会触发阈值保护,与我们想的类似service从endpoint中剔除ip有一定差别。

所以,我们现在十分困惑,在k8s中最佳实践是使用临时还是持久化实例?您给出的“临时实例本身设计出来就是为了类似k8s这样的场景的”,是指最佳实践是k8s中使用临时实例吗?

非常期待您能给出建议。

@KomachiSion
Copy link
Collaborator

临时实例设计就是为了应对如今大多数微服务场景, 例如容器化后的ip频繁变更,扩缩容等问题,不需要额外再让用户通过手段来保证实例个数的准确性和一致性(实际上是通过机制在内部解决了),因此本身临时实例就是大多数场景下的最佳实践。

但是有部分场景其实还是需要持久化服务的,例如类DNS的场景,传统部署服务在上云和微服务化改造过程中,以及不方便引入nacos-client的场景。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants