2019年8月8日 星期四

master node 掛掉時的處理方式

寫這篇其實是完全不在計劃內,也是千百個不願意,因為早上不曉得什麼原因,某台 master node 掛掉了,請熟悉 KVM 的同事大大幫忙看,診斷結果是 image 也就是該 vm 的硬碟爛掉了,宣告不治。

以前處理過 worker node 掛掉的情況, worker node 簡單,掛掉了直接 delete node 然後裝一台重新 join 就好,心神無傷 (其實還是費工啦,不過至少用 vm 裝是輕鬆許多)。

之前看文件有印象是說,master node 也差不多,etcd 會自動 sync 。補充說明,我安裝 kubenretes cluster 的是用最基本的方式,用 kubeadm 把 master node 和 etcd 一起裝。

所以下午聽到噩耗時,想說那就面對吧。然後就....面對到錯誤訊息.....

先處理 join 的語法,到殘存的 master node 上用 kubectl 取得 join 資訊
# 取得 certificate key
kubeadm init phase upload-certs --experimental-upload-certs
# 取得 token 順便印出 join 語法
kubeadm token create --print-join-command

然後到新的 master node 上,用上面兩個資訊組合來 join 成 master node
kubeadm join :6443 --token --discovery-token-ca-cert-hash --control-plane --certificate-key

第一個錯誤訊息是....沒記錄到....  QQ
不過原因很間單,目前裝好的 kubernetes 版本是 1.15 ,而 vm 裡預設的好像是 1.13,升級 kubeadm 就好。
yum install -y kubeadm-1.15.0-0 kubelet-1.15.0-0 kubectl-1.15.0-0 --disableexcludes=kubernetes

第二個錯誤訊息類似是 "check-etcd error syncing endpoints with etcd"
於是我就找到這篇文章,裡面列出三部曲,照著做就可以練成神功,引刀自宮。

  • Removes the unhealthy etcd member C
  • kubectl delete node C
  • Updates the ClusterStatus in the configmap to remove C

這三部曲可以不用按照順序,事實上我一開始就已經自宮掉了 node C (第二步)

第一步是要把 etcd 自宮掉,但是老天鵝啊,考完 CKA 後我就沒再用過 etcdctl  指令了。
還好有筆記有保佑,沒花太多時間
# 先列出所有 etcd member ,然後找出屬於掛掉的 master node 裡的 etcd member
ETCDCTL_API=3 etcdctl --cacert="/etc/kubernetes/pki/etcd/ca.crt" --cert="/etc/kubernetes/pki/etcd/ca.crt" --key="/etc/kubernetes/pki/etcd/ca.key"  member list
# 移除該 etcd member
ETCDCTL_API=3 etcdctl --cacert="/etc/kubernetes/pki/etcd/ca.crt" --cert="/etc/kubernetes/pki/etcd/ca.crt" --key="/etc/kubernetes/pki/etcd/ca.key"  member remove 3290e2fc2debfa69
第三步看起來很令我狐疑,其實就是 kube-system namespace 裡的一個 configMap ,要把原本 master node 的資訊從裡面移除
kubectl -n kube-system edit cm kubeadm-config
就這樣,再跑一次 join 指令就搞定了。

好像沒事了? 我默默地為我留在舊的 master node 上的筆記哭泣、滴血。
因為我原本都是在那台 node 上操作的,套件安裝的一些設定、資訊、臨時筆記都留在上面............

沒有留言: