我有三个节点多主 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-conf
configmap 中删除条目,也会从中删除条目etcd
,事实上,我在 master2 上运行上述步骤,仍然有一个 master 正在启动并运行,我可以运行kubectl
。
非正常移除主节点
- 我关闭了 master3,但没有遇到任何问题,仍然可以访问两个 master,并且我可以运行
kubectl
和执行管理。 - 一旦我关闭 master2,我就无法访问,
kubectl
并且它说 apiserver 无法访问。在这种情况下我该如何恢复 master1?
可能发生这种情况,两个节点在生产中可能存在硬件问题,从我的搜索来看,它看起来像是 etcd 问题,但我如何访问 etcd 并删除 master2 和 master3,我想这样做,docker ps
但docker exec <etcd container>
docker ps 没有显示 etcd 容器。
答案1
一个主题亲朋好友在我心里。
简短版本如下:
- 从存活的 etcd 节点创建 etcd 快照
- 创建一个新的 3 节点“一次性” etcd 集群,从该快照恢复
- 停止
master1
etcd 成员 - 重置其状态(
rm -rf /var/lib/etcd
,并删除服务器和对等证书,除非您对一次性集群使用了相同的 CA——我强烈推荐这样做,但由于各种原因可能无法实现) - 将其加入到新的、现在健康的一次性 etcd 集群中
- 现在,你可以将其他主节点重新上线,将它们加入到新集群,直到有新的法定人数,并拆除一次性集群,或者你可以遍历一次性 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/
这就是我的工作方式,请建议我是否可以优化这些步骤。