我是用 go sdk 连接的 consul 集群,问题出在注销服务的时候,情况如下:
consul 是通过 helm 部署在 kubernetes 集群上的,部署完有一个无头 Service ,其中包含三个 consul agent 的地址,go sdk 是通过完整的这个 Service 地址来访问 consul ,注册服务是没问题的,但是注销服务的时候出问题了。
无头 service 返回三个 agent 的地址,sdk 连接上之后会时不时的切换连接的地址,这时候就会导致比如我服务启动的时候是连接的 agent 0 ,注册服务也是在 agent 0 上注册的,结果注销的时候连接的是 agent 1 ,但是 agent 1 上并没有注册我当前的服务,找不到 Service Id ,导致注销失败。
研究了一圈没找到解决方案,求助大佬帮忙解惑。
1
rrfeng 2023-07-16 21:35:27 +08:00 via Android
你这三个 consul 不是一个集群???
|
2
jackge0323 OP @rrfeng 是一个集群,都是 server 模式,其中一个是 leader
|
3
julyclyde 2023-07-19 12:18:58 +08:00
@jackge0323 既然是同一个集群,在哪儿注销有什么区别?
|
4
jackge0323 OP @julyclyde 这就是问题所在,consul 的服务注册是通过 agent 注册的,你在 agent 0 上注册的,在 agent 1 上注销的话是找不到的,但是你在 agent 1 上是能查到这个服务的,但是如果你此时运行 consul services deregister id 这条命令注销的话,会提示你找不到 service id 。这个服务只能通过 agent 0 注销,通过 catalog 注销是可以注销,但是他这个同步是以 agent 为主,也就是说就算你通过 catalog 注销了,一会这个服务就又回来了,因为 agent 没注销。不明白他为什么要这样设定。
|
5
julyclyde 2023-07-25 07:58:46 +08:00
@jackge0323 consul 这么弱??多个之间居然不是功能等价的?
|