升級 kubeadm 叢集

本頁說明如何將使用 kubeadm 建立的 Kubernetes 叢集從 1.31.x 版升級到 1.32.x 版,以及從 1.32.x 版升級到 1.32.y 版 (其中 y > x)。不支援升級時跳過次要版本。如需更多詳細資訊,請造訪版本偏移原則

若要查看使用舊版 kubeadm 建立的叢集升級相關資訊,請改為參考下列頁面

Kubernetes 專案建議立即升級到最新的修補程式版本,並確保您執行的是 Kubernetes 的支援次要版本。遵循此建議有助於您保持安全。

高階升級工作流程如下

  1. 升級主要控制平面節點。
  2. 升級額外的控制平面節點。
  3. 升級工作節點。

開始之前

  • 請務必仔細閱讀發行說明
  • 叢集應使用靜態控制平面和 etcd Pod 或外部 etcd。
  • 請務必備份任何重要元件,例如儲存在資料庫中的應用程式層級狀態。kubeadm upgrade 不會觸及您的工作負載,僅觸及 Kubernetes 內部的元件,但備份始終是最佳實務。
  • 必須停用交換空間.

其他資訊

  • 以下指示概述在升級過程中何時排空每個節點。如果您要為任何 kubelet 執行次要版本升級,您必須先排空您要升級的節點。在控制平面節點的情況下,它們可能正在執行 CoreDNS Pod 或其他關鍵工作負載。如需更多資訊,請參閱排空節點
  • Kubernetes 專案建議您比對您的 kubelet 和 kubeadm 版本。您可以改為使用比 kubeadm 舊版本的 kubelet,前提是它在支援的版本範圍內。如需更多詳細資訊,請造訪kubeadm 對 kubelet 的偏移
  • 所有容器在升級後都會重新啟動,因為容器規格雜湊值已變更。
  • 若要驗證 kubelet 服務在 kubelet 升級後是否已成功重新啟動,您可以執行 systemctl status kubelet 或使用 journalctl -xeu kubelet 檢視服務日誌。
  • kubeadm upgrade 支援具有UpgradeConfiguration API 類型--config,可用於設定升級程序。
  • kubeadm upgrade 不支援重新設定現有叢集。請改為遵循重新設定 kubeadm 叢集中的步驟。

升級 etcd 時的考量

由於 kube-apiserver 靜態 Pod 始終在執行 (即使您已排空節點),當您執行包含 etcd 升級的 kubeadm 升級時,對伺服器的進行中請求將在新的 etcd 靜態 Pod 重新啟動時停滯。作為一種解決方法,可以在啟動 kubeadm upgrade apply 命令前幾秒鐘主動停止 kube-apiserver 程序。這允許完成進行中的請求並關閉現有連線,並最大限度地減少 etcd 停機的後果。這可以在控制平面節點上按如下方式完成

killall -s SIGTERM kube-apiserver # trigger a graceful kube-apiserver shutdown
sleep 20 # wait a little bit to permit completing in-flight requests
kubeadm upgrade ... # execute a kubeadm upgrade command

變更套件儲存庫

如果您使用社群擁有的套件儲存庫 (pkgs.k8s.io),您需要為所需的 Kubernetes 次要版本啟用套件儲存庫。這在變更 Kubernetes 套件儲存庫文件中說明。

判斷要升級到的版本

使用作業系統套件管理器尋找 Kubernetes 1.32 的最新修補程式版本

# Find the latest 1.32 version in the list.
# It should look like 1.32.x-*, where x is the latest patch.
sudo apt update
sudo apt-cache madison kubeadm

# Find the latest 1.32 version in the list.
# It should look like 1.32.x-*, where x is the latest patch.
sudo yum list --showduplicates kubeadm --disableexcludes=kubernetes

升級控制平面節點

控制平面節點上的升級程序應一次執行一個節點。挑選您要先升級的控制平面節點。它必須具有 /etc/kubernetes/admin.conf 檔案。

呼叫 "kubeadm upgrade"

對於第一個控制平面節點

  1. 升級 kubeadm

    # replace x in 1.32.x-* with the latest patch version
    sudo apt-mark unhold kubeadm && \
    sudo apt-get update && sudo apt-get install -y kubeadm='1.32.x-*' && \
    sudo apt-mark hold kubeadm
    

    # replace x in 1.32.x-* with the latest patch version
    sudo yum install -y kubeadm-'1.32.x-*' --disableexcludes=kubernetes
    
  2. 驗證下載是否正常運作且具有預期版本

    kubeadm version
    
  3. 驗證升級計畫

    sudo kubeadm upgrade plan
    

    此命令檢查您的叢集是否可以升級,並提取您可以升級到的版本。它也會顯示一個包含元件組態版本狀態的表格。

  4. 選擇要升級到的版本,然後執行適當的命令。例如

    # replace x with the patch version you picked for this upgrade
    sudo kubeadm upgrade apply v1.32.x
    

    命令完成後,您應該會看到

    [upgrade/successful] SUCCESS! Your cluster was upgraded to "v1.32.x". Enjoy!
    
    [upgrade/kubelet] Now that your control plane is upgraded, please proceed with upgrading your kubelets if you haven't already done so.
    
  5. 手動升級您的 CNI 提供者外掛程式。

    您的容器網路介面 (CNI) 提供者可能會有自己的升級指示要遵循。查看附加元件頁面,尋找您的 CNI 提供者,並查看是否需要其他升級步驟。

    如果 CNI 提供者以 DaemonSet 形式執行,則在額外的控制平面節點上不需要此步驟。

