前言:
k8s集群的災備與恢復基於etcd的災備與恢復,etcd的數據默認會存放在命令的工作目錄(即master的/var/lib/etcd/)中,數據所在的目錄,會被分為兩個文件夾snap與wal:
- snap: 存放快照數據,etcd防止WAL文件過多而設置的快照,存儲etcd數據狀態。
- wal: 存放預寫式日志,最大的作用是記錄了整個數據變化的全部歷程。在etcd中,所有數據的修改在提交前,都要先寫入到WAL中。
單節點etcd數據備份和恢復基於數據文件的備份,Kubeadm的默認安裝時,將etcd的數據以文件形式存儲在宿主機的/var/lib/etcd/目錄,將此目錄下的文件定期備份起來,etcd的數據出現問題,需要恢復時,直接將文件還原到此目錄下,新庫加載文件,就實現了單節點的etcd數據庫的重建。
一、etcd的備份:
在做etcd單點備份之前,需要注意兩個問題:
- 如果etcd容器正在啟動,是不能覆蓋的,這時只需要將etcd的manifest文件[/etc/kubernetes/manifests/etcd.yaml]里的etcd版本號更改一下,然后用docker stop命令停止etcd容器,就不會自動重啟了。數據還原后,將etcd版本再回到正確的版本,kubelet服務就會自動將etcd容器重啟起來。
- etcd 目前最新的版本的 v3.1.1,但它的 API 有 v3 和 v2 之分,使用 v3 備份數據時存在 v2 的數據則不影響恢復,若使用 v2 備份數據時存在 v3 的數據則恢復失敗。(簡單的來說就是不能用低版本數據備份恢復在高版本服務器上
查看API版本的方法: docker exec -it <容器id> sh etcdctl --version etcdctl version: 3.0.4 API version: 2
備份實例:
cp /var/lib/etcd/ <backup file>
恢復實例:
cp etcd /var/lib/ (master節點/var/lib/etcd與etcd容器的/varlib/etcd為映射關系) 修改/etc/kubernetes/manifests/etcd.yaml中image項(隨便修改一個數字,稍后要改回來) 使用docker ps | grep -v pause | grep etcd 命令查看etcd容器,etcd容器消失后將image項改回來 稍等片刻kubelet就會將etcd服務啟動 使用docker ps | grep -v pause | grep etcd 命令便可查看到新etcd容器
二、kubernetes生產環境災備場景:
生產環境中的k8s集群可能出現的問題分以下兩種情況:
- node節點出現問題
- master節點出現問題
這兩種情況的解決辦法如下:
node節點問題:
node節點出現問題一般不會影響到集群的對外服務,處理node節點崩潰相對比較簡單,只需創建一個新節點並將其添加到集群中。加入集群步驟如下:(附:如果需要將老node加入新的cluser,則需要在node上執行kubeadm reset后,再重新加入)
生成token kubeadm token create 查看ca的hash編碼 openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //' 然后加入集群 kubeadm join 192.168.10.11:6443 --token yhns57.4s3y2yll21ew8mta \ --discovery-token-ca-cert-hash sha256:ce07a7f5b259961884c55e3ff8784b1eda6f8b5931e6fa2ab0b30b6a4234c09a
重新加入集群以后,master就會根據負載均衡策略,把負載高的節點上的pod調度到該新node,重新達到平衡
master節點問題:
k8s集群在master節點發生故障時,不會影響已有的pod運行和服務開放,所以對服務沒有影響,master節點的重建需要etcd數據庫的重建和master與k8s集群的重置,找到合適的機會重置master即可。
重置master節點需要備份文件,需要備份的文件有:
etcd數據庫備份:
/etc/kubernetes/目錄下的所有文件(證書,manifest文件)
- admin.conf
- controller-manager.conf
- kubelet.conf
- manifests
- pki
- scheduler.conf
用戶主目錄下.kube/config文件(kubectl連接認證)
/var/lib/kubelet/目錄下所有文件(plugins容器連接認證)
- config.yaml
- device-plugins
- pki
- plugins
- pod-resources
- cpu_manager_state
- kubeadm-flags.env
- plugin-containers
- plugins_registry
- pods
修復步驟:
重置master
kubeadm reset iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X 恢復etcd數據 將之前備份的/etc/kubernetes/與/var/lib/kubelet/目錄下的文件依次還原。 tar -zxvf <back file> -C /etc/kubernetes/ tar -zxvf <back file> -C /var/lib/kubelet/ 刪除/etc/kubernetes/manifest/目錄下的所有文件 rm -rf /etc/kubernetes/manifest/* 初始化集群 kubeadm init \ --pod-network-cidr=10.244.0.0/16 \ --kubernetes-version v1.13.3 \ --image-repository registry.aliyuncs.com/google_containers \ --ignore-preflight-errors=DirAvailable--var-lib-etcd 創建.kube目錄與config文件 mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
新機器使用備份重建master:
1.安裝好與之前備份版本相同的master.
2.關閉kublet服務(10250端口).
3.根據備份恢復/etc/kubernetes/與/var/lib/kubelet/和/var/lib/etcd目錄
4.開啟kubelet服務,kubelet服務就會將容器啟動。
5.檢驗集群回復情況。
三、當集群不可用:
如果是整個集群的崩潰的話,需要做的工作就是重建集群,當然,服務肯定會中斷,恢復的方法是重建master並恢復etcd數據庫,新建node節點並加入該master集群,新的pod就會自動建立,因為我們用的是etcd單點,且是低版本v2API,所以恢復etcd數據庫還是比較簡單的(十分鍾),這樣決定服務中斷時間的就是master和node的重建。數據損失取決於etcd備份的時間差。
參考鏈接:
https://blog.csdn.net/weixin_43046724/article/details/103504800