Kubernetes etcd的快照數據恢復


首先說備份etcd快照數據很重要,因為如果機器斷電導致etcd突然中斷,它自身是無法恢復的。

之前出現了兩次這種情況,每次都是重置kubernetes,但現在部署的應用越來越多就比較麻煩了,所以不得不搞定通過快照備份來快速恢復。

https://blog.csdn.net/u013958257/article/details/106978416

首先參考的是這篇文章,所說明的問題是一樣的。

按照其所指備份方法成功備份后,恢復遇到了問題。

他是通過在kubernetes之外單獨安裝etcd,通過etcdctl恢復成功,我想的是通過etcd容器進行恢復,這樣就不用單獨安裝etcd了。

進入到etcd容器執行他說明的恢復命令時,提示/var/lib/etcd目錄已經存在。

那好再按照他的說明先將這個目錄重命名下,當執行重命名時mv命令時出現了錯誤,說是“Device or resource busy”.

現在就麻煩了,麻煩在哪呢?

由於我所有的操作都是在容器中執行的,而/var/lib/etcd是加載的外部主機的,所以不能刪除,而它的存在又會導致恢復操作不會成功,因為恢復需要一個空的目錄。

PS: 其實現在想來出現這個問題,是因為執行恢復命令時通過—data-dir選項指定了恢復目錄,如果不指定的話會存放到默認目錄/default.etcd/下,在恢復完成后可以將恢復結果復制到/var/lib/etcd下。之所以參考文章沒有問題,是因為他是在主機上操作,可以對/var/lib/etcd做任何操作。

在這種進退兩難的情況下,有找了另一篇關於etcd恢復的文章。

https://elastisys.com/backup-kubernetes-how-and-why/

它的思路和我一樣,也是通過容器恢復,而不是單據安裝etcd。

通過etcd鏡像重新創建一個容器,而是復用現有容器,並且將/var/lib/etcd也加載到容器內,但執行恢復操作時並沒有指定要恢復到的目錄,這樣恢復的數據就到了默認目錄/default.etcd/下,恢復完成后再通過mv命令把其下member目錄移動到/var/lib/etcd。

這樣主機的/var/lib/etcd目錄下也有了已經恢復完成的數據。

最后刪除kubernetes的etcd容器,它自動重建后果然數據都回來了。

但通過kubectl查看pod時發現有些是終止狀態,查看其日志發現都是相同的錯誤:“Authorization error (user=kube-apiserver-kubelet-client, verb=create, resource=nodes, subresource=proxy)”,開始以為是恢復數據導致連接apiserver的客戶端證書丟失,但通過查看/etc/kubernetes/pki目錄,發現證書都是存在的。

對比發現處於終止狀態的pod都在非主節點上,再查看節點狀態,發現除了主節點其它都是unreachable狀態,嘗試重啟其中一個非主節點后問題不再,就將剩余節點全部重啟,至此所有應用全部恢復正常 。

這里記錄的是解決問題的步驟,但通過兩邊參考文章的內容可以得出etcdctl恢復快照數據的操作純粹是一個本地操作,無需像第一篇文章一樣需要通過選項指定證書、地址及恢復目錄。指定了恢復目錄反而導致無法在現有容器中完成恢復。

PS: 不能在etcd容器中直接將/var/lib/etcd/下的member目錄刪除,因為etcd是基於其運行的,如果直接刪除會導致etcd進程中斷,從而導致kubernetes的etcd容器終止並重啟。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM