Etcd集群備份及容災恢復


Etcd集群備份及容災恢復

在部署etcd集群時,建議使用基數個etcd實例,這樣至少可以保證集群有(N-1)/2個實例是可以正常提供服務的。但是如果超過了(N-1)/2個實例故障。就需要使用備份的etcd數據對集群進行容災恢復。

在我們生產環境部署的etcd集群是5節點,3個節點是本地sata盤,2個節點是ceph盤。本想使用這種方式為數據做HA的。但是由於ceph磁盤的IO很高(至少10ms以上),經常導致集群不穩定(IO滿導致機器假死,etcd實例還存活,但是網絡不通)。所以后期直接全部切換到本地sata盤。

etcd 證書制作

由於v3版本的etcd證書是基於IP的,所以每次新增etcd節點都需要重新制作證書。 詳情https://github.com/cloudflare/cfssl

備份etcd數據

只需要在單節點etcd上執行下面的命令就可以對etcd進行數據備份。我們是每兩個小時備份一次數據,並上傳到S3上,並保留最近兩天的數據。

# mkdir -p /var/lib/etcd_backup/
# ETCDCTL_API=3 etcdctl snapshot  save /var/lib/etcd_backup/etcd_$(date "+%Y%m%d%H%M%S").db

 

恢復etcd數據(集群不可用,災難恢復)

一、local恢復

1、首先需要停止master節點的kube-apiserver服務

# systemctl stop kube-apiserver

確保kube-apiserver已經停止了,執行下列命令返回值為0

# ps -ef|grep kube-api|grep -v grep |wc -l
0

 

2、停掉集群中的所有etcd服務

# systemctl stop etcd

確保所有etcd節點停止成功

# ps -ef|grep etcd|grep -v etcd|wc -l
0

3、移除所有etcd服務實例的數據目錄


# mv /var/lib/etcd/default.etcd /var/lib/etcd/default.etcd_bak
 
# rm -f /var/lib/etcd/default.etcd_bak     // 可刪除、可不刪除,建議保留

 

4、拷貝備份好的tar包至所有etcd節點

 
mkdir /var/lib/etcd_backup                           // 若沒有,創建etcd_backup目錄;若有,則不用創建
cp $BACKUP_FILE_NAME.tar /var/lib/etcd_backup       // 拷貝tar包至etcd_backup目錄
cd /var/lib/etcd_backup                              // 進入/var/lib/etcd_backup目錄
tar -xzvf $BACKUP_FILE_NAME.tar                     // 解壓備份的tar包

 

5、執行恢復命令,所有etcd節點依次執行

etcdctl snapshot restore /var/lib/etcd_backup/$BACKUP_FILE_NAME/etcd_snapshot.db \
--cacert=$ETCD_TRUSTED_CA_FILE \
--cert=$ETCD_CERT_FILE \
--key=$ETCD_KEY_FILE \
--name $ETCD_NAME \
--initial-cluster $ETCD_INITIAL_CLUSTER \
--initial-advertise-peer-urls $ETCD_INITIAL_ADVERTISE_PEER_URLS \
--data-dir=/var/lib/etcd/default.etcd

 

備注 :vim /etc/etcd/etcd.conf,查看配置信息,以及所需字段:ETCD_TRUSTED_CA_FILE、ETCD_CERT_FILE、ETCD_KEY_FILE、ETCD_NAME、ETCD_INITIAL_CLUSTER、ETCD_INITIAL_ADVERTISE_PEER_URLS

6、修改etcd數據目錄權限

chown -R etcd:etcd /var/lib/etcd/default.etcd;chmod -R 700 /var/lib/etcd/default.etcd

7、同時啟動etcd集群的所有etcd實例

# systemctl start etcd

 

8、檢查所有節點etcd健康狀態

HOST_1=10.243.xxx.xxx
HOST_2=10.243.xxx.xxx
HOST_3=10.243.xxx.xxx
ETCD_ENDPOINTS=$HOST_1:2379,$HOST_2:2379,$HOST_3:2379
 
etcdctl \
-w table --cacert=/etc/kubernetes/ssl/ca.pem \
--cert=/etc/kubernetes/ssl/etcd.pem \
--key=/etc/kubernetes/ssl/etcd-key.pem \
--endpoints=${ETCD_ENDPOINTS} endpoint health

 

9、啟動master節點的所有kube-apiserver服務

 
# systemctl start kube-apiserver
# systemctl status kube-apiserver

 

摘除etcd節點

向我們遇到的問題,需要將ceph節點的機器換成本地sata盤的機器,就需要先將部署在ceph上的etcd實例從集群中先摘除掉,然后在增加新的etcd實例到集群中。

1.查看etcd集群member信息

#etcdctl --ca-file=/etc/etcd/ssl/ca.pem --cert-file=/etc/etcd/ssl/etcd.pem --key-file=/etc/etcd/ssl/etcd-key.pem member list

 

2.根據member信息移除具體的etcd實例

#etcdctl --ca-file=/etc/etcd/ssl/ca.pem --cert-file=/etc/etcd/ssl/etcd.pem --key-file=/etc/etcd/ssl/etcd-key.pem member remove <member_id>

 

3.停止etcd集群中被移除的etcd實例

# systemctl stop etcd
# yum remove -y etcd-xxxx

 

4.查看etcd實例是否從集群中被移除

#etcdctl --ca-file=/etc/etcd/ssl/ca.pem --cert-file=/etc/etcd/ssl/etcd.pem --key-file=/etc/etcd/ssl/etcd-key.pem member list

 

新增etcd節點

在已經存在的etcd節點上執行如下命令,增加新的etcd節點到集群中。

# etcdctl --ca-file=/etc/etcd/ssl/ca.pem --cert-file=/etc/etcd/ssl/etcd.pem --key-file=/etc/etcd/ssl/etcd-key.pem member add <etcd_name> http://<etcd_node_address>:2380
ETCD_NAME=etcd01
ETCD_INITIAL_CLUSTER="etcd01=http://ip1:2380,etcd02=http://ip2:2380,etcd03=http://ip3:2380,etcd04=http://ip4:2380,etcd05=http://ip5:2380"
ETCD_INITIAL_CLUSTER_STATE="existing"

 

注意:

  • etcd_name: etcd.conf配置文件中ETCD_NAME內容

  • etdc_node_address: etcd.conf配置文件中的ETCD_LISTEN_PEER_URLS內容

此時新的etcd節點已經被加到了現有的etcd集群。修改新增加的etcd節點的配置文件/etc/etcd/etcd.conf, 將ETCD_INITIAL_CLUSTER修改成上面輸出的內容,並增加相關的配置。

啟動新的etcd節點:

# systemctl start etcd

 

並對已經存在的etcd節點的配置項ETCD_INITIAL_CLUSTER增加<new_etcd_node_name>=http://<new_etcd_node_address>:2380參數。並“同時”重啟所有的etcd。

更新etcd節點

ETCDCTL_API=3 etcdctl member update  <member-ID> http://<etcd_node_address_ip>:2380

 

參考

https://www.maideliang.com/index.php/archives/25/

https://alexstocks.github.io/html/etcd.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM