如何解决重新启动工作节点上的网络接口后,流量未正确路由
我们有一个有 2 个副本的 statefulset,每个 pod 上都有 Postgres 实例。一个作为主,另一个作为副本。
暴露了2个服务,一个是PG主服务,一个是PG副本服务。两个服务都没有选择器,并且有 2 个端点共享其相关服务的名称。
Postgres pod 的 IP 将被修补到端点,以便在访问服务时可以将流量路由到正确的 pod。
比如PG master service对应同名的endpoint,在那个endpoint里面有运行master Postgres实例的pod的ip。
还有另一个流量 Pod 将建立与主 Postgres 服务的数据库连接。
问题是:
1.traffic pod(通过 JDBC 发出 DB 连接)和 PG master pod 在同一个工作节点(我们称之为 worker1)。
2.PG 副本 pod 在另一个 worker(worker2)中。
3.运行一个测试用例:“关闭worker1上的网络接口,休眠60秒,占用worker1上的网络接口”
4.然后将之前的 PG 副本 pod 提升为 master,将之前的 PG master pod 降为副本。
5.traffic pod 的目标地址是 PG 主服务名,但此时它连接到副本 pod。因此,流量可能会尝试以“只读”模式写入 PG 并且测试用例失败。
kube-proxy 模式是 iptables。 我们怀疑 kube-proxy 中的 iptables 没有及时更新路由信息。这意味着 iptables 可以比流量 Pod 建立数据库连接晚一点更新路由信息。
我们重新启动了 kube-proxy,此后问题没有再出现。那很奇怪。 所以我们希望知道其根本原因,但还没有得到任何线索。
这里是 kubectl 版本:
•Kubernetes version (use kubectl version):
Client Version: version.Info{Major:"1",Minor:"19",GitVersion:"v1.19.3",GitCommit:"1e11e4a2108024935ecfcb2912226cedeafd99df",GitTreeState:"clean",BuildDate:"2020-10-14T12:50:19Z",GoVersion:"go1.15.2",Compiler:"gc",Platform:"linux/amd64"}
Server Version: version.Info{Major:"1",GitCommit:"91fb1371fc570cfd3b3052012ce68fdd78b41c07",BuildDate:"2020-10-28T08:47:48Z",Platform:"linux/amd64"}
谢谢。
解决方法
是吗?这只是发生的事情,没有办法原子地更新事物,因为世界不是事务性的。任何执行这种故障转移的主动-被动 HA 系统都会有系统不收敛的时间。重要的是 Postgres 本身从来没有超过一个主要。它可以少于一个,但绝不会更多。听起来您可以正常工作,降级的副本将处于只读模式,并且发送到它的任何写入查询都会出现错误。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。