如何从 Kubernetes 中的 master 故障中恢复

如何从 Kubernetes 中的 master 故障中恢复

我有三个节点多主 kubernetes(1.17.3)集群(堆叠控制平面和 etcd 节点),

11.11.11.1 - master1
11.11.11.2 - master2
11.11.11.3 - master3

因此,在投入生产之前,我正在尝试可能出现的故障,并执行了以下步骤

优雅移除主节点

  • Run kubectl drain 11.11.11.3在 master3 上
  • kubeadm reset在 master 3 上
  • kubectl delete node 11.11.11.3在 master3 上

因此,通过应用上述步骤,所有 pod 都在 master 1 和 2 上运行,它会从kubeadm-confconfigmap 中删除条目,也会从中删除条目etcd,事实上,我在 master2 上运行上述步骤,仍然有一个 master 正在启动并运行,我可以运行kubectl

非正常移除主节点

  • 我关闭了 master3,但没有遇到任何问题,仍然可以访问两个 master,并且我可以运行kubectl和执行管理。
  • 一旦我关闭 master2,我就无法访问,kubectl并且它说 apiserver 无法访问。在这种情况下我该如何恢复 master1?

可能发生这种情况,两个节点在生产中可能存在硬件问题,从我的搜索来看,它看起来像是 etcd 问题,但我如何访问 etcd 并删除 master2 和 master3,我想这样做,docker psdocker exec <etcd container>docker ps 没有显示 etcd 容器。

答案1

一个主题亲朋好友在我心里。

简短版本如下:

  1. 从存活的 etcd 节点创建 etcd 快照
  2. 创建一个新的 3 节点“一次性” etcd 集群,从该快照恢复
  3. 停止master1etcd 成员
  4. 重置其状态(rm -rf /var/lib/etcd,并删除服务器和对等证书,除非您对一次性集群使用了相同的 CA——我强烈推荐这样做,但由于各种原因可能无法实现)
  5. 将其加入到新的、现在健康的一次性 etcd 集群中
  6. 现在,你可以将其他主节点重新上线,将它们加入到新集群,直到有新的法定人数,并拆除一次性集群,或者你可以遍历一次性 etcd 成员,将它们从集群中逐个移除,直到只master1留在你的“一个集群”中

我已经有了伟大的成功使用etcdadm自动化我刚刚描述的所有步骤,坏消息是你必须etcdadm自己构建二进制文件,因为截至本文发布时,他们还没有将构建的工件附加到他们的发布版本中

将来,你会希望etcdctl member remove $my_own_member_id从任何有序的主节点拆卸过程中包括它,因为如果一个成员从 etcd 集群中消失,这对集群来说几乎是致命的。etcd 问题事实上,etcd 确实很脆弱,你需要一个比 kubernetes 本身更大的团队来运行它 :-(

答案2

根据我的发现和测试,要恢复 k8s 集群的全部功能,请将剩余的 etcd 节点设为独立的 etcd 集群。请遵循以下步骤

由于我们丢失了三个主节点中的两个,现在剩余节点上的 etcd pod 无法完成仲裁,因此这个静态 pod 不断失败和退出,你无法执行etcdctl member remove <node>

停止 etcd pod:

  • mv /etc/kubernetes/manifest/etcd.yaml /backup
  • mv /var/lib/etcd/member /backup/

在 etcd 主机上临时强制建立新集群:

  • cp /backup/etcd.yaml etcd.yaml.bak
  • 编辑/backup/etcd.yaml并更改以下值

etcd.yaml

Remove lost nodes(master2 and master3) from initial cluster
- --initial-cluster=master1=https://10.11.158.114:2380

Remove following line
- --initial-cluster-state=existing

Add Following line
- --force-new-cluster

重新启动 etcd pod:

 cp /backup/etcd.yaml /etc/kubernetes/manifest/

删除该--force-new-cluster命令,/etc/kubernetes/manifest/etcd.yaml因为它每次都会强制执行。

恢复原状(如果可能的话)

如果 master2 和 master3 没有因为其他原因崩溃和丢失(意味着磁盘和数据可用),那么只要这些 master 可用,您就可以执行以下步骤恢复到原始状态

cd /etc/kubernetes/manifest
rm -rf etcd.yaml
cd /var/lib/etcd
rm -rf member
cp -R /backup/member /var/lib/etcd/
cp /backup/etcd.yaml /etc/kubernetes/manifest/

这就是我的工作方式,请建议我是否可以优化这些步骤。

相关内容