記一次 k8s master 節點被 reset 後恢復的過程

就在昨天晚上,準備把一個工作節點用 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/[email protected]/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/[email protected]/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 一次。這樣集羣很快就恢復了。

 

雖然耗費了一個晚上加一個上午,累得不行,但也得到一些收穫。

首先就是不要手欠,重要的命令一定要再確認再執行。這次就是因爲一邊跟人討論問題一邊執行,導致了災難的發生。

其次是遇到問題也不要慌,冷靜分析問題。多找找相關資料。

再次,還是要多分享,比如這篇隨記。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章