序言
Kubernetes 中的狀態都是用 etcd 這套 key-value 儲存工具來維持,也就是說我們只要備份好 etcd 後,就可以很輕易的重建一個一模一樣的 Cluster 起來。
要備份 etcd 可以使用 etcdctl 這套 cli 工具來簡單完成
因為 etcd 分了 v2, v3 兩種版本,彼此不相容,所以在使用 cli 工具時需要指定版本
在操作時,我們會需要 cert 位置與 key 的位置,如果你的 Cluster 是透過 kubeadm 安裝,那麼位置都會在 /etc/kubernetes/pki/etcd
中
我們可以先透過 etcdctl member list
來確認是否可以正確連線到我們的 etcd
以下都假設我的 etcd 位置在 10.10.10.10
1 | ETCDCTL_API=3 etcdctl member list \ |
如果覺得指令太長的話,etcdctl 預設會去吃環境變數,也可以在環境變數中設定
1 | export ETCDCTL_CERT_FILE='/etc/kubernetes/pki/etcd/server.crt' |
不確定這些資訊在哪裡的話,可以直接去看你 etcd 的 yaml 就可以看到了,這些資訊會在 etcd 的啟動參數中
匯出
確認可以連線之後,我們將 etcd 的內容完整的匯出,命名為 etcd-snapshot-$(date +%Y%m%d).db
1 | ETCDCTL_API=3 etcdctl snapshot save /root/etcd-snapshot-$(date +%Y%m%d).db \ |
output:
1 | Snapshot saved at /root/etcd-snapshot-20210521.db |
匯入
匯出相較匯出麻煩一些,我們需要先讓 api-server 與 etcd 都終止,重新將 etcd 的資料匯入之後再重新打開它們。
我的 api-server 與 etcd 都是以 static pod 的方式存在,所以只要將對應的 yaml 檔案暫時移除 static pod 目錄即可
1 | mv /etc/kubernetes/manifests/etcd.yaml /root/etcd.yaml |
接著我們將舊的 etcd 資料暫時移開(同時進行備份)
1 | mv /var/lib/etcd/default.etcd /var/lib/etcd/default.etcd.bak |
將新的剛才匯出的 etcd 資料重新匯入
1 | ETCDCTL_API=3 etcdctl snapshot restore /root/etcd-snapshot-20210521.db \ |
output:
1 | 2021-05-21 07:42:36.826573 I | mvcc: restore compact to 3969180 |
匯出之後再把 api-server 與 etcd 重啟就可以了
1 | mv /root/etcd.yaml /etc/kubernetes/manifests/etcd.yaml |