4. 升级前检查:节点健康检查、Pod调度状态、存储与网络插件兼容性
滚动升级节点池前,必须完成三项前置检查:节点健康、Pod调度状态、存储与网络插件兼容性。跳过任何一项都可能导致升级中断或业务受损。以下按检查顺序展开。
4.1 节点健康检查
使用 kubectl get nodes 确认所有节点处于 Ready 状态,并检查内核日志与kubelet状态。
| 检查项 | 命令/方法 | 预期结果 |
|---|---|---|
| 节点状态 | kubectl get nodes -o wide | STATUS 列均为 Ready |
| kubelet 健康 | systemctl status kubelet | active (running) |
| 内核日志错误 | dmesg -T | grep -i error | 无硬件/存储/网络错误 |
| 磁盘使用率 | df -h | /var/lib/docker 或 /var/lib/containerd 使用率 < 80% |
| 内存/CPU 余量 | free -m; top -bn1 | 可用内存 > 20%,CPU idle > 30% |
⚠️ 常见隐患: 节点虽然 Ready,但 kubelet 持续报 OOM 或磁盘压力。务必在升级前修复,否则升级过程中节点可能直接 NotReady。
4.2 Pod调度状态检查
升级会逐台封锁(cordon)并驱逐(drain)节点,必须确保集群内剩余资源能承载被驱逐的Pod。
- 检查不可调度Pod:
kubectl get pods --all-namespaces -o wide | grep -v Running,确认无 Pending/Error/CrashLoopBackOff 的Pod。 - 检查Pod分布:
kubectl get pods -o wide --all-namespaces | awk '{print $8}' | sort | uniq -c,避免单节点集中过多Pod。 - 检查PDB(PodDisruptionBudget):
kubectl get pdb --all-namespaces,确保关键应用配置了minAvailable或maxUnavailable,防止驱逐时中断。 - 模拟驱逐:
kubectl drain <node> --dry-run=server --ignore-daemonsets --delete-emptydir-data,提前暴露冲突。
💡 最佳实践: 升级前执行
kubectl top nodes 查看资源水位。若某节点 CPU 请求超过 85%,建议先手动疏散部分Pod,避免驱逐时雪崩。
4.3 存储与网络插件兼容性
存储插件(CSI)和网络插件(CNI)的版本必须与目标 Kubernetes 版本匹配。不兼容会导致 Pod 挂载卷失败或网络不通。
4.3.1 存储插件兼容性矩阵
| 存储插件 | 当前版本 | 目标K8s版本 | 兼容性 | 操作建议 |
|---|---|---|---|---|
| vSphere CSI | 2.7.x | 1.28 | ✅ 兼容 | 无需升级 |
| Azure Disk CSI | 1.28.x | 1.29 | ✅ 兼容 | 无需升级 |
| Amazon EBS CSI | 1.20.x | 1.28 | ⚠️ 需升级 | 升级至 1.25+ |
| Ceph-CSI (RBD) | 3.9.x | 1.29 | ❌ 不兼容 | 升级至 3.11+ |
4.3.2 网络插件兼容性矩阵
| 网络插件 | 当前版本 | 目标K8s版本 | 兼容性 | 操作建议 |
|---|---|---|---|---|
| Calico | 3.26.x | 1.28 | ✅ 兼容 | 无需升级 |
| Cilium | 1.14.x | 1.29 | ✅ 兼容 | 无需升级 |
| Flannel | 0.22.x | 1.28 | ⚠️ 需升级 | 升级至 0.24+ |
| Weave Net | 2.8.x | 1.29 | ❌ 不兼容 | 迁移至 Cilium 或 Calico |
🔍 验证方法: 在测试环境执行
kubectl apply -f test-pod.yaml(含 PVC 和 Service),确认 Pod 启动后网络连通且卷挂载正常。再执行 kubectl exec 写入文件验证持久化。
4.4 升级前检查流程图
以下SVG展示了从节点健康检查到存储网络兼容性验证的完整流程,帮助运维人员按序执行。
4.5 检查清单速查表
将以下清单打印或粘贴至运维手册,逐项打勾确认。
| 序号 | 检查项 | 命令/参考 | 状态 |
|---|---|---|---|
| 1 | 所有节点 Ready | kubectl get nodes | ✅ / ❌ |
| 2 | kubelet 运行正常 | systemctl status kubelet | ✅ / ❌ |
| 3 | 磁盘使用率 < 80% | df -h | ✅ / ❌ |
| 4 | 无 Pending/Error Pod | kubectl get pods -A | grep -v Running | ✅ / ❌ |
| 5 | PDB 已配置 | kubectl get pdb -A | ✅ / ❌ |
| 6 | 驱逐模拟无报错 | kubectl drain <node> --dry-run=server | ✅ / ❌ |
| 7 | 存储插件版本兼容 | 对照兼容性矩阵 | ✅ / ❌ |
| 8 | 网络插件版本兼容 | 对照兼容性矩阵 | ✅ / ❌ |
| 9 | 测试Pod启动正常 | kubectl apply -f test-pod.yaml | ✅ / ❌ |
🚨 强制要求: 清单中任意一项为 ❌,禁止 执行滚动升级。必须先修复问题,重新检查全部通过后再操作。