博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

就在昨天晚上,准备把一个工作节点用 kubeadm reset 重置一下。但不小心在 master 节点上执行了这个命令。由于是测试环境只部署了一个 master 节点,于是乎整个集群都挂掉了。发问题后赶紧恢复。好在留有之前初始化配置文件,并且 etcd 是独立集群之外部署的,集群数据不会丢失,否则就惨了,整个集群要重做,可能要耗费几天时间。

初始化只需要执行一行命令:

kubeadm init --config=init-config.yaml

各个镜像都还在,但状态都不正常,这也合理,因为其它节点还得重新用 join 命令加进来。

检查恢复情况:

k get pod -n kube-system

发现了问题,calico-kube-controllers-7774d578f5-4cnrn 这个 pod 一直不能达到 Ready 状态。一查日志才发现出了大事,一直在报这个错误(caloco 连不上 apiserver):

------------------

Trace[1852186258]: [30.047892809s] [30.047892809s] END
E0920 00:37:13.972476       1 reflector.go:153] pkg/mod/k8s.io/client-go@v0.17.2/tools/cache/reflector.go:105: Failed to list *v1.Pod: Get "https://10.96.0.1:443/api/v1/pods?limit=500&resourceVersion=0": dial tcp 10.96.0.1:443: i/o timeout
I0920 00:37:13.972557       1 trace.go:116] Trace[629458047]: "Reflector ListAndWatch" name:pkg/mod/k8s.io/client-go@v0.17.2/tools/cache/reflector.go:105 (started: 2022-09-20 00:36:43.945731635 +0000 UTC m=+124.422192928) (total time: 30.026813558s):
------------------

这说明 calico 连不上apiserver, 这是从来没有发现过的情况。然后 calico-node 也没有在 ready 状态,日志报这个错:

------------

2022-09-20 00:01:16.454 [INFO][8] startup/startup.go 184: Setting NetworkUnavailable to False
2022-09-20 00:01:16.459 [WARNING][8] startup/startup.go 1320: Failed to set NetworkUnavailable to False; will retry error=Unauthorized
2022-09-20 00:01:16.461 [WARNING][8] startup/startup.go 1320: Failed to set NetworkUnavailable to False; will retry error=Unauthorized
2022-09-20 00:01:16.464 [WARNING][8] startup/startup.go 1320: Failed to set NetworkUnavailable to False; will retry error=Unauthorized
------------

然后 coredns 也不正常。

重做了几次 reset 都是同样的错误。时间一点一点过去,到了晚上11点都没有任何进展。

后来一篇文章给了启发,是不是环境没有清理干净?

reset 之后只是按提示做了下面的清理:

rm -rf  /etc/cni/net.d
ipvsadm --clear
iptables -F

但 kube-system 命名空间下的 cm, sa, ds 这些都没有清理,下次 init 之后,仍然使用这些配置,是不是它们导致的问题?于是准备对这个命名空间下的资源做一次彻底清理。用以下脚本:

km get sa | awk '{print $1}' | grep -v NAME | xargs -I {} kubectl -nkube-system delete sa {}
km get cm | awk '{print $1}' | grep -v NAME | xargs -I {} kubectl -nkube-system delete cm {}
km get ds | awk '{print $1}' | grep -v NAME | xargs -I {} kubectl -nkube-system delete ds {}
km get rs | awk '{print $1}' | grep -v NAME | xargs -I {} kubectl -nkube-system delete rs {}
km get secret | awk '{print $1}' | grep -v NAME | xargs -I {} kubectl -nkube-system delete secret {}
km get deploy | awk '{print $1}' | grep -v NAME | xargs -I {} kubectl -nkube-system delete deploy {}

 再次 reset 和 init,由于 calico 的镜像和配置都删掉了,需要重新启动相关的 pod.

k apply -f calico.yaml

总算没问题了。

后面就是把各个节点重新 join 一次。这样集群很快就恢复了。

 

虽然耗费了一个晚上加一个上午,累得不行,但也得到一些收获。

首先就是不要手欠,重要的命令一定要再确认再执行。这次就是因为一边跟人讨论问题一边执行,导致了灾难的发生。

其次是遇到问题也不要慌,冷静分析问题。多找找相关资料。

再次,还是要多分享,比如这篇随记。

 

posted on 2022-09-20 15:05  黑米  阅读(2390)  评论(0编辑  收藏  举报