需要的幾個指令先整理起來
首先當失去API-Server,我們就沒辦法再用kubectl指令
所以要改用continerd指令來看容器狀態:
sudo ctr --namespace k8s.io task ls
準備重新備份當下etcd檔案打包的指令(檔名改成後面122-1228(指1.22版12/28日做)):
sudo ETCDCTL_API=3 etcdctl snapshot save \
/tmp/etcd-backup-122-1228.db \
--cacert /etc/kubernetes/pki/etcd/ca.crt \
--cert /etc/kubernetes/pki/etcd/server.crt \
--key /etc/kubernetes/pki/etcd/server.key
依樣確認打包的備份檔狀態:
sudo ETCDCTL_API=3 etcdctl snapshot status /tmp/etcd-backup-122-1228.db --write-out=table
接著將打包後的備份檔,再次還原成目錄檔案給etcd可以使用的狀態:
sudo ETCDCTL_API=3 etcdctl snapshot restore /tmp/etcd-backup-122-1228.db --data-dir /var/lib/etcd1221228backup
這時候編輯etcd的yaml檔案,修改實際要參照檔案路徑:
sudo vi /etc/kubernetes/manifests/etcd.yaml
然後才將API-Server還原(i.e.賦歸API-Server的yaml檔)
實際執行:
首先確認當前API-Server的Container名稱:
kubectl describe pod {API-Server的pod} -n kube-system
會看到:
對照到containerD的查看container指令:
接著移除/etc/kubernetes/manifests/kube-apiserver.yaml
(這邊我嘗試用mv就好,改個檔名,讓kubelet吃不到就行!)
sudo mv /etc/kubernetes/manifests/kube-apiserver.yaml /etc/kubernetes/manifests/kube-apiserver.yaml.bak
理論上API-Server就掛了,kubectl指令無法運作:
看起來無效,所以我就改做rm:
這時候再透過containerD指令確認API-Server的Container:
執行etcd的備份打包:
確認打包的檔案狀態:
還原:
上圖看起來還是會出現sha256的錯誤
所以指令要另外改為:
sudo ETCDCTL_API=3 etcdctl snapshot restore /tmp/etcd-backup-122-1228.db --data-dir /var/lib/etcd1221228backup --skip-hash-check=true
接著將etcd指過去新的檔案目錄去:
接著重建API-Server(把備份的API-Server yaml檔放回去原來的地方):
過了許久還是像下面這樣....
看了看ps -ef有時候會看到api-server有起來,然後就消失...
接著還原etcd去吃原本的目錄檔案:
隔了幾分鐘後才能正常使用kubectl指令:
結論有無API-Server在,etcd備份都失敗...
暫時無解了...猜測有問題的可能是etcd的指令工具之類的
(以下次日補充)
經大大提醒可以檢查一下備份檔還原出來的目錄權限是否跟既有的一樣:
看權限沒甚麼差,但是檔案數量有不一樣,很神奇...