升級 kubeadm 叢集
本頁說明如何將使用 kubeadm 建立的 Kubernetes 叢集從 1.31.x 版升級到 1.32.x 版,以及從 1.32.x 版升級到 1.32.y 版 (其中 y > x
)。不支援升級時跳過次要版本。如需更多詳細資訊,請造訪版本偏移原則。
若要查看使用舊版 kubeadm 建立的叢集升級相關資訊,請改為參考下列頁面
- 將 kubeadm 叢集從 1.30 升級到 1.31
- 將 kubeadm 叢集從 1.29 升級到 1.30
- 將 kubeadm 叢集從 1.28 升級到 1.29
- 將 kubeadm 叢集從 1.27 升級到 1.28
Kubernetes 專案建議立即升級到最新的修補程式版本,並確保您執行的是 Kubernetes 的支援次要版本。遵循此建議有助於您保持安全。
高階升級工作流程如下
- 升級主要控制平面節點。
- 升級額外的控制平面節點。
- 升級工作節點。
開始之前
- 請務必仔細閱讀發行說明。
- 叢集應使用靜態控制平面和 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 套件儲存庫文件中說明。
apt.kubernetes.io
和 yum.kubernetes.io
) 已於 2023 年 9 月 13 日開始棄用和凍結。強烈建議且必須使用在 pkgs.k8s.io
上託管的新套件儲存庫,才能安裝在 2023 年 9 月 13 日之後發行的 Kubernetes 版本。 已棄用的舊版儲存庫及其內容可能會在未來隨時移除,且不會另行通知。新的套件儲存庫提供從 v1.24.0 開始的 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"
對於第一個控制平面節點
升級 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
驗證下載是否正常運作且具有預期版本
kubeadm version
驗證升級計畫
sudo kubeadm upgrade plan
此命令檢查您的叢集是否可以升級,並提取您可以升級到的版本。它也會顯示一個包含元件組態版本狀態的表格。
注意
kubeadm upgrade
也會自動更新它在此節點上管理的憑證。若要選擇不進行憑證更新,可以使用旗標--certificate-renewal=false
。如需更多資訊,請參閱憑證管理指南。選擇要升級到的版本,然後執行適當的命令。例如
# 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.
注意
對於早於 v1.28 的版本,kubeadm 預設為在kubeadm upgrade apply
期間立即升級附加元件 (包括 CoreDNS 和 kube-proxy) 的模式,無論是否有其他尚未升級的控制平面執行個體。這可能會導致相容性問題。自 v1.28 起,kubeadm 預設為檢查是否所有控制平面執行個體都已升級,然後才開始升級附加元件的模式。您必須循序執行控制平面執行個體升級,或至少確保在所有其他控制平面執行個體完全升級之前,以及在最後一個控制平面執行個體升級後執行附加元件升級之前,不會啟動最後一個控制平面執行個體升級。手動升級您的 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
升級 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
重新啟動 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 升級叢集後,備份目錄/etc/kubernetes/tmp
將保留,並且這些備份檔案將需要手動清除。運作方式
kubeadm upgrade apply
執行以下操作
- 檢查您的叢集是否處於可升級狀態
- API 伺服器可連線
- 所有節點都處於
Ready
狀態 - 控制平面是健康的
- 強制執行版本偏差策略。
- 確保控制平面映像檔可用或可拉取到機器。
- 如果元件組態需要版本升級,則產生替換和/或使用使用者提供的覆寫。
- 升級控制平面元件,或在任何元件無法啟動時回滾。
- 套用新的
CoreDNS
和kube-proxy
manifest 檔案,並確保建立所有必要的 RBAC 規則。 - 建立新的 API 伺服器的憑證和金鑰檔案,並備份即將在 180 天後過期的舊檔案。
kubeadm upgrade node
在額外的控制平面節點上執行以下操作
- 從叢集提取 kubeadm
ClusterConfiguration
。 - 選擇性地備份 kube-apiserver 憑證。
- 升級控制平面元件的靜態 Pod manifest 檔案。
- 升級此節點的 kubelet 組態。
kubeadm upgrade node
在工作節點上執行以下操作
- 從叢集提取 kubeadm
ClusterConfiguration
。 - 升級此節點的 kubelet 組態。