4 kubernetes數據庫Etcd備份與恢復


4 kubernetes數據庫Etcd備份與恢復

Kubernetes使用Etcd數據庫實時存儲集群中的數據,安全起見,一定要備份。

4.1 kubeadm部署方式

master節點k8s集群環境,在master節點操作

1 備份

kubeadm部署的etcd沒有etcdctl命令,需要下載etcd二進制包。
下載地址: https://github.com/etcd-io/etcd/releases/download/v3.5.0/etcd-v3.5.0-linux-amd64.tar.gz
# tar -xzf etcd-v3.5.0-linux-amd64.tar.gz
# cp -a etcd-v3.5.0-linux-amd64/etcdctl /usr/bin/
# mkdir -p /opt/etcd_backup/


# ETCDCTL_API=3 etcdctl \
snapshot save /opt/etcd_backup/snap-etcd-$(date +%F-%H-%M-%S).db \
--endpoints=https://127.0.0.1:2379 \
--cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/etcd/server.crt \
--key=/etc/kubernetes/pki/etcd/server.key

: 會生成一個路徑為"/opt/etcd_backup/snap-etcd-2021-09-28-19-57-47.db"etcd備份文件。

 

2 恢復

(1) 為了方便測試,先刪除創建的pod
wps3B71.tmp

(2) 恢復etcd備份
1) 停掉kube-apiserveretcd容器
# mv /etc/kubernetes/manifests/ /etc/kubernetes/manifests-backup/

2) 對現在的etcd數據進行備份
# mv /var/lib/etcd/ /var/lib/etcd-$(date +%F-%H-%M-%S)-backup/
3) 恢復之前備份的etcd數據
# ETCDCTL_API=3 etcdctl \
snapshot restore /opt/etcd_backup/snap-etcd-2021-09-28-19-57-47.db \
--data-dir=/var/lib/etcd/
: /var/lib/etcd/目錄不存在時,還原時會自動創建

4) 啟動kube-apiserveretcd容器
# mv /etc/kubernetes/manifests-bac
kup/ /etc/kubernetes/manifests/

: 容器啟動需要一定時間,請耐心等待還原完成

5) 然后重啟所有節的kube-proxy容器和kubelet服務,否則pod無法正常進行訪問
# kubectl delete pod/<kube-proxy容器名> -n kube-system
# system restart kubelet.service

6) 再次查看,發現之前刪除的pod恢復回來了
# kubectl get
pod -o wide

4.2 二進制部署方式

k8s高可用(2apiserver)3個節點組成的etcd集群的環境下

 

1 說明

ETCD是一個高可用的分布式Key/Value存儲系統,它使用Raft算法,通過選舉來保持集群內各
節點狀態的一致性。雖然ETCD具有高可用的特點,但是也無法避免多個節點宕機,甚至全部
宕機的情況發生。如何快速的恢復集群,就變得格外重要。由於ETCD集群需要選舉產生leader
所以集群節點數目需要為奇數來保證正常進行選舉。而集群節點的數量並不是越多越好,過多
的節點會導致集群同步的時間變長,使得leader寫入的效率降低。線上的ETCD集群最好由三個
節點組成(即宕機一台,集群可正常工作),並開啟認證。

 

2 檢查etcd的健康狀態

# ETCDCTL_API=3 /opt/etcd/bin/etcdctl --cacert=/opt/etcd/ssl/ca.pem \
--cert=/opt/etcd/ssl/server.pem \
--key=/opt/etcd/ssl/server-key.pem \
--endpoints="https://172.16.1.81:2379,https://172.16.1.82:2379,https://172.16.1.83:2379" \
endpoint health --write-out=table
wps3B72.tmp

 

3 備份

# mkdir -p /opt/etcd_backup/
# ETCDCTL_API=3 /opt/etcd/bin/etcdctl \
snapshot save /opt/etcd_backup/snap-etcd-$(date +%F-%H-%M-%S).db \
--endpoints=https://172.16.1.81:2379 \
--cacert=/opt/etcd/ssl/ca.pem \
--cert=/opt/etcd/ssl/server.pem \
--key=/opt/etcd/ssl/server-key.pem

: 
--endpoints=https://172.16.1.81:2379
etcd集群每個節點上的數據都是相同的,在任意一個正常的節點上備份都能得到k8s集群完整的數據。

生成一個路徑為"/opt/etcd_backup/snap-etcd-2021-09-29-13-06-12.db"
etcd集群備份文件。

 

4 為了方便測試,刪除當前的pod

wps3B73.tmp 

 

5 集群超過半數節點宕機的恢復步驟

(1) 停止所有kube-apiserver
# systemctl stop kube-apiserver.service

(2) 停止etcd集群的各個節點
# systemctl stop etcd.service

(3) 備份etcd集群各個節點上當前的數據
# mv /var/lib/etcd/default.etcd/ /var/lib/etcd/default.etcd-$(date +%F-%H-%M-%S)-backup/

