Kubernetes etcd災備與節點問題處理


前言:

  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


免責聲明!

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



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