/

如何備份 Kubernetes 中的 etcd

序言

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
2
3
4
5
ETCDCTL_API=3 etcdctl member list \
--endpoints https://10.10.10.10:2379 \
--cert=/etc/kubernetes/pki/etcd/server.crt \
--key=/etc/kubernetes/pki/etcd/server.key \
--insecure-skip-tls-verify

如果覺得指令太長的話,etcdctl 預設會去吃環境變數,也可以在環境變數中設定

1
2
3
export ETCDCTL_CERT_FILE='/etc/kubernetes/pki/etcd/server.crt'
export ETCDCTL_KEY_FILE='/etc/kubernetes/pki/etcd/server.key'
export ETCDCTL_ENDPOINTS='https://10.10.10.10:2379'

不確定這些資訊在哪裡的話,可以直接去看你 etcd 的 yaml 就可以看到了,這些資訊會在 etcd 的啟動參數中

匯出

確認可以連線之後,我們將 etcd 的內容完整的匯出,命名為 etcd-snapshot-$(date +%Y%m%d).db

1
2
3
4
5
ETCDCTL_API=3 etcdctl snapshot save /root/etcd-snapshot-$(date +%Y%m%d).db \
--endpoints https://10.10.10.10:2379 \
--cert=/etc/kubernetes/pki/etcd/server.crt \
--key=/etc/kubernetes/pki/etcd/server.key \
--insecure-skip-tls-verify

output:

1
Snapshot saved at /root/etcd-snapshot-20210521.db

匯入

匯出相較匯出麻煩一些,我們需要先讓 api-server 與 etcd 都終止,重新將 etcd 的資料匯入之後再重新打開它們。

我的 api-server 與 etcd 都是以 static pod 的方式存在,所以只要將對應的 yaml 檔案暫時移除 static pod 目錄即可

1
2
mv /etc/kubernetes/manifests/etcd.yaml /root/etcd.yaml
mv /etc/kubernetes/manifests/kube-apiserver.yaml /root/kube-apiserver.yaml

接著我們將舊的 etcd 資料暫時移開(同時進行備份)

1
mv /var/lib/etcd/default.etcd /var/lib/etcd/default.etcd.bak

將新的剛才匯出的 etcd 資料重新匯入

1
2
3
4
5
6
ETCDCTL_API=3 etcdctl snapshot restore /root/etcd-snapshot-20210521.db \
--name etcd-0 \
--initial-cluster "etcd-0=https://10.10.10.10:2380" \
--initial-cluster-token etcd-cluster \
--initial-advertise-peer-urls https://10.10.10.10:2380 \
--data-dir=/var/lib/etcd/default.etcd

output:

1
2
2021-05-21 07:42:36.826573 I | mvcc: restore compact to 3969180
2021-05-21 07:42:36.840090 I | etcdserver/membership: added member 9ce23f330769428b [https://10.10.10.10:2380] to cluster 457ee8b0c2eda630

匯出之後再把 api-server 與 etcd 重啟就可以了

1
2
mv /root/etcd.yaml /etc/kubernetes/manifests/etcd.yaml
mv /root/kube-apiserver.yaml /etc/kubernetes/manifests/kube-apiserver.yaml