CentOS环境下Kubernetes集群升级至最新版本指南
备份核心数据
升级前必须备份集群关键数据,确保故障时可快速恢复:
etcdctl snapshot save /var/lib/etcd/backup/snapshot.db;cp /root/.kube/config /root/.kube/config.backup;tar -czvf k8s-config-backup.tar.gz /etc/kubernetes。检查当前集群状态
确保集群处于健康状态,避免带病升级:
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)。确认升级路径
Kubernetes不支持跨多个次要版本跳跃升级(如1.23→1.25),必须遵循“相邻次要版本递进”规则(如1.23→1.24→1.25)。通过kubectl version --short查看当前版本,在官方升级文档中确认目标版本的兼容性。
检查组件兼容性
确保周边组件与目标K8s版本兼容:
(1)升级kubeadm工具
在Master节点上,使用yum安装最新版本的kubeadm(需提前配置kubernetes官方repo):
sudo yum update -y kubeadm --disableexcludes=kubernetes
验证kubeadm版本:kubeadm version(需显示为目标版本,如1.29.0)。
(2)检查升级计划
运行kubeadm upgrade plan命令,查看集群可升级到的版本及需要升级的组件:
sudo kubeadm upgrade plan
输出会提示当前版本、可升级的目标版本(如Recommended version: v1.29.0)及需要升级的控制平面组件(kube-apiserver、kube-controller-manager等)。
(3)执行控制平面升级
使用kubeadm upgrade apply命令升级控制平面组件:
sudo kubeadm upgrade apply v<target-version>
例如升级到1.29.0:sudo kubeadm upgrade apply v1.29.0。命令会自动下载并安装新版本的kube-apiserver、kube-controller-manager、kube-scheduler等组件。
(4)升级kubelet和kubectl
在Master节点上升级kubelet和kubectl:
sudo yum install -y kubelet-<target-version> kubectl-<target-version> --disableexcludes=kubernetes
sudo systemctl daemon-reload
sudo systemctl restart kubelet
验证版本:kubelet --version、kubectl version --short(需显示为目标版本)。
(5)解除Master节点保护
升级完成后,将Master节点标记为可调度,恢复其承载Pod的能力:
kubectl uncordon <master-node-name>
例如:kubectl uncordon k8s-master。
(1)逐个升级Worker节点
为避免集群中断,每次仅升级1个Worker节点,重复以下步骤直至所有节点升级完成。
(2)腾空节点
将节点标记为不可调度,并驱逐所有Pod(Pod会被自动调度到其他节点):
kubectl drain <worker-node-name> --ignore-daemonsets --delete-emptydir-data
例如:kubectl drain k8s-node1。
(3)升级kubeadm
在Worker节点上安装与Master节点相同版本的kubeadm:
sudo yum install -y kubeadm-<target-version> --disableexcludes=kubernetes
验证kubeadm版本:kubeadm version。
(4)升级kubelet和kubectl
同Master节点步骤,升级kubelet和kubectl并重启服务:
sudo yum install -y kubelet-<target-version> kubectl-<target-version> --disableexcludes=kubernetes
sudo systemctl daemon-reload
sudo systemctl restart kubelet
验证版本:kubelet --version、kubectl version --short。
(5)加入集群
使用kubeadm upgrade node命令将节点升级到目标版本,并重新加入集群:
sudo kubeadm upgrade node
sudo systemctl restart kubelet
升级完成后,节点会自动同步新版本的组件。
(6)恢复节点调度
将节点标记为可调度:
kubectl uncordon <worker-node-name>
例如:kubectl uncordon k8s-node1。
检查集群状态
确认所有节点状态为Ready:kubectl get nodes -o wide;
确认所有Pod状态为Running:kubectl get pods --all-namespaces --field-selector status.phase=Running。
验证组件版本
检查控制平面组件版本:kubectl version --short(需显示为目标版本);
检查kubelet版本:ssh <node-name> "kubelet --version"(所有节点需一致)。
检查业务应用
确认业务Pod正常运行:kubectl get pods -n <namespace>;
检查应用日志:kubectl logs <pod-name> -n <namespace>;
验证应用功能(如访问Ingress、数据库连接等)。
kubeadm upgrade revert命令回退到上一版本,并恢复etcd备份数据;