在Ubuntu上升級Kubernetes集群(以kubeadm部署為例)
升級Kubernetes集群需遵循“前置檢查→控制平面升級→工作節點升級→驗證”的流程,確保業務連續性與版本兼容性。以下是詳細步驟:
升級前必須備份etcd數據(集群狀態核心存儲),防止數據丟失。使用etcdctl命令創建快照:
ETCDCTL_API=3 etcdctl snapshot save /opt/kubernetes/backup/etcd_snapshot_$(date +%F).db \
--endpoints=https://127.0.0.1:2379 \
--cert=/etc/kubernetes/pki/etcd/server.crt \
--key=/etc/kubernetes/pki/etcd/server.key \
--cacert=/etc/kubernetes/pki/etcd/ca.crt
確認快照文件生成(ls /opt/kubernetes/backup/),并存放在安全位置。
kubectl version --short獲取集群版本(如v1.24.6)。v1.24→v1.26),必須按相鄰次要版本遞進(如v1.24→v1.25→v1.26)。確保集群無故障,避免升級失?。?/p>
kubectl get pods -n kube-system -l component=kube-apiserver(需Running狀態)。kubectl get nodes(所有節點需為Ready)。kubectl get pods --all-namespaces --field-selector=status.phase!=Running(無CrashLoopBackOff或Error狀態的Pod)。控制平面是集群核心,需優先升級。假設當前版本為v1.24.6,目標版本為v1.25.3:
kubeadm是升級控制平面的關鍵工具,需先升級到目標版本:
sudo apt update
sudo apt-mark unhold kubeadm # 解除版本鎖定(若之前鎖定)
sudo apt install -y kubeadm=1.25.3-00 # 安裝目標版本
sudo apt-mark hold kubeadm # 鎖定版本,防止誤升級
通過kubeadm upgrade plan查看可升級版本及所需操作:
sudo kubeadm upgrade plan
輸出會顯示當前版本、可升級的目標版本(如v1.25.3)及需要升級的組件(如kube-apiserver、kube-controller-manager)。
根據kubeadm upgrade plan的輸出,執行升級命令(替換為目標版本):
sudo kubeadm upgrade apply v1.25.3
yes確認升級。升級控制平面后,需更新kubelet配置以適配新版本:
sudo kubeadm upgrade node config --kubelet-version $(kubelet --version | cut -d ' ' -f 2)
sudo systemctl restart kubelet # 重啟kubelet使配置生效
工作節點負責運行Pod,需在控制平面升級完成后逐個升級:
在工作節點上升級kubeadm到目標版本(與控制平面一致):
sudo apt update
sudo apt-mark unhold kubeadm
sudo apt install -y kubeadm=1.25.3-00
sudo apt-mark hold kubeadm
使用kubeadm upgrade node命令將節點升級到目標版本:
sudo kubeadm upgrade node
升級節點上的kubelet到目標版本:
sudo apt install -y kubelet=1.25.3-00
sudo systemctl daemon-reload
sudo systemctl restart kubelet
舊版本集群升級時,節點會自動添加node.kubernetes.io/upgrade:NoSchedule污點,阻止Pod調度。升級完成后可移除:
kubectl taint nodes <node-name> node.kubernetes.io/upgrade:NoSchedule-
(<node-name>為節點名稱,可通過kubectl get nodes獲?。?/p>
升級完成后,需驗證集群狀態是否正常:
kubectl get nodes
所有節點應顯示為Ready狀態。
kubectl get pods --all-namespaces
所有Pod應處于Running或Completed狀態(無Error或CrashLoopBackOff)。
訪問集群內的應用(如通過Ingress或NodePort),確認業務正常運行。
kubeadm upgrade revert回滾到上一個版本,或使用etcd快照恢復數據。