1. Kubernetes集群升级前的关键准备每次Kubernetes集群升级就像给飞机更换引擎——必须在地面做好全面检查才能确保飞行安全。我经历过三次生产环境大版本升级总结出这套避坑检查清单版本兼容性验证是首要任务。Kubernetes官方明确要求只能逐个小版本升级如1.24→1.25禁止跨版本跳跃如1.24→1.26。去年我们有个测试集群尝试从1.23直接升级到1.25结果kube-apiserver持续崩溃最终不得不重建集群。可以通过以下命令验证升级路径kubeadm upgrade plan证书有效期检查最容易被人忽视。曾经有团队升级时发现所有证书只剩7天有效期紧急情况下用这条命令备份了所有证书kubeadm alpha certs check-expiration | grep -E CERTIFICATE|EXPIRES关键数据备份要像对待数据库一样严谨。我习惯用这个组合拳备份etcd和关键配置# etcd备份 ETCDCTL_API3 etcdctl --endpointshttps://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 \ snapshot save /tmp/etcd-snapshot-$(date %Y%m%d).db # 关键配置备份 tar -czvf /tmp/k8s-backup-$(date %Y%m%d).tar.gz \ /etc/kubernetes/ \ /var/lib/kubelet/ \ /var/lib/etcd/工作负载检查需要特别注意有状态服务要确认使用VolumeClaimTemplate关键业务Pod需配置PodDisruptionBudget检查所有Deployment的strategy.type是否为RollingUpdate2. Master节点升级实战步骤2.1 节点隔离(drain)的陷阱处理执行kubectl drain时最常见的两个报错本地存储Pod报错error: cannot delete Pods with local storage (use --delete-emptydir-data to override)解决方案分两种情况测试环境可以直接加--delete-emptydir-data参数生产环境需要手动迁移有状态服务DaemonSet管理Pod报错error: unable to drain node due to DaemonSet-managed Pods必须添加--ignore-daemonsets参数但要注意这可能导致网络插件短暂中断。完整的安全drain命令应该是kubectl drain node-name \ --ignore-daemonsets \ --delete-emptydir-data \ --timeout300s \ --force2.2 kubeadm升级的两种方式在线升级推荐# 替换为具体版本号 yum install -y kubeadm-1.25.4-0 --disableexcludeskubernetes离线升级要点在外网机器下载全量RPM包yum install --downloadonly --downloaddir/tmp/kubeadm-rpms \ kubeadm-1.25.4-0 kubelet-1.25.4-0 kubectl-1.25.4-0 \ --disableexcludeskubernetes传输到内网节点后强制安装rpm -Uvh --force /tmp/kubeadm-rpms/*.rpm2.3 控制平面组件升级技巧先查看升级计划kubeadm upgrade plan选择性升级组件比如跳过etcdkubeadm upgrade apply v1.25.4 --etcd-upgradefalse升级过程中常见问题处理镜像拉取失败手动导入镜像到所有节点证书过期使用kubeadm alpha certs renew all配置冲突检查/var/lib/kubelet/config.yaml3. Worker节点升级的特殊处理Worker节点升级要遵循滚动升级原则从Master节点隔离目标Nodekubectl drain node-01 --ignore-daemonsets在Worker节点执行yum install -y kubelet-1.25.4-0 kubectl-1.25.4-0 kubeadm upgrade node systemctl daemon-reload systemctl restart kubelet恢复节点调度kubectl uncordon node-01批量升级技巧使用Kubectl批量操作for node in $(kubectl get nodes -o name | cut -d/ -f2); do kubectl drain $node --ignore-daemonsets --delete-emptydir-data ssh $node yum install -y kubelet-1.25.4-0 systemctl restart kubelet kubectl uncordon $node done4. 跨版本升级的黄金法则根据官方版本偏差策略必须遵守控制平面版本 ≧ Worker节点版本相邻版本差不超过1多版本升级路线示例当前版本 → 目标版本 升级路径 1.22.x → 1.25.x 1.22 → 1.23 → 1.24 → 1.25 1.24.x → 1.26.x 1.24 → 1.25 → 1.26每次升级后必须验证kubectl get nodes -o wide kubectl get pods -n kube-system kubectl cluster-info5. 升级后的必检清单核心组件状态kubectl get componentstatuses网络连通性测试kubectl run test-nginx --imagenginx --restartNever kubectl exec test-nginx -- curl -I localhost证书有效期复查kubeadm alpha certs check-expiration关键业务验证数据库连接测试服务网格流量检查监控系统指标采集记得升级后一周内密切监控集群状态我曾遇到过升级后第三天突然出现的kube-proxy兼容性问题。现在我的团队每次升级都会保留旧版本YAML文件一旦出现问题可以快速回滚。