ETCD Part 1 : 備份與還原

Albert Weng
8 min readSep 27, 2023

--

ETCD是Kubernetes cluster中非常重要的元件,一定要知道怎麼備份與還原ETCD才能確保在Cluster crush的時候可以有挽救的機會(才不會被老闆k)。

store all of data

本文將分成三大部分說明:

  1. 何謂ETCD
  2. ETCD的備份
  3. ETCD的還原

那就開始吧!!

1. 何謂ETCD

Kubernetes使用ETCD (key-value)來儲存所有資料(包含configuration data, state, metadata)。ETCD會允許所有的K8S節點可以進行讀寫。

簡單來說,ETCD負責儲存系統「目前」的狀態與「期望」的狀態。包含當執行 “kubectl get XXX”所得到的結果,或是”kubectl create XXX”所建立的物件都會去更新ETCD的內容。

ETCD之間採用RAFT演算法進行溝通,1個Cluster至少需要3個節點(奇數),如果要更了解RAFT演算法是怎麼運作的,以下網站看到更清楚的說明Leader是如何被選出來的(Leader Election)、資料是怎麼進行複製到其他節點又能維持一致性(Log Replication),RAFT演算法主要是解決什麼問題等等。

Log Replication (From: http://thesecretlivesofdata.com/raft/)

2. ETCD的備份

S2–1. 取得ETCDCTL utility


[master]# ETCD_RELEASE=$(curl -s https://api.github.com/repos/etcd-io/etcd/releases/latest|grep tag_name | cut -d '"' -f 4)
[master]# echo $ETCD_RELEASE
v3.5.9

[master]# wget https://github.com/etcd-io/etcd/releases/download/${ETCD_RELEASE}/etcd-${ETCD_RELEASE}-linux-amd64.tar.gz
[master]# tar zxvf etcd-v3.5.9-linux-amd64.tar.gz
[master]# cd etcd-v3.5.9-linux-amd64
[master]# ls -al
[master]# etcdctl version

S2–2. 取得必要資訊,此步驟將會取得以下資訊,方式有三種(任選):

  • etcd endpoint : --endpoint
  • ca certificate : --cacert
  • server certificate : --cert
  • server key : --key
[Method 1]
[master]# vim /etc/kubernetes/manifests/etcd.yaml
[Method 2]
[master]# kubectl get po -n kube-system
[master]# kubectl describe pod etcd-master-node -n kube-system
[Method 3]
[master]# cat /etc/kubernetes/manifests/etcd.yaml |grep listen
[master]# cat /etc/kubernetes/manifests/etcd.yaml |grep file

S2–3. 進行備份

[master]# ETCDCTL_API=3 etcdctl \
--endpoints=https://10.107.88.12:2379 \
--cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/etcd/server.crt \
--key=/etc/kubernetes/pki/etcd/server.key \
snapshot save /root/etcd/etcd.db
# Verify

[master]# ETCDCTL_API=3 etcdctl --write-out=table snapshot status /root/etcd/etcd.db

3. ETCD的還原

以下利用一個測試來進行驗證與還原,情境如下:

  • 還原前:default namespace沒有任何內容
  • 進行備份
  • 在default ns下建立一個nginx pod
  • 建立一個新的資料夾,將資料還原至新的位置
  • 修改manifest讓ETCD使用新的位置
  • 還原後:default ns是否回到沒有資料的狀態
# 還原前:default namespace沒有任何內容

[master]# kubectl get default
No resources found in default namespace.
# 進行備份

[master]# ETCDCTL_API=3 etcdctl \
--endpoints=https://10.107.88.12:2379 \
--cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/etcd/server.crt \
--key=/etc/kubernetes/pki/etcd/server.key \
snapshot save /root/etcd/etcd-01.db
# 在default ns下建立一個nginx pod

[master]# kubectl run testpod --image=nginx -n default
# 建立一個新的資料夾,將資料還原至新的位置

[master]# mkdir /root/etcd-backup
[master]# ETCDCTL_API=3 etcdctl --data-dir="/root/etcd-backup" \
--endpoints=https://10.107.88.12:2379 \
--cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/etcd/server.crt \
--key=/etc/kubernetes/pki/etcd/server.key \
snapshot restore /root/etcd/etcd-01.db
# 此時狀態還沒還原

[master]# kubectl get pod -n default
NAME READY STATUS RESTARTS AGE
testpod 1/1 Running 0 6m2s
# 編輯/etc/kubernetes/manifests/etcd.yaml,指向上述還原的新目錄

[master]# tree /root/etcd-backup
[master]# vim /etc/kubernetes/manifests/etcd.yaml
# 存檔後,等候幾分鐘讓ETCD更新狀態(此時api沒有回應)

[master]# kubectl get pod -n default

以上就完成最基本的ETCD 還原動作,接下來的文章,我們將會針對一些其他的情境進行測試。個人建議除了ETCD的備份外,建議還要再加入像是Velero等軟體來另外對App做更進一步的保護,對整個Kubernetes cluster的環境能更加安全。

Part 2 這邊走:

--

--

Albert Weng
Albert Weng

Written by Albert Weng

You don't have to be great to start, but you have to start to be great

No responses yet