天天看點

ETCD資料的備份與恢複

ETCD資料的備份與恢複

一、單機備份

說明:執行etcd備份資料的恢複的機器必須和原先etcd所在機器一緻

1.1、單機備份

# 使用ETCDCTL API 3
[root@minio1 ~]# export ETCDCTL_API=3

# 寫入一條資料
[root@minio1 app]# ETCDCTL_API=3 etcdctl --endpoints="https://192.168.1.106:2379" --cert=/etc/etcd/ssl/etcd.pem --key=/etc/etcd/ssl/etcd-key.pem --cacert=/etc/kubernetes/pki/etcd/etcd-ca.pem  put /name/1 tzh
OK

# 讀取資料
[root@minio1 app]# ETCDCTL_API=3 etcdctl --endpoints="https://192.168.1.106:2379" --cert=/etc/etcd/ssl/etcd.pem --key=/etc/etcd/ssl/etcd-key.pem --cacert=/etc/kubernetes/pki/etcd/etcd-ca.pem  get /name/1
/name/1
tzh

# 備份資料
[root@minio1 app]# etcdctl --endpoints="https://192.168.1.106:2379" --cert=/etc/etcd/ssl/etcd.pem --key=/etc/etcd/ssl/etcd-key.pem --cacert=/etc/kubernetes/pki/etcd/etcd-ca.pem snapshot save `date +%Y-%m-%d`-etcd_back.db
           

1.2、單機資料恢複

# 停止etcd服務
[root@minio1 ~]# systemctl stop etcd

# 使用ETCDCTL API 3
[root@SZD-L0105331 ~]# export ETCDCTL_API=3

# 修改etcd啟動參數--data-dir指向上一步的資料恢複目錄,一般在/etc/etcd/etcd檔案中
# 注意--data-dir參數,恢複以後修改data-dir,再次啟動etcd
[root@minio1 ~]# grep data-dir /etc/etcd/etcd.config.yml
data-dir: /var/lib/etcd


[root@minio1 ~]# etcdctl snapshot restore 2021-12-07-etcd_back.db --name=minio1 --endpoints="https://192.168.1.106:2379" --cert=/etc/etcd/ssl/etcd.pem --key=/etc/etcd/ssl/etcd-key.pem --cacert=/etc/kubernetes/pki/etcd/etcd-ca.pem  --initial-cluster=minio1=https://192.168.1.106:2380 --initial-advertise-peer-urls=https://192.168.1.106:2380 --initial-cluster-token=etcd-cluster-0 --data-dir=/var/lib/etcd1

2021-12-07-etcd_back.db*********份檔案名
--name**************************主機名
--endpoints*********************
--cert**************************
--key***************************
--cacert************************
--initial-cluster***************本member側使用。描述叢集中所有節點的資訊,本member根據此資訊去聯系其他member
--initial-advertise-peer-urls***其他member使用,其他member通過該位址與本member互動資訊。一定要保證從其他member能可通路該位址。靜态配置方式下,該參數的value一定要同時在--initial-cluster參數中存在
--initial-cluster-token*********用于區分不同叢集。本地如有多個叢集要設為不同
--data-dir**********************該目錄下儲存了memberID,clusterID和資料等資訊

# 啟動etcd
[root@minio1 etcd]# systemctl start etcd

# 讀取資料
[root@minio1 app]# ETCDCTL_API=3 etcdctl --endpoints="https://192.168.1.106:2379" --cert=/etc/etcd/ssl/etcd.pem --key=/etc/etcd/ssl/etcd-key.pem --cacert=/etc/kubernetes/pki/etcd/etcd-ca.pem  get /name/1
/name/1
tzh
           

二、叢集模式下的資料備份與恢複

注意

:ETCD 不同的版本的 etcdctl 指令不一樣,但大緻差不多,本文備份使用

napshot save

, 每次備份

一個節點

就行。

指令備份

(k8s-master1 機器上備份):

$ ETCDCTL_API=3 etcdctl --cacert=/opt/kubernetes/ssl/ca.pem --cert=/opt/kubernetes/ssl/server.pem --key=/opt/kubernetes/ssl/server-key.pem --endpoints=https://192.168.1.36:2379 snapshot save /data/etcd_backup_dir/etcd-snapshot-`date +%Y%m%d`.db
           

備份腳本

(k8s-master1 機器上備份):

#!/usr/bin/env bash

date;

