Kubernetes 的升級和維護對於保持 Cluster 的安全性和穩定性相當重要。使用 kubeadm
來管理 Kubernetes Cluster 的升級過程,可以幫助你順利進行版本更新。kubeadm
提供了一個相對簡單和可靠的方法來升級 Kubernetes 控制平面和節點,同時最大限度地減少對運行中工作負載的影響。以下是使用 kubeadm
進行 Kubernetes Cluster 升級和維護的詳細步驟。
首先,檢查當前 Kubernetes Cluster 的版本,以確保你了解目前運行的版本和即將升級的版本:
kubectl version
這將顯示控制平面和節點的 Kubernetes 版本。
Client Version: v1.30.3
Kustomize Version: v5.0.4-0.20230601165947-6ce0bf390ce3
Server Version: v1.30.3
Kubernetes 建議每次只升級一個次版本(例如從 1.30 升級到 1.31),而不是直接跳過多個版本。請檢查升級指南和發行說明,以了解版本相容性和升級過程中可能遇到的 API 變更。
kubeadm upgrade不會影響您的工作負載,只會影響 Kubernetes 內部的元件,但備份就像是買保險,最好期望用不到,但是又不能沒有買。
升級前務必備份 etcd 資料庫和 Cluster 設定。這樣即使在升級過程中出現問題,你仍然可以恢復到升級前的狀態。
2023 年 9 月 13 日之後發布的 Kubernetes 版本已經將套件儲存庫更換到 pkgs.k8s.io,提供從 v1.24.0 開始的 Kubernetes 版本的下載。
社群擁有的套件儲存庫的結構方式是每個 Kubernetes 次要版本都有一個專用的套件儲存庫。
當你需要將叢集升級到另一個次要版本時才需要執行此步驟。
如果您要升級到同一次要版本中的另一個更新版本(例如 v1.31.5 到 v1.31.7),則無需變更套件儲存庫。
本範例中,將會由 1.30升級次要版本到1.31,請編輯 Kubernetes 儲存庫的檔案/etc/yum.repos.d/kubernetes.repo
,並將這些 URL 中的版本變更為下一個可用的次要版本
(如v1.30修改為v1.31),以下是修改後的版本:
[kubernetes]
name=Kubernetes
baseurl=https://pkgs.k8s.io/core:/stable:/v1.31/rpm/
enabled=1
gpgcheck=1
gpgkey=https://pkgs.k8s.io/core:/stable:/v1.31/rpm/repodata/repomd.xml.key
接著你可以透過下列指令來查看目前有哪些版本可以更新:
sudo dnf list --showduplicates kubeadm
你可以在在清單中尋找最新的1.31版本,它應該類似於 1.31.x-*,其中 x 是最新的更新版本。
執行畫面如下列:
Installed Packages
kubeadm.x86_64 1.30.3-150500.1.1 @kubernetes
Available Packages
kubeadm.aarch64 1.31.0-150500.1.1 kubernetes
kubeadm.ppc64le 1.31.0-150500.1.1 kubernetes
kubeadm.s390x 1.31.0-150500.1.1 kubernetes
kubeadm.src 1.31.0-150500.1.1 kubernetes
kubeadm.x86_64 1.31.0-150500.1.1 kubernetes
此範例中將會選擇升級到 1.31.0
。
首先,升級 kubeadm 到目標版本。這可以通過dnf來完成:
sudo dnf install -y kubeadm-'1.31.x-*'
記得將1.31.x-*中的x替換為要安裝的新版本,後面就不再贅述。
執行畫面如下圖所示,將會把kubeadm更新到1.31.0-150500.1.1
:
================================================================================
Package Architecture Version Repository Size
================================================================================
Upgrading:
kubeadm x86_64 1.31.0-150500.1.1 kubernetes 11 M
Transaction Summary
================================================================================
Upgrade 1 Package
Total download size: 11 M
安裝完成後可以透過下列指令來檢查kubeadm版本
sudo kubeadm version
執行後可以看到版本資訊如下:
kubeadm version: &version.Info{Major:"1", Minor:"31", GitVersion:"v1.31.0", GitCommit:"9edcffcde5595e8a5b1a35f88c421764e575afce", GitTreeState:"clean", BuildDate:"2024-08-13T07:35:57Z", GoVersion:"go1.22.5", Compiler:"gc", Platform:"linux/amd64"}
使用 kubeadm 檢查升級計劃,確保所有組件的版本相容:
sudo kubeadm upgrade plan
執行之後會如果正確會看到以下訊息:
[preflight] Running pre-flight checks.
[upgrade/config] Reading configuration from the cluster...
[upgrade/config] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml'
[upgrade] Running cluster health checks
[upgrade] Fetching available versions to upgrade to
[upgrade/versions] Cluster version: 1.30.3
[upgrade/versions] kubeadm version: v1.31.0
[upgrade/versions] Target version: v1.31.0
[upgrade/versions] Latest version in the v1.30 series: v1.30.4
Components that must be upgraded manually after you have upgraded the control plane with 'kubeadm upgrade apply':
COMPONENT NODE CURRENT TARGET
kubelet k8s-cp v1.30.3 v1.30.4
kubelet k8s-n1 v1.30.3 v1.30.4
Upgrade to the latest version in the v1.30 series:
COMPONENT NODE CURRENT TARGET
kube-apiserver k8s-cp v1.30.3 v1.30.4
kube-controller-manager k8s-cp v1.30.3 v1.30.4
kube-scheduler k8s-cp v1.30.3 v1.30.4
kube-proxy 1.30.3 v1.30.4
CoreDNS v1.11.1 v1.11.1
etcd k8s-cp 3.5.12-0 3.5.15-0
You can now apply the upgrade by executing the following command:
kubeadm upgrade apply v1.30.4
_____________________________________________________________________
Components that must be upgraded manually after you have upgraded the control plane with 'kubeadm upgrade apply':
COMPONENT NODE CURRENT TARGET
kubelet k8s-cp v1.30.3 v1.31.0
kubelet k8s-n1 v1.30.3 v1.31.0
Upgrade to the latest stable version:
COMPONENT NODE CURRENT TARGET
kube-apiserver k8s-cp v1.30.3 v1.31.0
kube-controller-manager k8s-cp v1.30.3 v1.31.0
kube-scheduler k8s-cp v1.30.3 v1.31.0
kube-proxy 1.30.3 v1.31.0
CoreDNS v1.11.1 v1.11.1
etcd k8s-cp 3.5.12-0 3.5.15-0
You can now apply the upgrade by executing the following command:
kubeadm upgrade apply v1.31.0
_____________________________________________________________________
The table below shows the current state of component configs as understood by this version of kubeadm.
Configs that have a "yes" mark in the "MANUAL UPGRADE REQUIRED" column require manual config upgrade or
resetting to kubeadm defaults before a successful upgrade can be performed. The version to manually
upgrade to is denoted in the "PREFERRED VERSION" column.
API GROUP CURRENT VERSION PREFERRED VERSION MANUAL UPGRADE REQUIRED
kubeproxy.config.k8s.io v1alpha1 v1alpha1 no
kubelet.config.k8s.io v1beta1 v1beta1 no
_____________________________________________________________________
進行控制平面的升級,這將升級 API server、controller-manager 和 scheduler:
sudo kubeadm upgrade apply v1.31.x
確保升級過程中沒有錯誤,並檢查所有控制平面組件的狀態。
命令完成後,您應該會看到:
[upgrade/successful] SUCCESS! Your cluster was upgraded to "v1.31.x". Enjoy!
[upgrade/kubelet] Now that your control plane is upgraded, please proceed with upgrading your kubelets if you haven't already done so.
如果你是使用多台控制平面節點,在完成了第一台的升級之後,可以接著執行其他台,第二台以後的節點,在安裝完新版kubeadm,只需要使用sudo kubeadm upgrade node
即可。
透過將節點標記為不可調度並逐出工作負載來準備節點以進行維護:
kubectl drain <node-to-drain> --ignore-daemonsets
上列指令中,請將 <node-to-drain>
替換為要排出的節點的名稱。
在控制平面成功升級後,繼續升級 kubelet:
sudo dnf install -y kubelet-'1.31.x-*'
升級 kubectl 以保持與Cluster版本一致:
sudo dnf install -y kubectl-'1.31.x-*'
重新載入 Systemd 設定的指令:
sudo systemctl daemon-reload
當你修改了某個服務的設定檔案(例如 .service、.socket 或其他 Systemd 單元檔案)後,執行這個指令可以告訴 Systemd 重新讀取這些設定檔案,而不需要重新啟動整個系統。
接著重新啟動 kubelet 以套用新版本:
sudo systemctl restart kubelet
升級完成之後,記得要透過將節點標記為可調度來使節點重新連線:
kubectl uncordon <node-to-uncordon>
本篇文章的升級步驟,適用於使用 kubeadm 建立的 Linux 工作節點。
逐個升級Cluster中的每個工作節點,這樣可以減少升級過程中對應用程式的影響,而不會影響運行工作負載所需的最低容量。
步驟與前面的第二台以後的控制平面節點相同,修改Kubernetes 儲存庫之後進行新版本安裝:
sudo dnf install -y kubeadm-'1.31.x-*'
完成更新之後接著執行下列指令:
sudo kubeadm upgrade node
這會升級對於工作節點本機 kubelet 設定。
成功執行後應該可以看到如下列訊息:
[upgrade] The configuration for this node was successfully updated!
[upgrade] Now you should go ahead and upgrade the kubelet package using your package manager.
在升級每個節點的kubelet 和 kubectl之前,標記該節點為不可調度,並排空該節點上的 Pod,請在控制平面節點上執行此指令:
kubectl drain <node-name> --ignore-daemonsets
如果有遇到因為 Pod 使用本地的儲存,系統會提示你使用--delete-emptydir-data
這個參數
執行以下命令來升級 kubelet 和 kubectl:
sudo dnf install -y kubelet-'1.31.x-*' kubectl-'1.31.x-*'
更新之後記得要重啟服務:
sudo systemctl daemon-reload
sudo systemctl restart kubelet
升級完成後,將節點設置為可調度狀態,請在控制平面節點上執行此指令:
kubectl uncordon <node-name>
kubectl get nodes
本範例中已經正確升級到1.31.0
,並且狀態都已經回到 Ready
NAME STATUS ROLES AGE VERSION
k8s-cp Ready control-plane 13d v1.31.0
k8s-n1 Ready <none> 12d v1.31.0
接著看看是否每個Pod狀態都是正確:
kubectl get pods --all-namespaces
如果以上都沒有問題,到這裡就完成了升級的工作,接著下列工作就看大家的需求來進行了。
測試應用程式:確保所有應用程式正常運行,並且 API 兼容性沒有問題。
監控Cluster:使用 Prometheus 和 Grafana 等工具監控 Cluster 狀態,確保沒有性能問題或異常行為。
使用 kubeadm
進行 Kubernetes Cluster 的升級是一個安全且高效的方法。通過遵循上述步驟,你可以最大限度地減少升級過程中的風險,確保Cluster在升級後仍然穩定運行。定期維護和升級 Kubernetes Cluster 將有助於保持系統的最新性和安全性。
這三十天的 Kubernetes 學習旅程到此結束,你已經掌握了從基礎到進階的關鍵知識。無論是初次接觸還是深化理解,這一系列文章都為你奠定了堅實的基礎,助你在實踐中靈活運用 Kubernetes。未來的挑戰與機遇並存,願你能持續精進,運用所學打造穩定、高效的應用平台。祝你在 Kubernetes 的世界中越走越遠,越做越好!