机架间脑裂场景下的 Kubernetes HA 集群故障行为是什么?

What is Kubernetes HA cluster failure behaviour in split-brain scenarios between racks?

我对多主 Kubernetes 在发生不同类型故障时的行为很感兴趣,尤其是当主节点位于不同机架上时。

我的失败问题基本上都是围绕裂脑场景:

如果 M1 是活动主节点,R1 与 Etcd 和 R2 失去连接,但 R2/M2 与 Etcd 有连接,会发生什么情况?即是什么导致了领导选举?

如果 R1/W1 上有一个 Pod P1,M1 是活跃的 master 并且 R1 与 R2 和 Etcd 断开连接,会发生什么? P1 是继续前进,还是被杀死了? M2 是否在 R2 上启动了一个单独的 P (P2) 实例?如果可以,P1 & P2 可以同时运行吗?

如果 R2/W2 上有一个 Pod P2,并且 M1 是活跃的主机(即 pod 在与主机不同的机架上)并且 R1 与 R2 和 Etcd 失去连接,P2 会发生什么?它会继续运行并由 M2 接管吗?

master 在 etcd 中持有租约。如果租约到期,活跃的 master 退出它的进程(期望重新启动)。另一个 master 会观察到租约到期并尝试在 etcd 中获取它。只要 M2 可以到达 etcd 并且 etcd 有法定人数,第二个 master 就会接管。

就竞争的Masters而言,一般来说Kubernetes仍然使用etcd来执行一致性更新——即即使两个同时活跃的Masters仍然在竞争对etcd做同样的事情,etcd具有很强的一致性,所以通常的结果只是更新失败。一个不是这种情况的例子是 daemonsets 和 ReplicaSets - 两个活跃的 Masters 可能会创建 pods 的倍数,然后当他们意识到每个节点太多或与所需规模相比时缩小它们。但是由于 daemonsets 或 ReplicaSets 都不能保证这种行为(ReplicaSets 可以在任何时候有 > scale pods 运行,daemonsets 每个节点可以有两个 pods)它本身并没有被破坏。

如果您最多需要 X pods 行为,目前只有 StatefulSets 提供这种保证。