备份关键数据
升级前必须备份集群核心数据,确保故障时可快速恢复:
etcdctl snapshot save /var/lib/etcd/backup/snapshot.db \
--endpoints=https://127.0.0.1:2379 \
--cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/etcd/server.crt \
--key=/etc/kubernetes/pki/etcd/server.key
cp /root/.kube/config /root/.kube/config.backup
检查兼容性
更新系统及仓库
sudo yum update -y
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.28/rpm/
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.28/rpm/repodata/repomd.xml.key
EOF
```。
升级kubeadm
kubeadm是升级集群的核心工具,需先升级至目标版本:
sudo yum update -y kubeadm
检查升级计划
通过kubeadm upgrade plan命令查看可升级的版本及所需操作:
sudo kubeadm upgrade plan
输出会显示当前版本、可升级的目标版本及兼容性检查结果。
执行升级
使用kubeadm upgrade apply命令升级Master节点(替换<目标版本>,如v1.28.2):
sudo kubeadm upgrade apply v1.28.2
若提示确认,输入yes继续。升级完成后,手动升级控制平面组件(如kube-apiserver、kube-controller-manager、kube-scheduler):
sudo systemctl restart kube-apiserver kube-controller-manager kube-scheduler
升级kubelet和kubectl
sudo yum update -y kubelet
sudo systemctl daemon-reload
sudo systemctl restart kubelet
sudo yum update -y kubectl
腾空Master节点(可选)
若需在Master节点上执行升级操作,可先将其标记为不可调度并驱逐Pod:
kubectl cordon k8s-master
kubectl drain k8s-master --ignore-daemonsets --force
升级完成后,恢复节点可调度:
kubectl uncordon k8s-master
```。
标记节点为不可调度
避免升级过程中新Pod调度到该节点:
kubectl cordon <节点名称> # 如 kubectl cordon k8s-node01
驱逐节点上的Pod
将节点上的Pod安全驱逐至其他节点(--ignore-daemonsets忽略DaemonSet管理的Pod,--force强制驱逐):
kubectl drain <节点名称> --ignore-daemonsets --force
升级kubelet和kubectl
操作与Master节点一致:
sudo yum update -y kubelet kubectl
sudo systemctl daemon-reload
sudo systemctl restart kubelet
升级节点
使用kubeadm upgrade node命令升级Worker节点(需指定Master节点的Kubeadm版本):
sudo kubeadm upgrade node
恢复节点可调度
升级完成后,允许节点重新接收Pod调度:
kubectl uncordon <节点名称>
```。
检查节点状态
确认所有节点状态为Ready:
kubectl get nodes
检查Pod状态
确保所有Pod正常运行(无Error或CrashLoopBackOff):
kubectl get pods --all-namespaces
检查组件日志
查看Kubernetes组件日志,排查潜在错误:
sudo journalctl -u kubelet -f # 实时查看kubelet日志
sudo journalctl -u kube-apiserver -f # 查看apiserver日志
```。
若升级成功且无问题,可删除旧版本组件以释放空间:
sudo yum remove -y kubeadm-<旧版本> kubelet-<旧版本> kubectl-<旧版本>
```。
#### **注意事项**
- **滚动升级**:对于大型集群,建议逐个升级Worker节点,避免集群资源耗尽。
- **测试环境验证**:生产环境升级前,务必在测试环境模拟升级流程,确认兼容性。
- **监控告警**:升级过程中开启集群监控(如Prometheus),及时发现性能异常或错误。
- **自定义配置**:若集群有自定义配置(如kubelet参数、CNI配置),升级前备份并检查新版本的配置兼容性。