CACERT="/opt/kubernetes/ssl/ca.pem"
CERT="/opt/kubernetes/ssl/server.pem"
EKY="/opt/kubernetes/ssl/server-key.pem"
ENDPOINTS="192.168.1.36:2379"

ETCDCTL_API=3 etcdctl \
--cacert="${CACERT}" --cert="${CERT}" --key="${EKY}" \
--endpoints=${ENDPOINTS} \
snapshot save /data/etcd_backup_dir/etcd-snapshot-`date +%Y%m%d`.db

# 備份保留30天
find /data/etcd_backup_dir/ -name *.db -mtime +30 -exec rm -f {} \;
           

恢複

準備工作

  • 停止所有 Master 上

    kube-apiserver

    服務
$ systemctl stop kube-apiserver  

# 确認 kube-apiserver 服務是否停止 
$ ps -ef | grep kube-apiserver
           
  • 停止叢集中所有 ETCD 服務
$ systemctl stop etcd
           
  • 移除所有 ETCD 存儲目錄下資料
$ mv /var/lib/etcd/default.etcd /var/lib/etcd/default.etcd.bak
           
  • 拷貝 ETCD 備份快照
# 從 k8s-master1 機器上拷貝備份 
$ scp /data/etcd_backup_dir/etcd-snapshot-20191222.db root@k8s-master2:/data/etcd_backup_dir/ 
$ scp /data/etcd_backup_dir/etcd-snapshot-20191222.db root@k8s-master3:/data/etcd_backup_dir/
           

恢複備份

# k8s-master1 機器上操作
$ ETCDCTL_API=3 etcdctl snapshot restore /data/etcd_backup_dir/etcd-snapshot-20191222.db \
  --name etcd-0 \
  --initial-cluster "etcd-0=https://192.168.1.36:2380,etcd-1=https://192.168.1.37:2380,etcd-2=https://192.168.1.38:2380" \
  --initial-cluster-token etcd-cluster \
  --initial-advertise-peer-urls https://192.168.1.36:2380 \
  --data-dir=/var/lib/etcd/default.etcd
  
# k8s-master2 機器上操作
$ ETCDCTL_API=3 etcdctl snapshot restore /data/etcd_backup_dir/etcd-snapshot-20191222.db \
  --name etcd-1 \
  --initial-cluster "etcd-0=https://192.168.1.36:2380,etcd-1=https://192.168.1.37:2380,etcd-2=https://192.168.1.38:2380"  \
  --initial-cluster-token etcd-cluster \
  --initial-advertise-peer-urls https://192.168.1.37:2380 \
  --data-dir=/var/lib/etcd/default.etcd
  
# k8s-master3 機器上操作
$ ETCDCTL_API=3 etcdctl snapshot restore /data/etcd_backup_dir/etcd-snapshot-20191222.db \
  --name etcd-2 \
  --initial-cluster "etcd-0=https://192.168.1.36:2380,etcd-1=https://192.168.1.37:2380,etcd-2=https://192.168.1.38:2380"  \
  --initial-cluster-token etcd-cluster \
  --initial-advertise-peer-urls https://192.168.1.38:2380 \
  --data-dir=/var/lib/etcd/default.etcd
           

上面三台 ETCD 都恢複完成後,依次登陸三台機器啟動 ETCD

$ systemctl start etcd
           

三台 ETCD 啟動完成,檢查 ETCD 叢集狀态

$ ETCDCTL_API=3 etcdctl --cacert=/opt/kubernetes/ssl/ca.pem --cert=/opt/kubernetes/ssl/server.pem --key=/opt/kubernetes/ssl/server-key.pem --endpoints=https://192.168.1.36:2379,https://192.168.1.37:2379,https://192.168.1.38:2379 endpoint health
           

三台 ETCD 全部健康,分别到每台 Master 啟動 kube-apiserver

$ systemctl start kube-apiserver
           

檢查 Kubernetes 叢集是否恢複正常

$ kubectl get cs
           

總結:

Kubernetes 叢集備份主要是備份 ETCD 叢集。而恢複時,主要考慮恢複整個順序:

停止kube-apiserver --> 停止ETCD --> 恢複資料 --> 啟動ETCD --> 啟動kube-apiserve
           

注意:備份ETCD叢集時,隻需要備份一個ETCD就行,恢複時,拿同一份備份資料恢複

原文連結:https://zhuanlan.zhihu.com/p/101523337