【发布时间】:2021-02-12 07:53:53
【问题描述】:
我在启用 istio 后遇到了 hazelcast 问题,我想知道如何解决这个问题。
我有 K8s 集群并且我最近安装了 istio。 当尝试使用 hazelcast 将特使添加到部署中时,我遇到了一个奇怪的问题,即在滚动升级期间我有很多连接错误。我应该提到最终部署是好的,但这个错误表明有问题。
我注意到,当我滚动升级到部署时,如果没有 Envoy,我会看到以下内容:
[10.16.17.72]:5701 [dev] [4.0.1] Initialized new cluster connection between /10.16.17.72:45025 and /10.16.5.8:5701
[10.16.5.8]:5701 [dev] [4.0.1] Initialized new cluster connection between /10.16.5.8:5701 and /10.16.17.72:45025
[10.16.17.72]:5701 [dev] [4.0.1] Connection[id=1, /10.16.17.72:45025->/10.16.5.8:5701, qualifier=null, endpoint=[10.16.5.8]:5701, alive=false, connectionType=MEMBER] closed. Reason: Connection closed by the other side
[10.16.17.72]:5701 [dev] [4.0.1] Could not connect to: /10.16.5.8:5701. Reason: SocketException[Connection refused to address /10.16.5.8:5701]
......
[10.16.17.72]:5701 [dev] [4.0.1] Removing connection to endpoint [10.16.5.8]:5701 Cause => java.net.SocketException {Connection refused to address /10.16.5.8:5701}, Error-Count: 5
[10.16.17.72]:5701 [dev] [4.0.1] Member [10.16.5.8]:5701 - 945ec2c8-fc56-4624-aab3-de9823d4886a is suspected to be dead for reason: No connection
这里发生的是:
- 新 pod 启动并加入集群。
- old-pod:5701 到 new-pod:xxx 之间的连接初始化(2 个方向)
- 新 pod 抱怨它无法到达旧 pod (connectionType=MEMBER),并且在 5 次尝试后 将其视为已死亡并将其从集群中删除
- 滚动升级完成后移除旧的 pod。
现在,当我在注入 Envoy 时做同样的事情,所以我在这个 pod 部署中有 2 个容器时,我注意到以下几点:
[10.16.3.244]:5701 [dev] [4.0.1] Initialized new cluster connection between /10.16.3.244:5701 and **/127.0.0.6:48287**
[10.16.5.16]:5701 [dev] [4.0.1] Initialized new cluster connection between /10.16.5.16:59827 and /10.16.3.244:5701
[10.16.5.16]:5701 [dev] [4.0.1] Connection[id=1, /10.16.5.16:59827->/10.16.3.244:5701, qualifier=null, endpoint=[10.16.3.244]:5701, alive=false, connectionType=MEMBER] closed. Reason: Connection closed by the other side
但随后我收到数百万条消息,如下所示:
[10.16.5.16]:5701 [dev] [4.0.1] Connection[id=2, /10.16.5.16:33659->/10.16.3.244:5701, qualifier=null, endpoint=[10.16.3.244]:5701, alive=false, connectionType=NONE] closed. Reason: Connection closed by the other side
第一个“连接关闭”消息是 MEMBER 类型,并且与我们在初始化消息中提到的相同连接 (10.16.5.16:59827 --> 10.16.3.244:5701)
但其余消息来自 10.16.5.16 上的随机端口到旧 pod。
我认为这是因为初始化消息表明初始化了新的集群连接
/10.16.3.244:5701 and **/127.0.0.6:48287** 它将连接配置到错误的主机:端口而不是 10.16.5.16:59827。
滚动升级完成相同,但日志中包含数百万条来自该类型的消息。
我已经复制了同样的内容,也看到了不匹配的端口:
I 2021-02-09T08:18:40.163Z [10.16.5.22]:5701 [dev] [4.0.1] Initialized new cluster connection between /10.16.5.22:49213 and /10.16.5.21:5701
I 2021-02-09T08:18:40.158Z [10.16.5.21]:5701 [dev] [4.0.1] Initialized new cluster connection between /10.16.5.21:5701 and /10.16.5.22:46274
我怎样才能防止这种情况发生?为什么获取 remoteAddress 的这一部分得到不同的端口? 到目前为止,我已经尝试了以下方法:
- 升级到 4.1.1,没有任何变化
- 添加了 JHIPSTER_SLEEP ,没有帮助
- 更新了部署以确保代理在应用程序之前启动,没有帮助。
有什么想法吗?
谢谢 陈
【问题讨论】:
-
这种情况只发生在滚动升级期间吗?您是否已将 hazelcast 部署为 StatefulSet 或 Deployment?
-
是的,仅在重新部署期间,这就是部署。
-
您使用的滚动策略是什么?根据 hz 文档,在将 hazelcast 部署为 Deployment 时,您可能需要检查滚动策略以避免脑裂。想知道这是否是导致这里出现任何问题的原因。
标签: kubernetes hazelcast istio