Etcd集群備份及容災恢復
在部署etcd集群時,建議使用基數個etcd實例,這樣至少可以保證集群有(N-1)/2
個實例是可以正常提供服務的。但是如果超過了(N-1)/2
個實例故障。就需要使用備份的etcd數據對集群進行容災恢復。
在我們生產環境部署的etcd集群是5節點,3個節點是本地sata盤,2個節點是ceph盤。本想使用這種方式為數據做HA的。但是由於ceph磁盤的IO很高(至少10ms以上),經常導致集群不穩定(IO滿導致機器假死,etcd實例還存活,但是網絡不通)。所以后期直接全部切換到本地sata盤。
由於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