2. Kubernetes 集群升级基础:版本策略、升级流程概览、升级前检查清单

2.1 版本策略与语义化版本

Kubernetes 遵循 语义化版本(SemVer) 规范,版本号格式为 vMAJOR.MINOR.PATCH。理解版本号的构成是制定升级策略的第一步。

版本段 示例 变更含义 升级影响
MAJOR v1 → v2 不兼容的 API 变更或重大架构重构 需全面测试,通常涉及大规模迁移
MINOR v1.27 → v1.28 新增功能、特性门控(Feature Gate)变更 需关注弃用 API 和默认行为变化
PATCH v1.28.1 → v1.28.3 安全修复、Bug 修复 风险最低,建议尽快应用
关键原则:Kubernetes 官方仅支持最近三个 MINOR 版本(例如 v1.28、v1.27、v1.26)。升级时必须遵循 逐次升级 原则,禁止跨大版本升级(如 v1.24 → v1.28),否则可能导致控制平面与 kubelet 版本不兼容。

2.2 升级流程概览

一个标准的生产级集群升级流程分为四个阶段,每个阶段都有明确的输入和输出。下图展示了从评估到验证的完整链路。

Kubernetes 集群升级四阶段流程 阶段 1:评估与规划 版本差异分析 容量与兼容性检查 阶段 2:备份与快照 etcd 全量备份 节点与 PV 快照 阶段 3:执行升级 控制平面 → 节点 分批滚动升级 阶段 4 验证 回滚路径(基于备份恢复) 控制平面升级子步骤 1. 升级 kube-apiserver 2. 升级 kube-controller-manager 3. 升级 kube-scheduler 工作节点升级子步骤 1. 节点排水(drain) 2. 升级 kubelet & kube-proxy 3. 节点恢复调度(uncordon) 说明:升级顺序必须严格遵循 控制平面 → 工作节点,且每个节点升级前需完成排水与备份。

2.3 升级前检查清单

以下清单覆盖了升级前必须完成的检查项,建议以表格形式逐项确认并签字。

检查类别 检查项 验证方法 / 工具 严重等级
版本兼容性 确认当前集群版本与目标版本之间的 CHANGELOG kubectl version + 官方 Release Notes P0
检查目标版本中已弃用(Deprecated)的 API 版本 kubectl convert / pluto 工具扫描 P0
验证第三方组件(CNI、CSI、Ingress Controller)的兼容性 查阅各项目兼容性矩阵 P0
数据备份 etcd 全量快照(必须离线或使用 etcdctl snapshot save) etcdctl snapshot status 验证快照完整性 P0
关键 PV 数据与应用配置的备份 Velero / 存储后端快照 P1
集群健康 所有节点状态为 Ready,无异常 Pod 处于 CrashLoopBackOff kubectl get nodes / kubectl get pods -A P0
控制平面组件健康(etcd 集群、apiserver、scheduler、controller-manager) kubectl get componentstatuses / etcd 健康检查端点 P0
容量与资源 节点资源余量(CPU、内存、磁盘)满足升级过程中 Pod 迁移需求 kubectl top nodes / Prometheus 指标 P1
确保有足够的节点用于排水后的 Pod 重调度 计算集群总可分配资源 vs 当前请求量 P1
安全策略 确认 Kyverno / OPA 等策略引擎规则与目标版本兼容 策略模拟模式(dry-run)测试 P1
⚠️ 常见陷阱:
  • 跳过 PATCH 版本:即使只升级 PATCH 版本,也建议先查阅 Release Notes,因为某些 PATCH 版本可能包含安全修复导致的默认行为变更。
  • 忽略 kubelet 版本偏差:kubelet 版本不能高于 kube-apiserver 版本,且最多只能低两个 MINOR 版本。
  • 未验证自定义调度器与 Webhook:升级后可能导致 Admission Webhook 证书失效或调度策略不兼容。

2.4 升级前检查命令速查

以下命令可在升级前快速收集集群状态,建议将其集成到自动化脚本中。

# 1. 检查当前版本与节点状态
kubectl version --short
kubectl get nodes -o wide

# 2. 检查所有命名空间中异常 Pod
kubectl get pods -A --field-selector status.phase!=Running,status.phase!=Succeeded

# 3. 检查 API 资源弃用情况(需安装 pluto)
pluto detect-all-in-cluster

# 4. 检查 etcd 集群健康
ETCDCTL_API=3 etcdctl --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 \
  endpoint health

# 5. 检查节点资源使用率
kubectl top nodes

# 6. 检查 PodDisruptionBudget 是否合理配置
kubectl get pdb -A
💡 最佳实践:将上述检查命令封装为一个 preflight-check.sh 脚本,输出 JSON 格式报告,并集成到 CI/CD 流水线中。每次升级前必须通过该脚本的 全部 P0 检查项,否则禁止执行升级操作。