当 3 个主节点中有 2 个发生故障时,Kubernetes 主集群将无响应,

当 3 个主节点中有 2 个发生故障时,Kubernetes 主集群将无响应,

我们正在尝试创建跨 2 个数据中心的 k8s 集群环境,我们只有 7 台 BM 服务器。我们选择在数据中心 1 中设置 2 个主节点和 2 个工作节点,在晴天场景下,这是可行的

但是,如果数据中心 1 发生灾难,数据中心 2 中的单个主节点将失去响应,并且不会在数据中心 2 工作节点中的工作节点中启动任何 pod,我们的应用服务将不可用。除了将其他两个主节点恢复在线之外,还有其他解决方案可以将该主节点恢复到服务。

我们使用 kubeadm 堆叠控制平面方法设置集群

#sudo kubeadm init --control-plane-endpoint "LOAD_BALANCER_DNS:LOAD_BALANCER_PORT" --upload-certs

使用以下命令向集群添加另外两个主服务器

#sudo kubeadm join 192.168.0.200:6443 --token 9vr73a.a8uxyaju799qwdjv --discovery-token-ca-cert-hash 

当 2 个 Master 宕机时,第三个 API 服务器停止监听,并且 kubectl 也停止工作,

我们尝试重新启动可用主服务器,但它没有开始监听,我们无法对可用主服务器执行任何操作。有没有办法让这个主服务器重新投入使用

答案1

这不是一个严格意义上如何具体解决你的问题的答案,但我希望它无论如何都能对你有所帮助。

解释

我认为您正在使用堆叠主服务器 = etcd 成员和控制平面节点位于同一位置。

Kubernetes 控制平面本身仅能在 1/3 节点在线的情况下运行。但 etcd 集群需要大多数节点(法定人数)才能就集群状态的更新达成一致。

Etcd 是键值存储,kubernetes 使用它来存储所有配置。(或者大多数 k8s 发行版,k8s 是可插入的,因此您可以更改它,但 kubeadm 肯定使用 etcd)

解决方案提示

恢复 etcd 仲裁并非易事,您必须从节点备份数据,然后创建新的 etcd 集群。我找不到任何关于如何使用 kubeadm 执行此操作的良好指南,这就是这不是一个完美答案的原因。

您不能简单地删除成员,因为这需要有法定人数,您应该能够做的是使用旧数据创建新的 etcd 集群。

Kubeadm 在这里有一点帮助:https://kubernetes.io/docs/tasks/administer-cluster/configure-upgrade-etcd/#volume-snapshot

长期注意事项:

如果您有两个故障域,则必须选择哪一个更重要。没有办法能够在没有其他部分的情况下运行任何部分,这将产生逻辑问题。如果集群的任何部分可以独立运行,则这两个数据中心之间可能会出现网络分区的情况,因此它们无法看到对方,但除此之外运行没有任何问题。集群的两个部分都将承担主控并开始进行更改。当网络恢复时,您无法决定哪些更改是正确的。这就是所有一致的分布式数据存储都需要大多数节点的原因。

另外,不建议跨数据中心使用 etcd,可以尝试查看https://github.com/kubernetes-sigs/kubefed

相关内容