就在昨天晚上,準備把一個工作節點用 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 一次。這樣集羣很快就恢復了。
雖然耗費了一個晚上加一個上午,累得不行,但也得到一些收穫。
首先就是不要手欠,重要的命令一定要再確認再執行。這次就是因爲一邊跟人討論問題一邊執行,導致了災難的發生。
其次是遇到問題也不要慌,冷靜分析問題。多找找相關資料。
再次,還是要多分享,比如這篇隨記。