對於其他控制平面節點

與第一個控制平面節點相同,但使用

sudo kubeadm upgrade node

而不是

sudo kubeadm upgrade apply

也不再需要呼叫 kubeadm upgrade plan 和升級 CNI 提供者外掛程式。

排空節點

透過將節點標記為不可排程並驅逐工作負載,為維護準備節點

# replace <node-to-drain> with the name of your node you are draining
kubectl drain <node-to-drain> --ignore-daemonsets

升級 kubelet 和 kubectl

  1. 升級 kubelet 和 kubectl

    # replace x in 1.32.x-* with the latest patch version
    sudo apt-mark unhold kubelet kubectl && \
    sudo apt-get update && sudo apt-get install -y kubelet='1.32.x-*' kubectl='1.32.x-*' && \
    sudo apt-mark hold kubelet kubectl
    

    # replace x in 1.32.x-* with the latest patch version
    sudo yum install -y kubelet-'1.32.x-*' kubectl-'1.32.x-*' --disableexcludes=kubernetes
    
  2. 重新啟動 kubelet

    sudo systemctl daemon-reload
    sudo systemctl restart kubelet
    

取消封鎖節點

透過將節點標記為可排程,將節點恢復上線

# replace <node-to-uncordon> with the name of your node
kubectl uncordon <node-to-uncordon>

升級工作節點

工作節點上的升級程序應一次執行一個節點或少量節點,而不會影響執行工作負載所需的最低容量。

以下頁面說明如何升級 Linux 和 Windows 工作節點

驗證叢集的狀態

在所有節點上升級 kubelet 後,透過從任何 kubectl 可以存取叢集的地方執行以下命令,驗證所有節點是否再次可用

kubectl get nodes

STATUS 欄應為所有節點顯示 Ready,並且版本號碼應已更新。

從失敗狀態中恢復

如果 kubeadm upgrade 失敗且未回滾,例如由於執行期間發生意外關機,您可以再次執行 kubeadm upgrade。此命令是冪等的,並最終確保實際狀態是您宣告的所需狀態。

若要從錯誤狀態中恢復,您也可以執行 sudo kubeadm upgrade apply --force,而無需變更叢集正在執行的版本。

在升級期間,kubeadm 會在 /etc/kubernetes/tmp 下寫入以下備份資料夾

  • kubeadm-backup-etcd-<date>-<time>
  • kubeadm-backup-manifests-<date>-<time>

kubeadm-backup-etcd 包含此控制平面節點的本機 etcd 成員資料的備份。如果 etcd 升級失敗且自動回滾不起作用,則可以將此資料夾的內容手動還原到 /var/lib/etcd 中。如果使用外部 etcd,則此備份資料夾將為空。

kubeadm-backup-manifests 包含此控制平面節點的靜態 Pod manifest 檔案的備份。如果升級失敗且自動回滾不起作用,則可以將此資料夾的內容手動還原到 /etc/kubernetes/manifests 中。如果由於某些原因,特定元件的升級前和升級後 manifest 檔案之間沒有差異,則不會為其寫入備份檔案。

運作方式

kubeadm upgrade apply 執行以下操作

  • 檢查您的叢集是否處於可升級狀態
    • API 伺服器可連線
    • 所有節點都處於 Ready 狀態
    • 控制平面是健康的
  • 強制執行版本偏差策略。
  • 確保控制平面映像檔可用或可拉取到機器。
  • 如果元件組態需要版本升級,則產生替換和/或使用使用者提供的覆寫。
  • 升級控制平面元件,或在任何元件無法啟動時回滾。
  • 套用新的 CoreDNSkube-proxy manifest 檔案,並確保建立所有必要的 RBAC 規則。
  • 建立新的 API 伺服器的憑證和金鑰檔案,並備份即將在 180 天後過期的舊檔案。

kubeadm upgrade node 在額外的控制平面節點上執行以下操作

  • 從叢集提取 kubeadm ClusterConfiguration
  • 選擇性地備份 kube-apiserver 憑證。
  • 升級控制平面元件的靜態 Pod manifest 檔案。
  • 升級此節點的 kubelet 組態。

kubeadm upgrade node 在工作節點上執行以下操作

  • 從叢集提取 kubeadm ClusterConfiguration
  • 升級此節點的 kubelet 組態。
上次修改時間:2024 年 9 月 27 日上午 10:28 PST:Redo advice about cluster upgrades (e3c1c5b8b8)