以前處理過 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
第一步是要把 etcd 自宮掉,但是老天鵝啊,考完 CKA 後我就沒再用過 etcdctl 指令了。
還好有筆記有保佑,沒花太多時間
# 先列出所有 etcd member ,然後找出屬於掛掉的 master node 裡的 etcd member第三步看起來很令我狐疑,其實就是 kube-system namespace 裡的一個 configMap ,要把原本 master node 的資訊從裡面移除
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
kubectl -n kube-system edit cm kubeadm-config就這樣,再跑一次 join 指令就搞定了。
好像沒事了? 我默默地為我留在舊的 master node 上的筆記哭泣、滴血。
因為我原本都是在那台 node 上操作的,套件安裝的一些設定、資訊、臨時筆記都留在上面............