RKE 叢集備份和恢復
概述
v0.1.7 或以上版本可用
RKE 叢集可以自動備份 etcd 節點的快照。在災難場景下,您可以使用這些快照恢復叢集。RKE 將快照儲存本地/opt/rke/etcd-snapshots路徑下。
v0.2.0 或以上版本可用
RKE 可將叢集快照上傳至 AWS S3 適配的後端機器。
說明:RKE v0.2.0 改變了儲存叢集狀態的方式,所以pki.bundle.tar.gz不再是必須的檔案。
備份叢集
您可以手動建立叢集備份,或為叢集建立定時快照。
建立一次性快照
RKE v0.2.0 或以上的版本
開啟命令列工具,輸入rke etcd snapshot-save命令,執行後即可儲存 cluster config 檔案內每個 etcd 節點的快照。RKE 會將節點快照儲存在/opt/rke/etcd-snapshots
- 首先,執行以下命令,在本地建立一個一次性快照:
rke etcd snapshot-save --config cluster.yml --name snapshot-name
結果: 建立了一個快照,儲存在 /opt/rke/etcd-snapshots路徑下。
- 然後,你可以進一步把上述快照檔案儲存到遠端儲存,以便災難恢復。
建立定時快照
RKE v0.2.0 或以上的版本
您可以啟用etcd-snapshot服務,使用相關的配置引數,開啟定時備份 etcd 節點快照功能。
etcd-snapshot在etcd容器之外的服務容器中執行。預設設定下,etcd-snapshot服務會為每一個具有etcd角色的節點建立快照,然後將這些快照儲存在本地的/opt/rke/etcd-snapshots路徑下。
快照服務日誌
執行已經啟用etcd-snapshot的叢集時,您可以在命令列工具中輸入docker logs etcd-rolling-snapshots,檢視etcd-rolling-snapshots日誌,確認叢集是否已開啟定時快照功能。如果叢集已經開啟定時快照功能,輸入該命令後,返回的訊息包含了每個快照的建立時間、建立資訊、名稱和執行時間,與下方程式碼示例相似。
docker logs etcd-rolling-snapshots time="2018-05-04T18:39:16Z" level=info msg="Initializing Rolling Backups" creation=1m0s retention=24h0m0s time="2018-05-04T18:40:16Z" level=info msg="Created backup" name="2018-05-04T18:40:16Z_etcd" runtime=108.332814ms time="2018-05-04T18:41:16Z" level=info msg="Created backup" name="2018-05-04T18:41:16Z_etcd" runtime=92.880112ms time="2018-05-04T18:42:16Z" level=info msg="Created backup" name="2018-05-04T18:42:16Z_etcd" runtime=83.67642ms time="2018-05-04T18:43:16Z" level=info msg="Created backup" name="2018-05-04T18:43:16Z_etcd" runtime=86.298499ms
Etcd-Snapshot 服務的可配置引數
建立定時快照時,可配置的主要引數如下表所示。
配置快照服務的 YAML 示例
services:
etcd:
backup_config:
interval_hours: 12 # 建立快照的間隔時間,單位是小時,12表示每12個小時建立一個快照
retention: 6 # 快照的存活時間,單位是小時
恢復叢集
您可以使用 RKE 備份的叢集快照恢復叢集。
RKE v0.2.0 或以上的版本
如果您的 Kubernetes 叢集發生了災難,您可以使用rke etcd snapshot-restore來恢復您的 etcd。這個命令可以將 etcd 恢復到特定的快照,應該在遭受災難的特定叢集的 etcd 節點上執行。
當您執行該命令時,將執行以下操作。
- 同步快照。
- 跨 etcd 節點檢查快照校驗和,確保它們是相同的。
- 通過執行rke remove刪除您當前的叢集並清理舊資料。這將刪除整個 Kubernetes 叢集,而不僅僅是 etcd 叢集。
- 從選擇的快照重建 etcd 叢集。
- 通過執行rke up建立一個新的叢集。
- 重新啟動集群系統 pod。
警告:在執行rke etcd snapshot-restore之前,您應該備份叢集中的任何重要資料,因為該命令會刪除您當前的 Kubernetes 叢集,並用新的叢集替換。
用於恢復 etcd 叢集的快照可以儲存在本地的/opt/rke/etcd-snapshots中,也可以儲存在遠端儲存。
從本地快照恢復的示例
請執行以下命令,從本地快照中還原 etcd:
rke etcd snapshot-restore --config cluster.yml --name mysnapshot
假設快照位於/opt/rke/etcd-snapshots中。
注意:不需要pki.bundle.tar.gz檔案,因為 RKE v0.2.0 改變了Kubernetes 叢集狀態的儲存方式。
示例場景
示例場景使用的是部署在兩個 AWS 節點上的 Kubernetes 叢集:node1 和node2。我們會模擬node2失效的場景,建立一個新的節點node3並將node2的快照備份遷移到node3。節點的詳細資訊如下表所示:
RKE v0.2.0 或更新的版本
概述
使用 RKE v0.2.0 或更新的版本進行備份和恢復叢集的操作指導,分為以下五個步驟:
- 備份叢集
- 模擬節點 failure
- 新建 etcd 節點
- 使用備份恢復新建節點的資料
- 確認恢復後的叢集處於正常狀態
備份叢集
執行以下命令,備份叢集。
rke etcd snapshot-save --name snapshot.db --config cluster.yml
模擬節點失效的場景
執行以下命令,關閉node2,模擬節點失效的場景。執行命令後,node2的狀態變更為不可用:
root@node2:~# poweroff
新建 etcd 節點
升級和恢復 etcd 節點之前,您需要將新建的節點新增到 Kubernetes 叢集內,併為其分配etcd角色。請開啟cluster.yml檔案,將node2相關的引數變更為註釋,然後新增新節點node3的引數,如下所示。
nodes:
- address: 10.0.0.1
hostname_override: node1
user: ubuntu
role:
- controlplane
- worker
# - address: 10.0.0.2
# hostname_override: node2
# user: ubuntu
# role:
# - etcd
- address: 10.0.0.3
hostname_override: node3
user: ubuntu
role:
- etcd
使用備份恢復新建節點的資料
先決條件:開始恢復節點前,請確保您的cluster.rkestate檔案有效,因為該檔案包含了叢集所需的證書資料。
將新建的節點新增到cluster.yml中後,執行 rke etcd snapshot-restore命令,從備份中啟動etcd:
rke etcd snapshot-restore --name snapshot.db --config cluster.yml
預設配置下,RKE 將快照儲存在/opt/rke/etcd-snapshots路徑。
說明:從 v0.2.0 開始,恢復叢集所需的證書資訊儲存在cluster.rkestate中,所以pki.bundle.tar.gz不再是恢復叢集時的必備檔案。
確認恢復後的叢集處於正常狀態
rke etcd snapshot-restore命令觸發了使用新的cluster.yml執行rke up命令。請執行kubectl get pods確認您的 Kubernetes 叢集處於正常狀態。如果狀態正常,返回的資訊應該與以下程式碼示例相似:
> kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-65899c769f-kcdpr 1/1 Running 0 17s
nginx-65899c769f-pc45c 1/1 Running 0 17s
nginx-65899c769f-qkhml 1/1 Running 0 17s
問題排查
從 RKEv0.1.9開始,不論恢復節點的結果是成功還是失敗,rke-bundle-cert容器都會被移除,無法依據完成恢復節點的流程以後,rke-bundle-cert容器是否依然存在,來確認恢復節點成功或失敗。您需要檢視 RKE 的日誌排查問題。