為什麼人家裝起來都這麼順利,我就要一直重來一直改設定阿~
圖片來源:Docker (@Docker) / Twitter
今天來記錄一下修改設定、重置、升級版本的步驟~
如果 安裝過程都很順利 但想要更改 kubeadm init 的設定,或是已經運行一段時間想要更動 kubeadm 設定可以照以下步驟
將 node 上運行的服務清掉
kubectl drain <node> --ignore-daemonsets
修改 kubeadm 設定檔
sudo vim /var/lib/kubelet/kubeadm-flags.env
使用 kubectl 編輯 node
kubectl edit node <node>
重啟 kubelet
sudo systemctl daemon-reload
sudo systemctl restart kubelet
恢復 node 運作
kubectl uncordon <node>
如果你是安裝完之後想要把 node 重置可以參考一下
(像我是手殘設定錯誤、更改 pod-network-cidr
重新配內部 ip,因為還沒部署什麼服務所以乾脆 reset~)
到 Control Plane
將 node 上運行的服務清掉 (若有在該 node 上部署 hostPath PersistentVolume 也需要刪除)
kubectl drain <node> --ignore-daemonsets
將 node 從 cluster 移除
kubectl delete <node>
回到 node 上
重置 node
sudo kubeadm reset --cri-socket unix:///var/run/cri-dockerd.sock
檢查 port
nc -v 127.0.0.1 6443
output... 若顯示連接成功代表有 process 佔用
Connection to 127.0.0.1 6443 port [tcp/*] succeeded!
檢查是哪個 process
sudo netstat -tulpn | grep :6443
# or
sudo lsof -i -P -n | grep :6443
若看到的是 kube-apiser
或 kube-apis
代表 api 還在運行
有可能是 kubeadm reset
失敗請 先回頭看看錯誤資訊
journalctl -xe _SYSTEMD_UNIT=kubelet.service
真的無解再試試看下面幾個方法:
sudo reboot
對我最有用的還是重新開機...
居然重開就好了,那我剛剛搞了好幾個小時到底在幹嘛...
sudo systemctl stop kubelet
sudo systemctl daemon-reload
sudo systemctl restart kubelet docker
sudo kill <PID>
把 api 砍掉接著執行 kubeadm init
或 kubeadm join
分為更新 Control Plane 及 更新 Worker Node
註:我只測試了
v1.24
->v1.25.1
先確認有哪些版本
sudo apt update
apt-cache madison kubeadm
# 只找最新的幾個版本
apt-cache madison kubeadm | head
output...
kubeadm | 1.25.1-00 | https://apt.kubernetes.io kubernetes-xenial/main amd64 Packages
kubeadm | 1.25.0-00 | https://apt.kubernetes.io kubernetes-xenial/main amd64 Packages
kubeadm | 1.24.5-00 | https://apt.kubernetes.io kubernetes-xenial/main amd64 Packages
kubeadm | 1.24.4-00 | https://apt.kubernetes.io kubernetes-xenial/main amd64 Packages
kubeadm | 1.24.3-00 | https://apt.kubernetes.io kubernetes-xenial/main amd64 Packages
kubeadm | 1.24.2-00 | https://apt.kubernetes.io kubernetes-xenial/main amd64 Packages
kubeadm | 1.24.1-00 | https://apt.kubernetes.io kubernetes-xenial/main amd64 Packages
kubeadm | 1.24.0-00 | https://apt.kubernetes.io kubernetes-xenial/main amd64 Packages
kubeadm | 1.23.11-00 | https://apt.kubernetes.io kubernetes-xenial/main amd64 Packages
kubeadm | 1.23.10-00 | https://apt.kubernetes.io kubernetes-xenial/main amd64 Packages
假設我要升級到 1.25.1-00
...
sudo apt-mark unhold kubeadm
sudo apt-get update
sudo apt-get install -y kubeadm=1.25.1-00
sudo apt-mark hold kubeadm
檢查版本
sudo kubeadm version
驗證升級
sudo kubeadm upgrade plan
選擇 kubeadm 要升級的版本
sudo kubeadm upgrade apply v1.25.1
如果有多個 Control Plane
sudo kubeadm upgrade node
清除 node 上的服務
kubectl drain <node> --ignore-daemonsets
升級 kubelet, kubectl
sudo apt-mark unhold kubelet kubectl
sudo apt-get update
sudo apt-get install -y kubelet=1.25.1-00 kubectl=1.25.1-00
sudo apt-mark hold kubelet kubectl
重啟 kubelet
sudo systemctl daemon-reload
sudo systemctl restart kubelet
恢復 node 運作
kubectl uncordon <node>
Worker Node 對於 kubeadm 的步驟比 Control Plane 少一點
安裝 kubeadm
sudo apt-mark unhold kubeadm
sudo apt-get update
sudo apt-get install -y kubeadm=1.25.1-00
sudo apt-mark hold kubeadm
升級 node
sudo kubeadm upgrade node
清除 node 上的服務
kubectl drain <node> --ignore-daemonsets
升級 kubelet, kubectl
sudo apt-mark unhold kubelet kubectl
sudo apt-get update
sudo apt-get install -y kubelet=1.25.1-00 kubectl=1.25.1-00
sudo apt-mark hold kubelet kubectl
重啟 kubelet
sudo systemctl daemon-reload
sudo systemctl restart kubelet
恢復 node 運作
kubectl uncordon <node>
完成更新後使用 kubectl get nodes
可以看到版本資訊
NAME STATUS ROLES AGE VERSION
whale1 NotReady control-plane 2d16h v1.25.1
whale2 Ready <none> 48h v1.25.1
whale3 Ready <none> 44h v1.25.1
舊的不去新的不來~ 遲早都要升級的啦~