就在昨天晚上,准备把一个工作节点用 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 一次。这样集群很快就恢复了。
虽然耗费了一个晚上加一个上午,累得不行,但也得到一些收获。
首先就是不要手欠,重要的命令一定要再确认再执行。这次就是因为一边跟人讨论问题一边执行,导致了灾难的发生。
其次是遇到问题也不要慌,冷静分析问题。多找找相关资料。
再次,还是要多分享,比如这篇随记。