概述
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 會刪除該容器。
- 首先,運行以下命令,在本地創建一個一次性快照:
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 的日志排查問題。