1. 程式人生 > 其它 >RKE 叢集備份和恢復

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 會建立一個用於備份快照的容器。完成備份後,RKE 會刪除該容器。

  1. 首先,執行以下命令,在本地建立一個一次性快照:
rke etcd snapshot-save --config cluster.yml --name snapshot-name

結果: 建立了一個快照,儲存在 /opt/rke/etcd-snapshots路徑下。

  1. 然後,你可以進一步把上述快照檔案儲存到遠端儲存,以便災難恢復。

建立定時快照

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 或更新的版本進行備份和恢復叢集的操作指導,分為以下五個步驟:

  1. 備份叢集
  2. 模擬節點 failure
  3. 新建 etcd 節點
  4. 使用備份恢復新建節點的資料
  5. 確認恢復後的叢集處於正常狀態

備份叢集

執行以下命令,備份叢集。

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 的日誌排查問題。