Day 03有提到,ETCD是一種Key-Value型態的資料庫,用來保存Kubernetes集群中的各種數據。而當災難發生時,使用ETCD的備份來復原是很重要的。
Kubernetes本身集群內Object的備份方式有兩種:
儲存YAML檔:將集群目前的所有Object之設定備份成YAML檔。當發生問題需要找回這些數據時,再使用此YAML檔來還原。
# 於Master Node將所有物件之設定存成YAML檔
kubectl get all -A > all-of-cluster-objects.yaml
# 於Master Node使用該YAML檔還原物件
kubectl apply -f all-of-cluster-objects.yaml
如果希望只還原部分的Object。只要在此YAML中擷取這些Object的部分,並建立新的的YAML,再用新的YAML還原就可以了。
將ETCD集群使用etcdctl備份成快照檔:若發生問題需要還原時,再將快照檔還原。
# 於Master Node取得etcdctl,但必須先安裝golang,如果有缺再做。
go get github.com/coreos/etcd/etcdctl
# 因為ETCD是Static Pods,所以可以在Master Node的/etc/kubernetes/manifests/資料夾中找到必要之參數
cat /etc/kubernetes/manifests/etcd.yaml
# 也可以直接查看ETCD Pod的設定來取得參數,$etcdPodName可代換成自己的ETCD Pod名稱
kubectl get pod -n kube-system $etcdPodName -o yaml
# 或是
kubectl describe pod -n kube-system $etcdPodName
# 取得advertise-client-urls, cert-file, key-file
# $masterNodeIp為自己的Master Node的IP
- --advertise-client-urls=https://$masterNodeIp:2379
- --cert-file=/etc/kubernetes/pki/etcd/server.crt
- --key-file=/etc/kubernetes/pki/etcd/server.key
- --trusted-ca-file=/etc/kubernetes/pki/etcd/ca.crt
# 於Master Node對ETCD快照
# 必須先設置環境變ETCDCTL_API=3來使用etcd v3
# --endpoints對應--advertise-client-urls
# --cacert對應--trusted-ca-file
# --cert對應--cert-file
# --key對應--key-file
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 /tmp/snapshot-pre-boot.db
# 若是覺得每次都要先宣告環境變數很麻煩,也可以使用export來設定環境變數,那之後的etcdctl指令都不需要先設置環境變數告知使用v3了
export ETCDCTL_API=3
# 將ETCD使用快照還原到指定的位置
# --data-dir代表要將ETCD還原的位置,這邊選擇/var/lib/etcd-from-backup
etcdctl --data-dir /var/lib/etcd-from-backup snapshot restore /tmp/snapshot-pre-boot.db
修改/etc/kubernetes/manifests/etcd.yaml,將--data-dir所指定的位置替換掉volume etcd-data的path
volumes:
- hostPath:
path: /var/lib/etcd
type: DirectoryOrCreate
name: etcd-data
# 改為
volumes:
- hostPath:
path: /var/lib/etcd-from-backup
type: DirectoryOrCreate
name: etcd-data
觀察ETCD container是否重建完成,但這個指令Docker的指令,須確認考試環境是否支援。
docker ps | grep etcd
# 若是等候許久,卻依然沒有重建完成,可將kubelet重啟
systemctl restart kubelet
在開始準備CKA考試之前都沒仔細研究要怎麼使用etcd,直到看到考試範圍才發現ETCD的備份與還原這麼重要XD
kubernetes-cka-practice-test-solution-etcd-backup-and-restore