Ubuntu系统下Kubernetes版本升级指南(基于kubeadm部署)
kubectl version查看当前集群版本,在官方升级文档中确认目标版本的兼容性。kubectl get pods -n kube-system -l component=kube-apiserver(API Server)、-l component=etcd(Etcd)、-l component=kube-controller-manager(Controller Manager)、-l component=kube-scheduler(Scheduler),确认所有Pod状态为Running。kubectl get nodes,确认所有节点状态为Ready。kubectl get pods --all-namespaces --field-selector status.phase!=Running,确认无CrashLoopBackOff、Error等异常状态的Pod。sudo kubeadm etcd snapshot create --config /etc/kubernetes/admin.conf。sudo cp -r /etc/kubernetes /etc/kubernetes.bak。kubeadm、kubelet、kubectl版本与当前集群版本一致(可通过apt-mark hold kubeadm kubelet kubectl锁定版本,避免自动升级)。/etc/apt/sources.list.d/kubernetes.list文件,内容为deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.29/deb/ /,并导入GPG密钥。控制平面是集群核心,需优先升级,且每次仅升级一个控制平面节点(若有高可用集群)。
升级kubeadm工具
解锁kubeadm包(若之前锁定),安装目标版本,再锁定:
sudo apt-mark unhold kubeadm
sudo apt update
sudo apt install -y kubeadm=1.29.2-1.1 # 替换为目标版本(如1.29.2)
sudo apt-mark hold kubeadm
验证kubeadm版本:kubeadm version。
检查升级计划
运行kubeadm upgrade plan,查看集群是否可升级及推荐目标版本(如v1.29.2),并确认配置文件是否需要更新。
应用升级
执行升级命令(以目标版本v1.29.2为例):
sudo kubeadm upgrade apply v1.29.2 --etcd-upgrade=false # 若etcd为外部部署,添加--etcd-upgrade=false
根据提示确认升级(输入yes),等待命令执行完成。
升级控制平面组件配置
升级完成后,更新控制平面组件(kube-apiserver、kube-controller-manager、kube-scheduler)的配置:
sudo kubeadm upgrade node config --kubelet-version $(kubelet --version | cut -d ' ' -f 2)
sudo systemctl restart kubelet
工作节点升级需逐个进行(或分批,确保剩余节点能承载业务流量),避免全量升级导致业务中断。
腾空节点
将节点标记为不可调度并驱逐所有Pod(避免升级过程中Pod被调度到该节点):
kubectl drain <node-name> --ignore-daemonsets --force # 替换<node-name>为目标节点名称
升级完成后,解除节点保护(允许Pod重新调度):
kubectl uncordon <node-name>
升级kubelet和kubectl
在工作节点上执行与Master节点相同的步骤,升级kubelet和kubectl:
sudo apt-mark unhold kubelet kubectl
sudo apt update
sudo apt install -y kubelet=1.29.2-1.1 kubectl=1.29.2-1.1 # 替换为目标版本
sudo apt-mark hold kubelet kubectl
sudo systemctl daemon-reload
sudo systemctl restart kubelet
升级节点本身
在Master节点上执行kubeadm upgrade node,将工作节点升级到目标版本:
sudo kubeadm upgrade node
升级完成后,kubectl get nodes会显示节点状态为Ready,且版本号更新为目标版本。
kubectl get nodes,确认所有节点状态为Ready,且版本号均更新为目标版本。kubectl get pods --all-namespaces,确认所有Pod状态为Running,无异常状态。kubeadm、kubelet、kubectl版本一致,且与集群版本匹配(如kubectl版本需与集群版本相差不超过1个次要版本)。kubeadm upgrade revert回退到上一个版本,并恢复etcd备份数据。