iT邦幫忙

2024 iThome 鐵人賽

DAY 30
0
Kubernetes

Kubernetes三十天就上手系列 第 30

Day 30- 使用 kubeadm 進行 Cluster 升級與維護

  • 分享至 

  • xImage
  •  

使用 kubeadm 進行 Cluster 升級與維護

如何安全地升級和維護 Kubernetes Cluster

Kubernetes 的升級和維護對於保持 Cluster 的安全性和穩定性相當重要。使用 kubeadm 來管理 Kubernetes Cluster 的升級過程,可以幫助你順利進行版本更新。kubeadm 提供了一個相對簡單和可靠的方法來升級 Kubernetes 控制平面和節點,同時最大限度地減少對運行中工作負載的影響。以下是使用 kubeadm 進行 Kubernetes Cluster 升級和維護的詳細步驟。

升級前的準備工作

a. 檢查當前 Kubernetes 版本

首先,檢查當前 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.31,那麼 1.29、1.30 和 1.31 都會得到支援。確保你升級到的版本在支援範圍內。

b. 確認版本相容性

Kubernetes 建議每次只升級一個次版本(例如從 1.30 升級到 1.31),而不是直接跳過多個版本。請檢查升級指南和發行說明,以了解版本相容性和升級過程中可能遇到的 API 變更。

c. 備份 etcd 和 Cluster 設定

kubeadm upgrade不會影響您的工作負載,只會影響 Kubernetes 內部的元件,但備份就像是買保險,最好期望用不到,但是又不能沒有買。
升級前務必備份 etcd 資料庫和 Cluster 設定。這樣即使在升級過程中出現問題,你仍然可以恢復到升級前的狀態。

使用 kubeadm 進行 Cluster 升級

a. 設定 Kubernetes 的套件儲存庫

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

b. 升級控制平面

升級 kubeadm

首先,升級 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即可。

升級 kubelet 和 kubectl 的先前準備

透過將節點標記為不可調度並逐出工作負載來準備節點以進行維護:

kubectl drain <node-to-drain> --ignore-daemonsets

上列指令中,請將 <node-to-drain> 替換為要排出的節點的名稱。

升級 kubelet

在控制平面成功升級後,繼續升級 kubelet:

sudo dnf install -y kubelet-'1.31.x-*'

升級 kubectl

升級 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>

c. 升級工作節點

本篇文章的升級步驟,適用於使用 kubeadm 建立的 Linux 工作節點。

逐個節點升級

逐個升級Cluster中的每個工作節點,這樣可以減少升級過程中對應用程式的影響,而不會影響運行工作負載所需的最低容量。

升級 kubeadm

步驟與前面的第二台以後的控制平面節點相同,修改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 升級

執行以下命令來升級 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>

升級後的驗證

  • 檢查Cluster狀態:使用以下命令檢查 Cluster 狀態,確保所有節點和 Pod 正常運行。
    首先檢查一下節點,確認節點都正常運作中:
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 狀態,確保沒有性能問題或異常行為。

定期維護和升級

  • 計劃升級:根據 Kubernetes 的版本發佈計劃,定期檢查和計劃升級,以保持 Cluster 的安全性和穩定性。

總結

使用 kubeadm 進行 Kubernetes Cluster 的升級是一個安全且高效的方法。通過遵循上述步驟,你可以最大限度地減少升級過程中的風險,確保Cluster在升級後仍然穩定運行。定期維護和升級 Kubernetes Cluster 將有助於保持系統的最新性和安全性。

這三十天的 Kubernetes 學習旅程到此結束,你已經掌握了從基礎到進階的關鍵知識。無論是初次接觸還是深化理解,這一系列文章都為你奠定了堅實的基礎,助你在實踐中靈活運用 Kubernetes。未來的挑戰與機遇並存,願你能持續精進,運用所學打造穩定、高效的應用平台。祝你在 Kubernetes 的世界中越走越遠,越做越好!


上一篇
Day 29- 使用 Kubernetes Dashboard 圖形介面管理 Cluster
系列文
Kubernetes三十天就上手30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言