适用场景

K8s 集群最容易出大事的两件事:etcd 没了(集群状态全丢)和证书过期(集群「集体失联」)。这两件事都有标准解法,而且必须提前演练,不能等到出事再查文档。

配置步骤(集群版本升级)

# 升级前检查清单
1) 版本路径:确认当前版本到目标版本的支持路径(必要时逐级)
2) 兼容矩阵:CNI / CSI / Ingress / 运行时版本是否支持目标 K8s 版本
3) 备份:etcd 快照 + 关键 PV 数据备份
4) 业务影响:确认哪些工作负载不支持滚动(如单副本 StatefulSet)
5) 维护窗口:通知业务方,准备回滚方案

# 升级步骤(kubeadm 思路)
控制面 1:apt 安装目标版本 kubeadm -> kubeadm upgrade plan -> apply -> drain -> 升级 kubelet/kubectl -> uncordon
控制面 2、3:重复
工作节点:逐个 drain -> 升级 kubelet -> uncordon
组件:升级 CNI / CSI / Ingress,按官方文档顺序

# 升级后验证
- 节点 Ready、核心 Pod Running
- 新建 Pod 能调度、能挂载存储、能访问外网
- Ingress 域名访问正常

关键参数与建议

  • etcd 备份:定时快照(snapshot save)到外部存储,保留多份并校验
  • 备份验证:定期在测试集群用快照恢复一次,确认可用
  • 升级顺序:先升级控制面(逐个),再升级工作节点,最后升级组件(CNI/CSI/Ingress)
  • 版本跳跃:跨大版本必须按官方支持的路径逐级升级,禁止跨两级
  • 证书:确认 kubelet/API Server 证书有效期,到期前轮换,并纳入监控
  • 回滚:etcd 快照 + 节点镜像保留,明确回滚触发条件
  • 验证:升级后验证 Pod 调度、网络、存储、Ingress 四类功能
  • 文档:升级记录含版本、时间、执行人、问题与回滚点

容易踩的坑

  • 跨版本升级跳级,API 被移除导致组件起不来
  • 只升级控制面,忘了 kubelet 版本要与控制面相差不超过 3 个版本
  • 升级前没 drain,业务 Pod 直接被打断
  • CNI/CSI 没同步升级,网络与存储异常
  • 没做 etcd 备份,升级失败无法回退
  • 升级在生产高峰进行

验证与巡检

kubectl get nodes -o wide
kubectl get pods -A | grep -v -E 'Running|Completed'
kubectl version --short 2>/dev/null | head -4

# 目标:全部节点 Ready、无异常 Pod、版本符合预期、Ingress 域名实测可访问
  • 巡检:节点状态、版本一致性、核心组件健康、升级记录归档

小结

K8s 生命周期验收:etcd 快照可恢复、证书有效期有余量、升级按支持路径执行且四类功能验证通过。

> 说明:文中命令为通用写法,不同型号/版本可能略有差异,落地前请对照设备实际版本的官方文档;带外管理与安全设备变更建议先在测试设备验证。