(4) etcd集群每個節點上恢復
前提: 將備份好的etcd數據復制到etcd集群各個節點上

# ETCDCTL_API=3 /opt/etcd/bin/etcdctl snapshot restore /opt/etcd_backup/snap-etcd-2021-09-29-13-06-12.db \
--name etcd-1 \
--initial-cluster="etcd-1=https://172.16.1.81:2380,etcd-2=https://172.16.1.82:2380,etcd-3=https://172.16.1.83:2380" \
--initial-cluster-token=etcd-cluster \
--initial-advertise-peer-urls=https://172.16.1.81:2380 \
--data-dir=/var/lib/etcd/default.etcd

參數說明: 
--name # 節點名稱
--initial-cluster # 集群中所有節點
--initial-cluster-token # 集群的ID
--initial-advertise-peer-urls # 告知集群其他節點當前的url
--data-dir # 指定節點的數據存儲目錄,這些數據包括節點ID,集群ID,集群初始化
# 配置,Snapshot文件等。
:
--name etcd-1
# 每個節點的唯一標識,在172.16.1.81-83節點上還原時,分別為etcd-1etcd-2etcd-3
--initial-advertise-peer-urls=https://172.16.1.81:2380
# ip替換為當前還原節點的ip地址,分別為172.16.1.81-
83

(5) etcd集群各個節點還原后啟動
# systemctl start etcd.service

# 檢查etcd集群健康狀態,如下圖可以看到集群還原成功
wps3B74.tmp

(6) 啟動所有kube-apiserver
# systemctl start kube-apiserver.service

(7) 查看pod已經還原,並且可以正常訪問
# kubectl
get pod

 

6 集群一個節點宕機的恢復步驟

(1) 查看集群健康狀態
# ETCDCTL_API=3 /opt/etcd/bin/etcdctl --cacert=/opt/etcd/ssl/ca.pem \
--cert=/opt/etcd/ssl/server.pem \
--key=/opt/etcd/ssl/server-key.pem \
--endpoints="https://172.16.1.81:2379,https://172.16.1.82:2379,https://172.16.1.83:2379" \
endpoint health --write-out=table
wps3B75.tmp
# 可以看到etcd集群中172.16.1.82 etcd節點出現了異常,但整個集群還是可用的狀態。

(2) 將異常etcd節點數據進行備份
# mv /var/lib/etcd/default.etcd/ /var/lib/etcd/default.etcd-$(date +%F-%H-%M-%S)-backup/

(3) 找到異常的etcd節點的ID
# ETCDCTL_API=3 /opt/etcd/bin/etcdctl --cacert=/opt/etcd/ssl/ca.pem \
--cert=/opt/etcd/ssl/server.pem \
--key=/opt/etcd/ssl/server-key.pem \
--endpoints="https://172.16.1.81:2379,https://172.16.1.82:2379,https://172.16.1.83:2379" \
member list --write-out=table
wps3B86.tmp
# 可以看到異常etcd節點的id"161f8426ecb09eb3"

(4) 根據上一步獲取的ID將異常的etcd節點從集群中移除
# ETCDCTL_API=3 /opt/etcd/bin/etcdctl --cacert=/opt/etcd/ssl/ca.pem \
--cert=/opt/etcd/ssl/server.pem \
--key=/opt/etcd/ssl/server-key.pem \
--endpoints="https://172.16.1.81:2379,https://172.16.1.82:2379,https://172.16.1.83:2379" \
member remove 161f8426ecb09eb3

#
移除成功,輸出內容如下:
Member 161f8426ecb09eb3 removed from cluster 80ff3a5935a32a1d

(5) 將節點重新加入集群
由於ETCD集群證書依賴於服務器IP,為避免重新制作證書,需要保持節點IP不變。
# ETCDCTL_API=3 /opt/etcd/bin/etcdctl --cacert=/opt/etcd/ssl/ca.pem \
--cert=/opt/etcd/ssl/server.pem \
--key=/opt/etcd/ssl/server-key.pem \
--endpoints="https://172.16.1.81:2379,https://172.16.1.82:2379,https://172.16.1.83:2379" \
member add etcd-2 --peer-urls=https://172.16.1.82:2380
wps3B87.tmp

(6) 修改異常etcd節點的配置文件
# vim /opt/etcd/cfg/etcd.conf
ETCD_INITIAL_CLUSTER_STATE="new" 修改為 ETCD_INITIAL_CLUSTER_STATE="existing"

(7) 啟動異常的etcd節點
# systemctl start etcd.service

(8) 查看etcd集群的健康狀態
# ETCDCTL_API=3 /opt/etcd/bin/etcdctl --cacert=/opt/etcd/ssl/ca.pem \
--cert=/opt/etcd/ssl/server.pem \
--key=/opt/etcd/ssl/server-key.pem \
--endpoints="https://172.16.1.81:2379,https://172.16.1.82:2379,https://172.16.1.83:2379" \
endpoint health --write-out=table
wps3B88.tmp
# 可以看到集群修復成功了


免責聲明!

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



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