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 升级流程概览
一个标准的生产级集群升级流程分为四个阶段,每个阶段都有明确的输入和输出。下图展示了从评估到验证的完整链路。
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 检查项,否则禁止执行升级操作。