數(shù)據(jù)無憂,一學(xué)就會:掌握CKA認證必備的etcd備份與還原秘籍!
etcd是一致且高可用的鍵值存儲,用作Kubernetes 所有集群數(shù)據(jù)的后臺數(shù)據(jù)庫。是一個非常重要的部件,因此,需要對這個部件進行備份,方便后續(xù)出現(xiàn)問題能盡快的恢復(fù)。
1.etcd基本使用方式
下面通過Kubernetes 練習(xí)環(huán)境Killercoda[1]進行實操。使用github賬號登錄到Killercoda平臺上,該平臺目前使用的是最新版本的Kubernetes。
Killercoda平臺
該系統(tǒng)上也安裝了etcd cli客戶端,如果沒有安裝,可以執(zhí)行下面的命令進行安裝:
apt install etcd-client
etcdcli 客戶端與etcd采用證書方式進行通信,kubeadm方式部署的Kubernetes可以通過yaml文件查看etcd的證書路徑。
etcd組件yaml
--initial-advertise-peer-urls:集群間會通告,此為通告地址,聲明節(jié)點端口,2380集群中使用,2379客戶端使用。
或者使用kubectl get pods etcd-controlplane -o yaml -n kube-system方式查看證書的路徑信息。如下圖:
etcd組件yaml
2.創(chuàng)建Nginx
通過下面的命令創(chuàng)建具有多個副本的 nginx 部署,這些副本將用于驗證 etcd 數(shù)據(jù)的恢復(fù)。
kubectl create deployment nginx \
--image=nginx \
--replicas=3
驗證新部署的 Pod 是否處于運行狀態(tài):
查看Pod狀態(tài)
3.備份Etcd數(shù)據(jù)
為 etcd 備份創(chuàng)建一個備份目錄mkdir etcd-backup運行以下命令進行 etcd 備份。
export ETCDCTL_API=3
etcdctl \
--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 \
snapshot save ./etcd-backup/etcdbackup.db
執(zhí)行完如下圖:
備份etcd
4.驗證備份數(shù)據(jù)
運行以下命令,以從新備份數(shù)據(jù)中獲取密鑰列表和詳細信息:
etcdctl --write-out=table snapshot status ./etcd-backup/etcdbackup.db
執(zhí)行完命令后如下圖:
5.將備份恢復(fù)到集群
(1) 在這里,我們將刪除之前創(chuàng)建的 nginx 部署,然后恢復(fù)備份,以便恢復(fù) nginx 部署。
controlplane $ kubectl delete deployments.apps nginx
deployment.apps "nginx" deleted
(2) 將數(shù)據(jù)從備份恢復(fù),執(zhí)行如下命令:
controlplane $ export ETCDCTL_API=3
controlplane $ mkdir -p /var/lib/restore
controlplane $ etcdctl snapshot restore etcd-backup/etcdbackup.db --data-dir=/var/lib/restore
--data-dir:是指定把數(shù)據(jù)還原到那個目錄下。
執(zhí)行完上述命令會在指定的目錄下生成etcd數(shù)據(jù)文件,如下圖:
還原備份
(3) 現(xiàn)在我們需要停止所有正在運行的Kubernetes組件以更新etcd數(shù)據(jù)。為此,我們在/etc/kubernetes/manifests/文件夾中放置了kubernetes組件的清單文件,我們將臨時將此文件移出此路徑,kubelet將自動刪除這些pod。
mkdir tmp
mv /etc/kubernetes/manifests/* tmp/
把/etc/kubernetes/manifests/目錄下的組件yaml文件,移走容器就開始刪除。可以通過crictl ps -a查看.
(4) 等待組件容器刪除后,我們需要修改etcd.yaml組件的etcd-data中的hostPath路徑參數(shù)
...省略...
volumes:
-hostPath:
path:/etc/kubernetes/pki/etcd
type:DirectoryOrCreate
name:etcd-certs
-hostPath:
path:/var/lib/restore
type:DirectoryOrCreate
name:etcd-data
status:{}
/var/lib/restore就是數(shù)據(jù)還原的路徑。
(5) 驗證k8s集群是否正常
controlplane $ kubectl get cs
Warning: v1 ComponentStatus is deprecated in v1.19+
NAME STATUS MESSAGE ERROR
controller-manager Healthy ok
scheduler Healthy ok
etcd-0 Healthy ok
controlplane $ kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-7854ff8877-6t6dl 1/1 Running 0 46m
nginx-7854ff8877-l6dq8 1/1 Running 0 46m
nginx-7854ff8877-pbkq9 1/1 Running 0 46m
6.CKA真題講解
CKA真題-etcd備份還原
中文解析:
此項目無需更改配置環(huán)境,但是,在執(zhí)行此項目之前,請確保您已返回初始節(jié)點。etcd 這道題真實考試為第4題,用的集群是真實考試時的上一題的集群,即真題第3題 mk8s,所以無需再切換集群了。
Task \
(1)首先,為運行在https://127.0.0.1:2379上的現(xiàn)有 etcd 實例創(chuàng)建快照并將快照保存到 /srv/data/etcd-snapshot.db 文件。
(2)為給定實例創(chuàng)建快照預(yù)計能在幾秒鐘內(nèi)完成。如果該操作似乎掛起,則命令可能有問題。用CTRL + C 來取消操作然后重試。
(3)然后還原位于/var/lib/backup/etcd-snapshot-previous.db的現(xiàn)有先前快照。
(4)提供了以下TLS證書和密鑰,以通過etcdctl 連接到服務(wù)器:
- CA證書: /opt/KUIN00601/ca.crt
- 客戶端證書: /opt/KUIN00601/etcd-client.crt
- 客戶端密鑰: /opt/KUIN00601/etcd-client.key
etcd備份還原官方文檔[2]
(1) 備份
如果不使用 export ETCDCTL_API=3,而使用ETCDCTL_API=3,則下面每條 etcdctl 命令前都要加ETCDCTL_API=3。
如果執(zhí)行時,提示permission denied,則是權(quán)限不夠,命令最前面加 sudo 即可。
export ETCDCTL_API=3
先檢查考試環(huán)境有沒有題目說的目錄 /srv/data/,沒有的話則需要自己創(chuàng)建:
mkdir -p /srv/data
備份時etcdctl客戶端需要帶上證書,,用題目給的三個證書:
etcdctl --endpoints=https://127.0.0.1:2379 \
--cacert=/opt/KUIN00601/ca.crt
--cert=/opt/KUIN00601/etcd-client.crt
--key=/opt/KUIN00601/etcd-client.key
save /srv/data/etcd-snapshot.db
可以使用etcdctl --write-out=table snapshot status /srv/data/etcd-snapshot.db驗證備份的數(shù)據(jù)。
(2) 還原操作
先創(chuàng)建一個還原數(shù)據(jù)存儲的目錄:
mkdir -p /var/lib/restore
執(zhí)行還原操作,并指定還原數(shù)據(jù)存儲目錄:
etcdctl --endpoints=https://127.0.0.1:2379 \
--cacert=/opt/KUIN00601/ca.crt
--cert=/opt/KUIN00601/etcd-client.crt
--key=/opt/KUIN00601/etcd-client.key
snapshot restore /var/lib/backup/etcd-snapshot-previous.db \
--data-dir=/var/lib/restore
移走/etc/kubernetes/manifests/到臨時目錄下tmp:
mkdir -p /home/tmp
mv /etc/kubernetes/manifests/*.yaml /home/tmp
在/home/tmp目錄下編輯etcd.yaml文件,修改etcd-data的hostPath路徑為/var/lib/restore:
volumes:
-hostPath:
path:/etc/kubernetes/pki/etcd
type:DirectoryOrCreate
name:etcd-certs
-hostPath:
path:/var/lib/restore
type:DirectoryOrCreate
name:etcd-data
status:{}
重新把/home/tmp目錄下的組件文件移動/etc/kubernetes/manifests/:
mv /home/tmp/*.yaml /etc/kubernetes/manifests/
(3) 驗證操作
驗證k8s集群是否正常:
controlplane $ kubectl get cs
Warning: v1 ComponentStatus is deprecated in v1.19+
NAME STATUS MESSAGE ERROR
controller-manager Healthy ok
etcd-0 Healthy ok
scheduler Healthy ok
到此整個etcd備份與還原操作就完成了。
參考資料:
- [1]Killercoda: https://killercoda.com/playgrounds/scenario/kubernetes
- [2]etcd備份還原官方文檔: https://kubernetes.io/zh-cn/docs/tasks/administer-cluster/configure-upgrade-etcd/#backing-up-an-etcd-cluster